From b1515b170941e439505fc4f3079a5ec3ecf6bb66 Mon Sep 17 00:00:00 2001 From: esthedebeste <57283066+esthedebeste@users.noreply.github.com> Date: Mon, 18 Sep 2023 23:36:30 +0200 Subject: [PATCH] 2.0.0 - Candy - Improve syntax - Change text nodes from [...] to "...", '...', and [>...] to `${...}` - Change attributes from value=>"1 + 2" to value=(1 + 2), or for example value=`${1 + 2}`, value=[1, 2] - Remove the dynamic <> block and instead allow `for`, `if`, and `else` in child {} blocks - Template definitions are now permitted outside of the toplevel, and are declared with $$name(props){children} instead of $name(props){children} - Add // line comments - Use deno instead of node - Use esbuild with bundling and minification instead of tsc for js output - (internal, perf) use a Reader class instead of constantly creating new { result, pos } objects - fix html escaping - more eslint - start test and bench infrastructure a little bit --- .eslintrc.json | 34 +- .gitignore | 4 +- .npmignore | 7 - .prettierrc | 7 - .vscode/launch.json | 25 + .vscode/settings.json | 6 +- .vscode/snippets.code-snippets | 17 - deno.jsonc | 16 + deno.lock | 2052 ++++++++++++++++++++++++++++++++ esbuild.ts | 12 + package.json | 45 +- readme.md | 202 ++-- src/element.ts | 252 ++-- src/nodes.ts | 240 ++-- src/poggies.ts | 127 +- src/reader.ts | 103 ++ src/templating.ts | 79 +- src/utils.ts | 81 +- test/bench.ts | 15 + test/reader.test.ts | 50 + test/render-input.ts | 73 +- test/test.pog | 81 +- test/test.ts | 69 -- test/tsconfig.json | 13 - test/utils.ts | 40 + tsconfig.json | 16 +- 26 files changed, 2983 insertions(+), 683 deletions(-) delete mode 100644 .npmignore delete mode 100644 .prettierrc create mode 100644 .vscode/launch.json delete mode 100644 .vscode/snippets.code-snippets create mode 100644 deno.jsonc create mode 100644 deno.lock create mode 100644 esbuild.ts create mode 100644 src/reader.ts create mode 100644 test/bench.ts create mode 100644 test/reader.test.ts delete mode 100644 test/test.ts delete mode 100644 test/tsconfig.json create mode 100644 test/utils.ts diff --git a/.eslintrc.json b/.eslintrc.json index 2118fab..fa8e647 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,7 +1,4 @@ { - "env": { - "node": true - }, "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended", @@ -10,30 +7,19 @@ ], "parser": "@typescript-eslint/parser", "parserOptions": { - "ecmaVersion": 10, + "ecmaVersion": 2022, "sourceType": "module" }, "plugins": ["@typescript-eslint", "unicorn"], "rules": { - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-empty-function": "off", - "unicorn/escape-case": "off", - "unicorn/no-hex-escape": "off", - "unicorn/prevent-abbreviations": "off", - "unicorn/numeric-separators-style": "off", - "unicorn/no-null": "off", - "unicorn/prefer-code-point": "off", - "unicorn/no-array-callback-reference": "off", - "no-fallthrough": "off" - }, - "root": true, - "overrides": [ - { - "files": ["*.js"], - "env": { - "browser": true + "@typescript-eslint/ban-ts-comment": [ + "error", + { + "ts-expect-error": "allow-with-description", + "ts-ignore": "allow-with-description", + "minimumDescriptionLength": 3 } - } - ] + ] + }, + "root": true } diff --git a/.gitignore b/.gitignore index 4b273a4..76add87 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ -test/output node_modules -dist -package-lock.json \ No newline at end of file +dist \ No newline at end of file diff --git a/.npmignore b/.npmignore deleted file mode 100644 index b336d64..0000000 --- a/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -# https://github.com/tbhmens/poggies -.github -test -.prettierrc -.gitignore -README.md -.vscode \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 8e53138..0000000 --- a/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "arrowParens": "avoid", - "tabWidth": 2, - "quoteProps": "as-needed", - "semi": true, - "useTabs": true -} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..5428df3 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "request": "launch", + "name": "Launch render-input.ts", + "type": "node", + "program": "${workspaceFolder}/test/render-input.ts", + "cwd": "${workspaceFolder}", + "runtimeExecutable": "deno", + "runtimeArgs": ["run", "--inspect-wait", "-A"], + "attachSimplePort": 9229 + }, + { + "request": "launch", + "name": "Launch bench.ts", + "type": "node", + "program": "${workspaceFolder}/test/bench.ts", + "cwd": "${workspaceFolder}", + "runtimeExecutable": "deno", + "runtimeArgs": ["run", "--inspect-wait", "-A"], + "attachSimplePort": 9229 + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index d0a7da6..ffa355f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,6 @@ { - // Required to compile directly to ES modules. - "typescript.preferences.importModuleSpecifierEnding": "js" + "deno.enable": true, + "[typescript]": { + "editor.defaultFormatter": "denoland.vscode-deno" + } } diff --git a/.vscode/snippets.code-snippets b/.vscode/snippets.code-snippets deleted file mode 100644 index 468539d..0000000 --- a/.vscode/snippets.code-snippets +++ /dev/null @@ -1,17 +0,0 @@ -{ - "isTag loop": { - "scope": "typescript", - "prefix": "isTag", - "body": [ - "let ${1:variable} = \"\";", - "for (; index < len && isTag(source[index]); index++)", - "\t${1:variable} += source[index];", - "$0" - ] - }, - "isWS loop": { - "scope": "typescript", - "prefix": "isWS", - "body": ["while (isWS(source[index]) && index < len) index++;", "$0"] - } -} diff --git a/deno.jsonc b/deno.jsonc new file mode 100644 index 0000000..bf6c8fc --- /dev/null +++ b/deno.jsonc @@ -0,0 +1,16 @@ +{ + "lint": { + "exclude": ["dist", "test/dist"], + "include": ["*.ts"] + }, + "fmt": { + "useTabs": true, + "semiColons": false, + "lineWidth": 120 + }, + "tasks": { + "build": "deno run -A ./esbuild.ts && deno fmt dist/poggies.d.ts", + "bench": "deno run -A ./test/bench.ts" + }, + "nodeModulesDir": true +} diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..9f087d4 --- /dev/null +++ b/deno.lock @@ -0,0 +1,2052 @@ +{ + "version": "2", + "remote": { + "https://deno.land/std@0.180.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", + "https://deno.land/std@0.180.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", + "https://deno.land/std@0.180.0/fmt/colors.ts": "938c5d44d889fb82eff6c358bea8baa7e85950a16c9f6dae3ec3a7a729164471", + "https://deno.land/std@0.180.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.180.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.180.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0", + "https://deno.land/std@0.180.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", + "https://deno.land/std@0.180.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", + "https://deno.land/std@0.180.0/path/mod.ts": "4b83694ac500d7d31b0cdafc927080a53dc0c3027eb2895790fb155082b0d232", + "https://deno.land/std@0.180.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d", + "https://deno.land/std@0.180.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", + "https://deno.land/std@0.180.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba", + "https://deno.land/std@0.180.0/testing/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea", + "https://deno.land/std@0.180.0/testing/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", + "https://deno.land/std@0.180.0/testing/asserts.ts": "984ab0bfb3faeed92ffaa3a6b06536c66811185328c5dd146257c702c41b01ab", + "https://deno.land/std@0.201.0/assert/_constants.ts": "8a9da298c26750b28b326b297316cdde860bc237533b07e1337c021379e6b2a9", + "https://deno.land/std@0.201.0/assert/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea", + "https://deno.land/std@0.201.0/assert/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", + "https://deno.land/std@0.201.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", + "https://deno.land/std@0.201.0/assert/assert_almost_equals.ts": "e15ca1f34d0d5e0afae63b3f5d975cbd18335a132e42b0c747d282f62ad2cd6c", + "https://deno.land/std@0.201.0/assert/assert_array_includes.ts": "6856d7f2c3544bc6e62fb4646dfefa3d1df5ff14744d1bca19f0cbaf3b0d66c9", + "https://deno.land/std@0.201.0/assert/assert_equals.ts": "d8ec8a22447fbaf2fc9d7c3ed2e66790fdb74beae3e482855d75782218d68227", + "https://deno.land/std@0.201.0/assert/assert_exists.ts": "407cb6b9fb23a835cd8d5ad804e2e2edbbbf3870e322d53f79e1c7a512e2efd7", + "https://deno.land/std@0.201.0/assert/assert_false.ts": "a9962749f4bf5844e3fa494257f1de73d69e4fe0e82c34d0099287552163a2dc", + "https://deno.land/std@0.201.0/assert/assert_greater.ts": "ae2158a2d19313bf675bf7251d31c6dc52973edb12ac64ac8fc7064152af3e63", + "https://deno.land/std@0.201.0/assert/assert_greater_or_equal.ts": "1439da5ebbe20855446cac50097ac78b9742abe8e9a43e7de1ce1426d556e89c", + "https://deno.land/std@0.201.0/assert/assert_instance_of.ts": "3aedb3d8186e120812d2b3a5dea66a6e42bf8c57a8bd927645770bd21eea554c", + "https://deno.land/std@0.201.0/assert/assert_is_error.ts": "c21113094a51a296ffaf036767d616a78a2ae5f9f7bbd464cd0197476498b94b", + "https://deno.land/std@0.201.0/assert/assert_less.ts": "aec695db57db42ec3e2b62e97e1e93db0063f5a6ec133326cc290ff4b71b47e4", + "https://deno.land/std@0.201.0/assert/assert_less_or_equal.ts": "5fa8b6a3ffa20fd0a05032fe7257bf985d207b85685fdbcd23651b70f928c848", + "https://deno.land/std@0.201.0/assert/assert_match.ts": "c4083f80600bc190309903c95e397a7c9257ff8b5ae5c7ef91e834704e672e9b", + "https://deno.land/std@0.201.0/assert/assert_not_equals.ts": "9f1acab95bd1f5fc9a1b17b8027d894509a745d91bac1718fdab51dc76831754", + "https://deno.land/std@0.201.0/assert/assert_not_instance_of.ts": "0c14d3dfd9ab7a5276ed8ed0b18c703d79a3d106102077ec437bfe7ed912bd22", + "https://deno.land/std@0.201.0/assert/assert_not_match.ts": "3796a5b0c57a1ce6c1c57883dd4286be13a26f715ea662318ab43a8491a13ab0", + "https://deno.land/std@0.201.0/assert/assert_not_strict_equals.ts": "ca6c6d645e95fbc873d25320efeb8c4c6089a9a5e09f92d7c1c4b6e935c2a6ad", + "https://deno.land/std@0.201.0/assert/assert_object_match.ts": "d8fc2867cfd92eeacf9cea621e10336b666de1874a6767b5ec48988838370b54", + "https://deno.land/std@0.201.0/assert/assert_rejects.ts": "45c59724de2701e3b1f67c391d6c71c392363635aad3f68a1b3408f9efca0057", + "https://deno.land/std@0.201.0/assert/assert_strict_equals.ts": "b1f538a7ea5f8348aeca261d4f9ca603127c665e0f2bbfeb91fa272787c87265", + "https://deno.land/std@0.201.0/assert/assert_string_includes.ts": "b821d39ebf5cb0200a348863c86d8c4c4b398e02012ce74ad15666fc4b631b0c", + "https://deno.land/std@0.201.0/assert/assert_throws.ts": "63784e951475cb7bdfd59878cd25a0931e18f6dc32a6077c454b2cd94f4f4bcd", + "https://deno.land/std@0.201.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", + "https://deno.land/std@0.201.0/assert/equal.ts": "9f1a46d5993966d2596c44e5858eec821859b45f783a5ee2f7a695dfc12d8ece", + "https://deno.land/std@0.201.0/assert/fail.ts": "c36353d7ae6e1f7933d45f8ea51e358c8c4b67d7e7502028598fe1fea062e278", + "https://deno.land/std@0.201.0/assert/mod.ts": "37c49a26aae2b254bbe25723434dc28cd7532e444cf0b481a97c045d110ec085", + "https://deno.land/std@0.201.0/assert/unimplemented.ts": "d56fbeecb1f108331a380f72e3e010a1f161baa6956fd0f7cf3e095ae1a4c75a", + "https://deno.land/std@0.201.0/assert/unreachable.ts": "4600dc0baf7d9c15a7f7d234f00c23bca8f3eba8b140286aaca7aa998cf9a536", + "https://deno.land/std@0.201.0/fmt/colors.ts": "87544aa2bc91087bb37f9c077970c85bfb041b48e4c37356129d7b450a415b6f" + }, + "npm": { + "specifiers": { + "@types/node": "@types/node@18.15.5", + "@types/node@^18.15.5": "@types/node@18.15.5", + "@typescript-eslint/eslint-plugin@^5.56.0": "@typescript-eslint/eslint-plugin@5.56.0_@typescript-eslint+parser@5.56.0__eslint@8.36.0__typescript@5.0.2_eslint@8.36.0_typescript@5.0.2", + "@typescript-eslint/eslint-plugin@^6.7.2": "@typescript-eslint/eslint-plugin@6.7.2_@typescript-eslint+parser@6.7.2__eslint@8.36.0__typescript@5.0.2_eslint@8.36.0_typescript@5.0.2", + "@typescript-eslint/parser@^5.56.0": "@typescript-eslint/parser@5.56.0_eslint@8.36.0_typescript@5.0.2", + "@typescript-eslint/parser@^6.7.2": "@typescript-eslint/parser@6.7.2_eslint@8.36.0_typescript@5.0.2", + "esbuild": "esbuild@0.17.16", + "esbuild@0.17.12": "esbuild@0.17.12", + "esbuild@0.17.16": "esbuild@0.17.16", + "esbuild@^0.17.12": "esbuild@0.17.16", + "esbuild@^0.19.2": "esbuild@0.19.2", + "esbuild@^0.19.3": "esbuild@0.19.3", + "eslint-config-prettier@^8.8.0": "eslint-config-prettier@8.8.0_eslint@8.36.0", + "eslint-config-prettier@^9.0.0": "eslint-config-prettier@9.0.0_eslint@8.36.0", + "eslint-plugin-unicorn@^46.0.0": "eslint-plugin-unicorn@46.0.0_eslint@8.36.0", + "eslint-plugin-unicorn@^48.0.1": "eslint-plugin-unicorn@48.0.1_eslint@8.49.0", + "eslint@^8.36.0": "eslint@8.36.0", + "eslint@^8.49.0": "eslint@8.49.0", + "prettier@^2.8.6": "prettier@2.8.6", + "prettier@^3.0.3": "prettier@3.0.3", + "tsc": "tsc@2.0.4", + "typescript": "typescript@5.2.2", + "typescript@^5.0.2": "typescript@5.0.2", + "typescript@^5.2.2": "typescript@5.2.2" + }, + "packages": { + "@aashutoshrathi/word-wrap@1.2.6": { + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dependencies": {} + }, + "@babel/code-frame@7.18.6": { + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dependencies": { + "@babel/highlight": "@babel/highlight@7.18.6" + } + }, + "@babel/helper-validator-identifier@7.19.1": { + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dependencies": {} + }, + "@babel/helper-validator-identifier@7.22.20": { + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dependencies": {} + }, + "@babel/highlight@7.18.6": { + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "@babel/helper-validator-identifier@7.19.1", + "chalk": "chalk@2.4.2", + "js-tokens": "js-tokens@4.0.0" + } + }, + "@esbuild/android-arm64@0.17.12": { + "integrity": "sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==", + "dependencies": {} + }, + "@esbuild/android-arm64@0.17.13": { + "integrity": "sha512-F5DgvJMV2ZEpLNpPCO7FEk1wy8O5tg6cikWSB6uvvncsgE1xgbPlm+Boio/4820C2/mj713X83X1h01v0qoeHg==", + "dependencies": {} + }, + "@esbuild/android-arm64@0.17.16": { + "integrity": "sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==", + "dependencies": {} + }, + "@esbuild/android-arm64@0.19.2": { + "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", + "dependencies": {} + }, + "@esbuild/android-arm64@0.19.3": { + "integrity": "sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw==", + "dependencies": {} + }, + "@esbuild/android-arm@0.17.12": { + "integrity": "sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==", + "dependencies": {} + }, + "@esbuild/android-arm@0.17.13": { + "integrity": "sha512-5tZZ/hLIfBmt7E8JsE5KbsknoAFmoElkg+A/gjyPtmSQvJjPf+9GsSJihid8VMa08lrsYyaEXOT9RLh3xXQONw==", + "dependencies": {} + }, + "@esbuild/android-arm@0.17.16": { + "integrity": "sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==", + "dependencies": {} + }, + "@esbuild/android-arm@0.19.2": { + "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", + "dependencies": {} + }, + "@esbuild/android-arm@0.19.3": { + "integrity": "sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA==", + "dependencies": {} + }, + "@esbuild/android-x64@0.17.12": { + "integrity": "sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==", + "dependencies": {} + }, + "@esbuild/android-x64@0.17.13": { + "integrity": "sha512-5m1UUslzpfVrumG3m3Zv2x9VNAcvMOQWJy009y6jt10tcHpzIq2/b0I0k4fz0QYqGSNS1GteRIhVPN4H7OyCXg==", + "dependencies": {} + }, + "@esbuild/android-x64@0.17.16": { + "integrity": "sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==", + "dependencies": {} + }, + "@esbuild/android-x64@0.19.2": { + "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", + "dependencies": {} + }, + "@esbuild/android-x64@0.19.3": { + "integrity": "sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ==", + "dependencies": {} + }, + "@esbuild/darwin-arm64@0.17.12": { + "integrity": "sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==", + "dependencies": {} + }, + "@esbuild/darwin-arm64@0.17.13": { + "integrity": "sha512-TXbXp/05r7heRsG8yWwbHw9diay+wXIyRNcIHFoNARRIGahYbTW/qwJzE37zkfxLIUPHgR/SyLTUlnTICg14ag==", + "dependencies": {} + }, + "@esbuild/darwin-arm64@0.17.16": { + "integrity": "sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==", + "dependencies": {} + }, + "@esbuild/darwin-arm64@0.19.2": { + "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", + "dependencies": {} + }, + "@esbuild/darwin-arm64@0.19.3": { + "integrity": "sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw==", + "dependencies": {} + }, + "@esbuild/darwin-x64@0.17.12": { + "integrity": "sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==", + "dependencies": {} + }, + "@esbuild/darwin-x64@0.17.13": { + "integrity": "sha512-Ku9Db2sblCxFvQdEO7X9nBaLR/S81uch81e2Q2+Os5z1NcnsFjuqhIYH0Gm6KNNpIKaEbC7gCLbiIPbLLMX4Pg==", + "dependencies": {} + }, + "@esbuild/darwin-x64@0.17.16": { + "integrity": "sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==", + "dependencies": {} + }, + "@esbuild/darwin-x64@0.19.2": { + "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", + "dependencies": {} + }, + "@esbuild/darwin-x64@0.19.3": { + "integrity": "sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw==", + "dependencies": {} + }, + "@esbuild/freebsd-arm64@0.17.12": { + "integrity": "sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==", + "dependencies": {} + }, + "@esbuild/freebsd-arm64@0.17.13": { + "integrity": "sha512-t1T5/nIf2j+FdSf1Fa3dcU0cXycr0nK4xJe52qjWa+1I249mM5NBY1ODjiabZxZ0x3CG05y4fd9bxfDLy9kQtA==", + "dependencies": {} + }, + "@esbuild/freebsd-arm64@0.17.16": { + "integrity": "sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==", + "dependencies": {} + }, + "@esbuild/freebsd-arm64@0.19.2": { + "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", + "dependencies": {} + }, + "@esbuild/freebsd-arm64@0.19.3": { + "integrity": "sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg==", + "dependencies": {} + }, + "@esbuild/freebsd-x64@0.17.12": { + "integrity": "sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==", + "dependencies": {} + }, + "@esbuild/freebsd-x64@0.17.13": { + "integrity": "sha512-/zbkgEO4gY2qGZr9UNAGI38w/FwUY4bx4EC88k9VeiCKNr3ukNgwH/oIgB5Z9/OqpkNLlcS4w9e2d/MIiy5fbw==", + "dependencies": {} + }, + "@esbuild/freebsd-x64@0.17.16": { + "integrity": "sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==", + "dependencies": {} + }, + "@esbuild/freebsd-x64@0.19.2": { + "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", + "dependencies": {} + }, + "@esbuild/freebsd-x64@0.19.3": { + "integrity": "sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA==", + "dependencies": {} + }, + "@esbuild/linux-arm64@0.17.12": { + "integrity": "sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==", + "dependencies": {} + }, + "@esbuild/linux-arm64@0.17.13": { + "integrity": "sha512-siu3QZrQ7eGrSttvFaRKyjT7kNRbUuHEKzCCyqRh19MbpGokGY13jbIsBEjx6JmH3T50hds325oweS9Ey2ihAQ==", + "dependencies": {} + }, + "@esbuild/linux-arm64@0.17.16": { + "integrity": "sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==", + "dependencies": {} + }, + "@esbuild/linux-arm64@0.19.2": { + "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", + "dependencies": {} + }, + "@esbuild/linux-arm64@0.19.3": { + "integrity": "sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ==", + "dependencies": {} + }, + "@esbuild/linux-arm@0.17.12": { + "integrity": "sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==", + "dependencies": {} + }, + "@esbuild/linux-arm@0.17.13": { + "integrity": "sha512-RrhjzrCF6aCDH248nUAQoldnRmN7nHMxv85GOj5AH+qkxxYvcig7fnUmgANngntRu4btXhN9WKHMgQ5seERDMw==", + "dependencies": {} + }, + "@esbuild/linux-arm@0.17.16": { + "integrity": "sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==", + "dependencies": {} + }, + "@esbuild/linux-arm@0.19.2": { + "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", + "dependencies": {} + }, + "@esbuild/linux-arm@0.19.3": { + "integrity": "sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ==", + "dependencies": {} + }, + "@esbuild/linux-ia32@0.17.12": { + "integrity": "sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==", + "dependencies": {} + }, + "@esbuild/linux-ia32@0.17.13": { + "integrity": "sha512-ADHA1PqP5gIegehVP0RvxMmNPxpLgetI8QCwYOjUheGXKIKWSdUN8ZS3rusQv3NGZmFCpYdMZzFoI0QtzzGAdw==", + "dependencies": {} + }, + "@esbuild/linux-ia32@0.17.16": { + "integrity": "sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==", + "dependencies": {} + }, + "@esbuild/linux-ia32@0.19.2": { + "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", + "dependencies": {} + }, + "@esbuild/linux-ia32@0.19.3": { + "integrity": "sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA==", + "dependencies": {} + }, + "@esbuild/linux-loong64@0.17.12": { + "integrity": "sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==", + "dependencies": {} + }, + "@esbuild/linux-loong64@0.17.13": { + "integrity": "sha512-n1JQPxETmR0brkpWlJHeohReEPLH+m00bnJdNnFyHN3zLBt1QypevuZSmnmFWsC+7r7HTwWILj3lBDjtPH3ydg==", + "dependencies": {} + }, + "@esbuild/linux-loong64@0.17.16": { + "integrity": "sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==", + "dependencies": {} + }, + "@esbuild/linux-loong64@0.19.2": { + "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", + "dependencies": {} + }, + "@esbuild/linux-loong64@0.19.3": { + "integrity": "sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A==", + "dependencies": {} + }, + "@esbuild/linux-mips64el@0.17.12": { + "integrity": "sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==", + "dependencies": {} + }, + "@esbuild/linux-mips64el@0.17.13": { + "integrity": "sha512-d0pnD/j5KKQ43xtSIvOD+wNIy6D/Vh9GbXVRa3u4zCyiJMYWjxkPkbBzlEgNjdDmUM+5gBFen9k7B8Xscy+Myg==", + "dependencies": {} + }, + "@esbuild/linux-mips64el@0.17.16": { + "integrity": "sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==", + "dependencies": {} + }, + "@esbuild/linux-mips64el@0.19.2": { + "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", + "dependencies": {} + }, + "@esbuild/linux-mips64el@0.19.3": { + "integrity": "sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A==", + "dependencies": {} + }, + "@esbuild/linux-ppc64@0.17.12": { + "integrity": "sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==", + "dependencies": {} + }, + "@esbuild/linux-ppc64@0.17.13": { + "integrity": "sha512-C9sMpa/VcGLjVtsT01sXtzZNS7bAZ+icUclkKkiUwBQ9hzT+J+/Xpj+EykI5hB3KgtxQVo4XUahanFoZNxbQ1g==", + "dependencies": {} + }, + "@esbuild/linux-ppc64@0.17.16": { + "integrity": "sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==", + "dependencies": {} + }, + "@esbuild/linux-ppc64@0.19.2": { + "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", + "dependencies": {} + }, + "@esbuild/linux-ppc64@0.19.3": { + "integrity": "sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g==", + "dependencies": {} + }, + "@esbuild/linux-riscv64@0.17.12": { + "integrity": "sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==", + "dependencies": {} + }, + "@esbuild/linux-riscv64@0.17.13": { + "integrity": "sha512-jYkc5EpNpvjccAHNYekiAtklusVGWftR0VVLtng7dJzDyy+5adAsf1fOG3LllP0WALxS55/w6boLE/728J/bXw==", + "dependencies": {} + }, + "@esbuild/linux-riscv64@0.17.16": { + "integrity": "sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==", + "dependencies": {} + }, + "@esbuild/linux-riscv64@0.19.2": { + "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", + "dependencies": {} + }, + "@esbuild/linux-riscv64@0.19.3": { + "integrity": "sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA==", + "dependencies": {} + }, + "@esbuild/linux-s390x@0.17.12": { + "integrity": "sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==", + "dependencies": {} + }, + "@esbuild/linux-s390x@0.17.13": { + "integrity": "sha512-4jAJI5O6E/hATL4lsrG2A+noDjZ377KlATVFKwV3SWaNHj+OvoXe/T84ScQIXEtPI7ndJyLkMYruXj8RR5Ilyw==", + "dependencies": {} + }, + "@esbuild/linux-s390x@0.17.16": { + "integrity": "sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==", + "dependencies": {} + }, + "@esbuild/linux-s390x@0.19.2": { + "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", + "dependencies": {} + }, + "@esbuild/linux-s390x@0.19.3": { + "integrity": "sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA==", + "dependencies": {} + }, + "@esbuild/linux-x64@0.17.12": { + "integrity": "sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==", + "dependencies": {} + }, + "@esbuild/linux-x64@0.17.13": { + "integrity": "sha512-eFLQhJq98qijGRcv9je/9M4Mz1suZ+pOtj62ArsLd0gubNGhhQDz6T30X2X3f1KZ8lkKkr+zN5vtZzx1GAMoFw==", + "dependencies": {} + }, + "@esbuild/linux-x64@0.17.16": { + "integrity": "sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==", + "dependencies": {} + }, + "@esbuild/linux-x64@0.19.2": { + "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", + "dependencies": {} + }, + "@esbuild/linux-x64@0.19.3": { + "integrity": "sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ==", + "dependencies": {} + }, + "@esbuild/netbsd-x64@0.17.12": { + "integrity": "sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==", + "dependencies": {} + }, + "@esbuild/netbsd-x64@0.17.13": { + "integrity": "sha512-F8PXDeT+3eQpPjf4bmNJapPLu0SKKlWRGPQvBQqVS+YDGoMKnyyYp2UENLFMV8zT7kS39zKxZRZvUL3fMz/7Ww==", + "dependencies": {} + }, + "@esbuild/netbsd-x64@0.17.16": { + "integrity": "sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==", + "dependencies": {} + }, + "@esbuild/netbsd-x64@0.19.2": { + "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", + "dependencies": {} + }, + "@esbuild/netbsd-x64@0.19.3": { + "integrity": "sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw==", + "dependencies": {} + }, + "@esbuild/openbsd-x64@0.17.12": { + "integrity": "sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==", + "dependencies": {} + }, + "@esbuild/openbsd-x64@0.17.13": { + "integrity": "sha512-9jWfzbFCnIZdHjNs+00KQHArUbp7kjQDNmiuqkwGOQFs67m4/dKNupBv2DP5hTqVlQY4tW4RG3qpb6Y3zOHJeA==", + "dependencies": {} + }, + "@esbuild/openbsd-x64@0.17.16": { + "integrity": "sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==", + "dependencies": {} + }, + "@esbuild/openbsd-x64@0.19.2": { + "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", + "dependencies": {} + }, + "@esbuild/openbsd-x64@0.19.3": { + "integrity": "sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q==", + "dependencies": {} + }, + "@esbuild/sunos-x64@0.17.12": { + "integrity": "sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==", + "dependencies": {} + }, + "@esbuild/sunos-x64@0.17.13": { + "integrity": "sha512-ALbOMlTIBkAVi6KqYjONa7u2oH95RN7OpetFqMtjufFLBiSaayRuwUzhs2yuR9CfGT4qi0jv6HQDav+EG314TQ==", + "dependencies": {} + }, + "@esbuild/sunos-x64@0.17.16": { + "integrity": "sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==", + "dependencies": {} + }, + "@esbuild/sunos-x64@0.19.2": { + "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", + "dependencies": {} + }, + "@esbuild/sunos-x64@0.19.3": { + "integrity": "sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw==", + "dependencies": {} + }, + "@esbuild/win32-arm64@0.17.12": { + "integrity": "sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==", + "dependencies": {} + }, + "@esbuild/win32-arm64@0.17.13": { + "integrity": "sha512-FJBLYL4PkrZGeuHzEqme+0DjNetxkJ+XbB+Aoeow7aQ53JCwsA0/mo8sS5aPkDHgCnMkN4A5GLoFTlDj3BKDrQ==", + "dependencies": {} + }, + "@esbuild/win32-arm64@0.17.16": { + "integrity": "sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==", + "dependencies": {} + }, + "@esbuild/win32-arm64@0.19.2": { + "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", + "dependencies": {} + }, + "@esbuild/win32-arm64@0.19.3": { + "integrity": "sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A==", + "dependencies": {} + }, + "@esbuild/win32-ia32@0.17.12": { + "integrity": "sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==", + "dependencies": {} + }, + "@esbuild/win32-ia32@0.17.13": { + "integrity": "sha512-Qrvst9RkLz4qgi3hqswNliYuKW92/HGJnd7xLWkGaGPa8S4qsONf81FW0ebDc5iUHb0I7QJwQATutvghTabnFA==", + "dependencies": {} + }, + "@esbuild/win32-ia32@0.17.16": { + "integrity": "sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==", + "dependencies": {} + }, + "@esbuild/win32-ia32@0.19.2": { + "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", + "dependencies": {} + }, + "@esbuild/win32-ia32@0.19.3": { + "integrity": "sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q==", + "dependencies": {} + }, + "@esbuild/win32-x64@0.17.12": { + "integrity": "sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==", + "dependencies": {} + }, + "@esbuild/win32-x64@0.17.13": { + "integrity": "sha512-pZ/NIgz861XaUPlIkPFjP55nJ4PJa0o/CD4zgeRb1Q9FVE+8GvdB6ifJcK05jRhny5hKExhnRFIdgHmmCYH8vg==", + "dependencies": {} + }, + "@esbuild/win32-x64@0.17.16": { + "integrity": "sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==", + "dependencies": {} + }, + "@esbuild/win32-x64@0.19.2": { + "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", + "dependencies": {} + }, + "@esbuild/win32-x64@0.19.3": { + "integrity": "sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw==", + "dependencies": {} + }, + "@eslint-community/eslint-utils@4.3.0_eslint@8.36.0": { + "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", + "dependencies": { + "eslint": "eslint@8.36.0", + "eslint-visitor-keys": "eslint-visitor-keys@3.3.0" + } + }, + "@eslint-community/eslint-utils@4.3.0_eslint@8.49.0": { + "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", + "dependencies": { + "eslint": "eslint@8.49.0", + "eslint-visitor-keys": "eslint-visitor-keys@3.4.3" + } + }, + "@eslint-community/eslint-utils@4.4.0_eslint@8.36.0": { + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint": "eslint@8.36.0", + "eslint-visitor-keys": "eslint-visitor-keys@3.4.3" + } + }, + "@eslint-community/eslint-utils@4.4.0_eslint@8.49.0": { + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint": "eslint@8.49.0", + "eslint-visitor-keys": "eslint-visitor-keys@3.4.3" + } + }, + "@eslint-community/regexpp@4.4.0": { + "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "dependencies": {} + }, + "@eslint-community/regexpp@4.8.1": { + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dependencies": {} + }, + "@eslint/eslintrc@2.0.1": { + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "dependencies": { + "ajv": "ajv@6.12.6", + "debug": "debug@4.3.4", + "espree": "espree@9.5.0_acorn@8.8.2", + "globals": "globals@13.20.0", + "ignore": "ignore@5.2.4", + "import-fresh": "import-fresh@3.3.0", + "js-yaml": "js-yaml@4.1.0", + "minimatch": "minimatch@3.1.2", + "strip-json-comments": "strip-json-comments@3.1.1" + } + }, + "@eslint/eslintrc@2.1.2": { + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dependencies": { + "ajv": "ajv@6.12.6", + "debug": "debug@4.3.4", + "espree": "espree@9.6.1_acorn@8.10.0", + "globals": "globals@13.20.0", + "ignore": "ignore@5.2.4", + "import-fresh": "import-fresh@3.3.0", + "js-yaml": "js-yaml@4.1.0", + "minimatch": "minimatch@3.1.2", + "strip-json-comments": "strip-json-comments@3.1.1" + } + }, + "@eslint/js@8.36.0": { + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "dependencies": {} + }, + "@eslint/js@8.49.0": { + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "dependencies": {} + }, + "@humanwhocodes/config-array@0.11.11": { + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dependencies": { + "@humanwhocodes/object-schema": "@humanwhocodes/object-schema@1.2.1", + "debug": "debug@4.3.4", + "minimatch": "minimatch@3.1.2" + } + }, + "@humanwhocodes/config-array@0.11.8": { + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dependencies": { + "@humanwhocodes/object-schema": "@humanwhocodes/object-schema@1.2.1", + "debug": "debug@4.3.4", + "minimatch": "minimatch@3.1.2" + } + }, + "@humanwhocodes/module-importer@1.0.1": { + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dependencies": {} + }, + "@humanwhocodes/object-schema@1.2.1": { + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dependencies": {} + }, + "@nodelib/fs.scandir@2.1.5": { + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", + "run-parallel": "run-parallel@1.2.0" + } + }, + "@nodelib/fs.stat@2.0.5": { + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dependencies": {} + }, + "@nodelib/fs.walk@1.2.8": { + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "@nodelib/fs.scandir@2.1.5", + "fastq": "fastq@1.15.0" + } + }, + "@types/json-schema@7.0.11": { + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dependencies": {} + }, + "@types/json-schema@7.0.13": { + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dependencies": {} + }, + "@types/node@18.15.5": { + "integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==", + "dependencies": {} + }, + "@types/normalize-package-data@2.4.1": { + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dependencies": {} + }, + "@types/semver@7.3.13": { + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dependencies": {} + }, + "@types/semver@7.5.2": { + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", + "dependencies": {} + }, + "@typescript-eslint/eslint-plugin@5.56.0_@typescript-eslint+parser@5.56.0__eslint@8.36.0__typescript@5.0.2_eslint@8.36.0_typescript@5.0.2": { + "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", + "dependencies": { + "@eslint-community/regexpp": "@eslint-community/regexpp@4.4.0", + "@typescript-eslint/parser": "@typescript-eslint/parser@5.56.0_eslint@8.36.0_typescript@5.0.2", + "@typescript-eslint/scope-manager": "@typescript-eslint/scope-manager@5.56.0", + "@typescript-eslint/type-utils": "@typescript-eslint/type-utils@5.56.0_eslint@8.36.0_typescript@5.0.2", + "@typescript-eslint/utils": "@typescript-eslint/utils@5.56.0_eslint@8.36.0_typescript@5.0.2", + "debug": "debug@4.3.4", + "eslint": "eslint@8.36.0", + "grapheme-splitter": "grapheme-splitter@1.0.4", + "ignore": "ignore@5.2.4", + "natural-compare-lite": "natural-compare-lite@1.4.0", + "semver": "semver@7.3.8", + "tsutils": "tsutils@3.21.0_typescript@5.0.2" + } + }, + "@typescript-eslint/eslint-plugin@6.7.2_@typescript-eslint+parser@6.7.2__eslint@8.36.0__typescript@5.0.2_eslint@8.36.0_typescript@5.0.2": { + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "dependencies": { + "@eslint-community/regexpp": "@eslint-community/regexpp@4.8.1", + "@typescript-eslint/parser": "@typescript-eslint/parser@6.7.2_eslint@8.36.0_typescript@5.0.2", + "@typescript-eslint/scope-manager": "@typescript-eslint/scope-manager@6.7.2", + "@typescript-eslint/type-utils": "@typescript-eslint/type-utils@6.7.2_eslint@8.36.0_typescript@5.0.2", + "@typescript-eslint/utils": "@typescript-eslint/utils@6.7.2_eslint@8.36.0_typescript@5.0.2", + "@typescript-eslint/visitor-keys": "@typescript-eslint/visitor-keys@6.7.2", + "debug": "debug@4.3.4", + "eslint": "eslint@8.36.0", + "graphemer": "graphemer@1.4.0", + "ignore": "ignore@5.2.4", + "natural-compare": "natural-compare@1.4.0", + "semver": "semver@7.5.4", + "ts-api-utils": "ts-api-utils@1.0.3_typescript@5.0.2" + } + }, + "@typescript-eslint/parser@5.56.0_eslint@8.36.0_typescript@5.0.2": { + "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", + "dependencies": { + "@typescript-eslint/scope-manager": "@typescript-eslint/scope-manager@5.56.0", + "@typescript-eslint/types": "@typescript-eslint/types@5.56.0", + "@typescript-eslint/typescript-estree": "@typescript-eslint/typescript-estree@5.56.0_typescript@5.0.2", + "debug": "debug@4.3.4", + "eslint": "eslint@8.36.0" + } + }, + "@typescript-eslint/parser@6.7.2_eslint@8.36.0_typescript@5.0.2": { + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", + "dependencies": { + "@typescript-eslint/scope-manager": "@typescript-eslint/scope-manager@6.7.2", + "@typescript-eslint/types": "@typescript-eslint/types@6.7.2", + "@typescript-eslint/typescript-estree": "@typescript-eslint/typescript-estree@6.7.2_typescript@5.0.2", + "@typescript-eslint/visitor-keys": "@typescript-eslint/visitor-keys@6.7.2", + "debug": "debug@4.3.4", + "eslint": "eslint@8.36.0" + } + }, + "@typescript-eslint/scope-manager@5.56.0": { + "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", + "dependencies": { + "@typescript-eslint/types": "@typescript-eslint/types@5.56.0", + "@typescript-eslint/visitor-keys": "@typescript-eslint/visitor-keys@5.56.0" + } + }, + "@typescript-eslint/scope-manager@6.7.2": { + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "dependencies": { + "@typescript-eslint/types": "@typescript-eslint/types@6.7.2", + "@typescript-eslint/visitor-keys": "@typescript-eslint/visitor-keys@6.7.2" + } + }, + "@typescript-eslint/type-utils@5.56.0_eslint@8.36.0_typescript@5.0.2": { + "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", + "dependencies": { + "@typescript-eslint/typescript-estree": "@typescript-eslint/typescript-estree@5.56.0_typescript@5.0.2", + "@typescript-eslint/utils": "@typescript-eslint/utils@5.56.0_eslint@8.36.0_typescript@5.0.2", + "debug": "debug@4.3.4", + "eslint": "eslint@8.36.0", + "tsutils": "tsutils@3.21.0_typescript@5.0.2" + } + }, + "@typescript-eslint/type-utils@6.7.2_eslint@8.36.0_typescript@5.0.2": { + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", + "dependencies": { + "@typescript-eslint/typescript-estree": "@typescript-eslint/typescript-estree@6.7.2_typescript@5.0.2", + "@typescript-eslint/utils": "@typescript-eslint/utils@6.7.2_eslint@8.36.0_typescript@5.0.2", + "debug": "debug@4.3.4", + "eslint": "eslint@8.36.0", + "ts-api-utils": "ts-api-utils@1.0.3_typescript@5.0.2" + } + }, + "@typescript-eslint/types@5.56.0": { + "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", + "dependencies": {} + }, + "@typescript-eslint/types@6.7.2": { + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "dependencies": {} + }, + "@typescript-eslint/typescript-estree@5.56.0_typescript@5.0.2": { + "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", + "dependencies": { + "@typescript-eslint/types": "@typescript-eslint/types@5.56.0", + "@typescript-eslint/visitor-keys": "@typescript-eslint/visitor-keys@5.56.0", + "debug": "debug@4.3.4", + "globby": "globby@11.1.0", + "is-glob": "is-glob@4.0.3", + "semver": "semver@7.3.8", + "tsutils": "tsutils@3.21.0_typescript@5.0.2" + } + }, + "@typescript-eslint/typescript-estree@6.7.2_typescript@5.0.2": { + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "dependencies": { + "@typescript-eslint/types": "@typescript-eslint/types@6.7.2", + "@typescript-eslint/visitor-keys": "@typescript-eslint/visitor-keys@6.7.2", + "debug": "debug@4.3.4", + "globby": "globby@11.1.0", + "is-glob": "is-glob@4.0.3", + "semver": "semver@7.5.4", + "ts-api-utils": "ts-api-utils@1.0.3_typescript@5.0.2" + } + }, + "@typescript-eslint/utils@5.56.0_eslint@8.36.0_typescript@5.0.2": { + "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", + "dependencies": { + "@eslint-community/eslint-utils": "@eslint-community/eslint-utils@4.3.0_eslint@8.36.0", + "@types/json-schema": "@types/json-schema@7.0.11", + "@types/semver": "@types/semver@7.3.13", + "@typescript-eslint/scope-manager": "@typescript-eslint/scope-manager@5.56.0", + "@typescript-eslint/types": "@typescript-eslint/types@5.56.0", + "@typescript-eslint/typescript-estree": "@typescript-eslint/typescript-estree@5.56.0_typescript@5.0.2", + "eslint": "eslint@8.36.0", + "eslint-scope": "eslint-scope@5.1.1", + "semver": "semver@7.3.8" + } + }, + "@typescript-eslint/utils@6.7.2_eslint@8.36.0_typescript@5.0.2": { + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "dependencies": { + "@eslint-community/eslint-utils": "@eslint-community/eslint-utils@4.4.0_eslint@8.36.0", + "@types/json-schema": "@types/json-schema@7.0.13", + "@types/semver": "@types/semver@7.5.2", + "@typescript-eslint/scope-manager": "@typescript-eslint/scope-manager@6.7.2", + "@typescript-eslint/types": "@typescript-eslint/types@6.7.2", + "@typescript-eslint/typescript-estree": "@typescript-eslint/typescript-estree@6.7.2_typescript@5.0.2", + "eslint": "eslint@8.36.0", + "semver": "semver@7.5.4" + } + }, + "@typescript-eslint/visitor-keys@5.56.0": { + "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", + "dependencies": { + "@typescript-eslint/types": "@typescript-eslint/types@5.56.0", + "eslint-visitor-keys": "eslint-visitor-keys@3.3.0" + } + }, + "@typescript-eslint/visitor-keys@6.7.2": { + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "dependencies": { + "@typescript-eslint/types": "@typescript-eslint/types@6.7.2", + "eslint-visitor-keys": "eslint-visitor-keys@3.4.3" + } + }, + "acorn-jsx@5.3.2_acorn@8.10.0": { + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dependencies": { + "acorn": "acorn@8.10.0" + } + }, + "acorn-jsx@5.3.2_acorn@8.8.2": { + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dependencies": { + "acorn": "acorn@8.8.2" + } + }, + "acorn@8.10.0": { + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dependencies": {} + }, + "acorn@8.8.2": { + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dependencies": {} + }, + "ajv@6.12.6": { + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "fast-deep-equal@3.1.3", + "fast-json-stable-stringify": "fast-json-stable-stringify@2.1.0", + "json-schema-traverse": "json-schema-traverse@0.4.1", + "uri-js": "uri-js@4.4.1" + } + }, + "ansi-regex@5.0.1": { + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dependencies": {} + }, + "ansi-styles@3.2.1": { + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "color-convert@1.9.3" + } + }, + "ansi-styles@4.3.0": { + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "color-convert@2.0.1" + } + }, + "argparse@2.0.1": { + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dependencies": {} + }, + "array-union@2.1.0": { + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dependencies": {} + }, + "balanced-match@1.0.2": { + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dependencies": {} + }, + "brace-expansion@1.1.11": { + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "balanced-match@1.0.2", + "concat-map": "concat-map@0.0.1" + } + }, + "braces@3.0.2": { + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "fill-range@7.0.1" + } + }, + "builtin-modules@3.3.0": { + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dependencies": {} + }, + "callsites@3.1.0": { + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dependencies": {} + }, + "chalk@2.4.2": { + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "ansi-styles@3.2.1", + "escape-string-regexp": "escape-string-regexp@1.0.5", + "supports-color": "supports-color@5.5.0" + } + }, + "chalk@4.1.2": { + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "ansi-styles@4.3.0", + "supports-color": "supports-color@7.2.0" + } + }, + "ci-info@3.8.0": { + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dependencies": {} + }, + "clean-regexp@1.0.0": { + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dependencies": { + "escape-string-regexp": "escape-string-regexp@1.0.5" + } + }, + "color-convert@1.9.3": { + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "color-name@1.1.3" + } + }, + "color-convert@2.0.1": { + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "color-name@1.1.4" + } + }, + "color-name@1.1.3": { + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dependencies": {} + }, + "color-name@1.1.4": { + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dependencies": {} + }, + "concat-map@0.0.1": { + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dependencies": {} + }, + "cross-spawn@7.0.3": { + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "path-key@3.1.1", + "shebang-command": "shebang-command@2.0.0", + "which": "which@2.0.2" + } + }, + "debug@4.3.4": { + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "ms@2.1.2" + } + }, + "deep-is@0.1.4": { + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dependencies": {} + }, + "dir-glob@3.0.1": { + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "path-type@4.0.0" + } + }, + "doctrine@3.0.0": { + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "esutils@2.0.3" + } + }, + "error-ex@1.3.2": { + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "is-arrayish@0.2.1" + } + }, + "esbuild@0.17.12": { + "integrity": "sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==", + "dependencies": { + "@esbuild/android-arm": "@esbuild/android-arm@0.17.12", + "@esbuild/android-arm64": "@esbuild/android-arm64@0.17.12", + "@esbuild/android-x64": "@esbuild/android-x64@0.17.12", + "@esbuild/darwin-arm64": "@esbuild/darwin-arm64@0.17.12", + "@esbuild/darwin-x64": "@esbuild/darwin-x64@0.17.12", + "@esbuild/freebsd-arm64": "@esbuild/freebsd-arm64@0.17.12", + "@esbuild/freebsd-x64": "@esbuild/freebsd-x64@0.17.12", + "@esbuild/linux-arm": "@esbuild/linux-arm@0.17.12", + "@esbuild/linux-arm64": "@esbuild/linux-arm64@0.17.12", + "@esbuild/linux-ia32": "@esbuild/linux-ia32@0.17.12", + "@esbuild/linux-loong64": "@esbuild/linux-loong64@0.17.12", + "@esbuild/linux-mips64el": "@esbuild/linux-mips64el@0.17.12", + "@esbuild/linux-ppc64": "@esbuild/linux-ppc64@0.17.12", + "@esbuild/linux-riscv64": "@esbuild/linux-riscv64@0.17.12", + "@esbuild/linux-s390x": "@esbuild/linux-s390x@0.17.12", + "@esbuild/linux-x64": "@esbuild/linux-x64@0.17.12", + "@esbuild/netbsd-x64": "@esbuild/netbsd-x64@0.17.12", + "@esbuild/openbsd-x64": "@esbuild/openbsd-x64@0.17.12", + "@esbuild/sunos-x64": "@esbuild/sunos-x64@0.17.12", + "@esbuild/win32-arm64": "@esbuild/win32-arm64@0.17.12", + "@esbuild/win32-ia32": "@esbuild/win32-ia32@0.17.12", + "@esbuild/win32-x64": "@esbuild/win32-x64@0.17.12" + } + }, + "esbuild@0.17.13": { + "integrity": "sha512-4ixMwdErBcQHgTBeoxnowENCPKWFAGxgTyKHMK8gqn9sZaC7ZNWFKtim16g2rzQ2b/FYyy3lIUUJboFtjolhqg==", + "dependencies": { + "@esbuild/android-arm": "@esbuild/android-arm@0.17.13", + "@esbuild/android-arm64": "@esbuild/android-arm64@0.17.13", + "@esbuild/android-x64": "@esbuild/android-x64@0.17.13", + "@esbuild/darwin-arm64": "@esbuild/darwin-arm64@0.17.13", + "@esbuild/darwin-x64": "@esbuild/darwin-x64@0.17.13", + "@esbuild/freebsd-arm64": "@esbuild/freebsd-arm64@0.17.13", + "@esbuild/freebsd-x64": "@esbuild/freebsd-x64@0.17.13", + "@esbuild/linux-arm": "@esbuild/linux-arm@0.17.13", + "@esbuild/linux-arm64": "@esbuild/linux-arm64@0.17.13", + "@esbuild/linux-ia32": "@esbuild/linux-ia32@0.17.13", + "@esbuild/linux-loong64": "@esbuild/linux-loong64@0.17.13", + "@esbuild/linux-mips64el": "@esbuild/linux-mips64el@0.17.13", + "@esbuild/linux-ppc64": "@esbuild/linux-ppc64@0.17.13", + "@esbuild/linux-riscv64": "@esbuild/linux-riscv64@0.17.13", + "@esbuild/linux-s390x": "@esbuild/linux-s390x@0.17.13", + "@esbuild/linux-x64": "@esbuild/linux-x64@0.17.13", + "@esbuild/netbsd-x64": "@esbuild/netbsd-x64@0.17.13", + "@esbuild/openbsd-x64": "@esbuild/openbsd-x64@0.17.13", + "@esbuild/sunos-x64": "@esbuild/sunos-x64@0.17.13", + "@esbuild/win32-arm64": "@esbuild/win32-arm64@0.17.13", + "@esbuild/win32-ia32": "@esbuild/win32-ia32@0.17.13", + "@esbuild/win32-x64": "@esbuild/win32-x64@0.17.13" + } + }, + "esbuild@0.17.16": { + "integrity": "sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==", + "dependencies": { + "@esbuild/android-arm": "@esbuild/android-arm@0.17.16", + "@esbuild/android-arm64": "@esbuild/android-arm64@0.17.16", + "@esbuild/android-x64": "@esbuild/android-x64@0.17.16", + "@esbuild/darwin-arm64": "@esbuild/darwin-arm64@0.17.16", + "@esbuild/darwin-x64": "@esbuild/darwin-x64@0.17.16", + "@esbuild/freebsd-arm64": "@esbuild/freebsd-arm64@0.17.16", + "@esbuild/freebsd-x64": "@esbuild/freebsd-x64@0.17.16", + "@esbuild/linux-arm": "@esbuild/linux-arm@0.17.16", + "@esbuild/linux-arm64": "@esbuild/linux-arm64@0.17.16", + "@esbuild/linux-ia32": "@esbuild/linux-ia32@0.17.16", + "@esbuild/linux-loong64": "@esbuild/linux-loong64@0.17.16", + "@esbuild/linux-mips64el": "@esbuild/linux-mips64el@0.17.16", + "@esbuild/linux-ppc64": "@esbuild/linux-ppc64@0.17.16", + "@esbuild/linux-riscv64": "@esbuild/linux-riscv64@0.17.16", + "@esbuild/linux-s390x": "@esbuild/linux-s390x@0.17.16", + "@esbuild/linux-x64": "@esbuild/linux-x64@0.17.16", + "@esbuild/netbsd-x64": "@esbuild/netbsd-x64@0.17.16", + "@esbuild/openbsd-x64": "@esbuild/openbsd-x64@0.17.16", + "@esbuild/sunos-x64": "@esbuild/sunos-x64@0.17.16", + "@esbuild/win32-arm64": "@esbuild/win32-arm64@0.17.16", + "@esbuild/win32-ia32": "@esbuild/win32-ia32@0.17.16", + "@esbuild/win32-x64": "@esbuild/win32-x64@0.17.16" + } + }, + "esbuild@0.19.2": { + "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", + "dependencies": { + "@esbuild/android-arm": "@esbuild/android-arm@0.19.2", + "@esbuild/android-arm64": "@esbuild/android-arm64@0.19.2", + "@esbuild/android-x64": "@esbuild/android-x64@0.19.2", + "@esbuild/darwin-arm64": "@esbuild/darwin-arm64@0.19.2", + "@esbuild/darwin-x64": "@esbuild/darwin-x64@0.19.2", + "@esbuild/freebsd-arm64": "@esbuild/freebsd-arm64@0.19.2", + "@esbuild/freebsd-x64": "@esbuild/freebsd-x64@0.19.2", + "@esbuild/linux-arm": "@esbuild/linux-arm@0.19.2", + "@esbuild/linux-arm64": "@esbuild/linux-arm64@0.19.2", + "@esbuild/linux-ia32": "@esbuild/linux-ia32@0.19.2", + "@esbuild/linux-loong64": "@esbuild/linux-loong64@0.19.2", + "@esbuild/linux-mips64el": "@esbuild/linux-mips64el@0.19.2", + "@esbuild/linux-ppc64": "@esbuild/linux-ppc64@0.19.2", + "@esbuild/linux-riscv64": "@esbuild/linux-riscv64@0.19.2", + "@esbuild/linux-s390x": "@esbuild/linux-s390x@0.19.2", + "@esbuild/linux-x64": "@esbuild/linux-x64@0.19.2", + "@esbuild/netbsd-x64": "@esbuild/netbsd-x64@0.19.2", + "@esbuild/openbsd-x64": "@esbuild/openbsd-x64@0.19.2", + "@esbuild/sunos-x64": "@esbuild/sunos-x64@0.19.2", + "@esbuild/win32-arm64": "@esbuild/win32-arm64@0.19.2", + "@esbuild/win32-ia32": "@esbuild/win32-ia32@0.19.2", + "@esbuild/win32-x64": "@esbuild/win32-x64@0.19.2" + } + }, + "esbuild@0.19.3": { + "integrity": "sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw==", + "dependencies": { + "@esbuild/android-arm": "@esbuild/android-arm@0.19.3", + "@esbuild/android-arm64": "@esbuild/android-arm64@0.19.3", + "@esbuild/android-x64": "@esbuild/android-x64@0.19.3", + "@esbuild/darwin-arm64": "@esbuild/darwin-arm64@0.19.3", + "@esbuild/darwin-x64": "@esbuild/darwin-x64@0.19.3", + "@esbuild/freebsd-arm64": "@esbuild/freebsd-arm64@0.19.3", + "@esbuild/freebsd-x64": "@esbuild/freebsd-x64@0.19.3", + "@esbuild/linux-arm": "@esbuild/linux-arm@0.19.3", + "@esbuild/linux-arm64": "@esbuild/linux-arm64@0.19.3", + "@esbuild/linux-ia32": "@esbuild/linux-ia32@0.19.3", + "@esbuild/linux-loong64": "@esbuild/linux-loong64@0.19.3", + "@esbuild/linux-mips64el": "@esbuild/linux-mips64el@0.19.3", + "@esbuild/linux-ppc64": "@esbuild/linux-ppc64@0.19.3", + "@esbuild/linux-riscv64": "@esbuild/linux-riscv64@0.19.3", + "@esbuild/linux-s390x": "@esbuild/linux-s390x@0.19.3", + "@esbuild/linux-x64": "@esbuild/linux-x64@0.19.3", + "@esbuild/netbsd-x64": "@esbuild/netbsd-x64@0.19.3", + "@esbuild/openbsd-x64": "@esbuild/openbsd-x64@0.19.3", + "@esbuild/sunos-x64": "@esbuild/sunos-x64@0.19.3", + "@esbuild/win32-arm64": "@esbuild/win32-arm64@0.19.3", + "@esbuild/win32-ia32": "@esbuild/win32-ia32@0.19.3", + "@esbuild/win32-x64": "@esbuild/win32-x64@0.19.3" + } + }, + "escape-string-regexp@1.0.5": { + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dependencies": {} + }, + "escape-string-regexp@4.0.0": { + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dependencies": {} + }, + "eslint-config-prettier@8.8.0_eslint@8.36.0": { + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dependencies": { + "eslint": "eslint@8.36.0" + } + }, + "eslint-config-prettier@9.0.0_eslint@8.36.0": { + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "dependencies": { + "eslint": "eslint@8.36.0" + } + }, + "eslint-plugin-unicorn@46.0.0_eslint@8.36.0": { + "integrity": "sha512-j07WkC+PFZwk8J33LYp6JMoHa1lXc1u6R45pbSAipjpfpb7KIGr17VE2D685zCxR5VL4cjrl65kTJflziQWMDA==", + "dependencies": { + "@babel/helper-validator-identifier": "@babel/helper-validator-identifier@7.19.1", + "@eslint-community/eslint-utils": "@eslint-community/eslint-utils@4.3.0_eslint@8.36.0", + "ci-info": "ci-info@3.8.0", + "clean-regexp": "clean-regexp@1.0.0", + "eslint": "eslint@8.36.0", + "esquery": "esquery@1.5.0", + "indent-string": "indent-string@4.0.0", + "is-builtin-module": "is-builtin-module@3.2.1", + "jsesc": "jsesc@3.0.2", + "lodash": "lodash@4.17.21", + "pluralize": "pluralize@8.0.0", + "read-pkg-up": "read-pkg-up@7.0.1", + "regexp-tree": "regexp-tree@0.1.24", + "regjsparser": "regjsparser@0.9.1", + "safe-regex": "safe-regex@2.1.1", + "semver": "semver@7.3.8", + "strip-indent": "strip-indent@3.0.0" + } + }, + "eslint-plugin-unicorn@48.0.1_eslint@8.49.0": { + "integrity": "sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==", + "dependencies": { + "@babel/helper-validator-identifier": "@babel/helper-validator-identifier@7.22.20", + "@eslint-community/eslint-utils": "@eslint-community/eslint-utils@4.4.0_eslint@8.49.0", + "ci-info": "ci-info@3.8.0", + "clean-regexp": "clean-regexp@1.0.0", + "eslint": "eslint@8.49.0", + "esquery": "esquery@1.5.0", + "indent-string": "indent-string@4.0.0", + "is-builtin-module": "is-builtin-module@3.2.1", + "jsesc": "jsesc@3.0.2", + "lodash": "lodash@4.17.21", + "pluralize": "pluralize@8.0.0", + "read-pkg-up": "read-pkg-up@7.0.1", + "regexp-tree": "regexp-tree@0.1.27", + "regjsparser": "regjsparser@0.10.0", + "semver": "semver@7.5.4", + "strip-indent": "strip-indent@3.0.0" + } + }, + "eslint-scope@5.1.1": { + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "esrecurse@4.3.0", + "estraverse": "estraverse@4.3.0" + } + }, + "eslint-scope@7.1.1": { + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dependencies": { + "esrecurse": "esrecurse@4.3.0", + "estraverse": "estraverse@5.3.0" + } + }, + "eslint-scope@7.2.2": { + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": { + "esrecurse": "esrecurse@4.3.0", + "estraverse": "estraverse@5.3.0" + } + }, + "eslint-visitor-keys@3.3.0": { + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dependencies": {} + }, + "eslint-visitor-keys@3.4.3": { + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dependencies": {} + }, + "eslint@8.36.0": { + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "dependencies": { + "@eslint-community/eslint-utils": "@eslint-community/eslint-utils@4.3.0_eslint@8.36.0", + "@eslint-community/regexpp": "@eslint-community/regexpp@4.4.0", + "@eslint/eslintrc": "@eslint/eslintrc@2.0.1", + "@eslint/js": "@eslint/js@8.36.0", + "@humanwhocodes/config-array": "@humanwhocodes/config-array@0.11.8", + "@humanwhocodes/module-importer": "@humanwhocodes/module-importer@1.0.1", + "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", + "ajv": "ajv@6.12.6", + "chalk": "chalk@4.1.2", + "cross-spawn": "cross-spawn@7.0.3", + "debug": "debug@4.3.4", + "doctrine": "doctrine@3.0.0", + "escape-string-regexp": "escape-string-regexp@4.0.0", + "eslint-scope": "eslint-scope@7.1.1", + "eslint-visitor-keys": "eslint-visitor-keys@3.3.0", + "espree": "espree@9.5.0_acorn@8.8.2", + "esquery": "esquery@1.5.0", + "esutils": "esutils@2.0.3", + "fast-deep-equal": "fast-deep-equal@3.1.3", + "file-entry-cache": "file-entry-cache@6.0.1", + "find-up": "find-up@5.0.0", + "glob-parent": "glob-parent@6.0.2", + "globals": "globals@13.20.0", + "grapheme-splitter": "grapheme-splitter@1.0.4", + "ignore": "ignore@5.2.4", + "import-fresh": "import-fresh@3.3.0", + "imurmurhash": "imurmurhash@0.1.4", + "is-glob": "is-glob@4.0.3", + "is-path-inside": "is-path-inside@3.0.3", + "js-sdsl": "js-sdsl@4.4.0", + "js-yaml": "js-yaml@4.1.0", + "json-stable-stringify-without-jsonify": "json-stable-stringify-without-jsonify@1.0.1", + "levn": "levn@0.4.1", + "lodash.merge": "lodash.merge@4.6.2", + "minimatch": "minimatch@3.1.2", + "natural-compare": "natural-compare@1.4.0", + "optionator": "optionator@0.9.1", + "strip-ansi": "strip-ansi@6.0.1", + "strip-json-comments": "strip-json-comments@3.1.1", + "text-table": "text-table@0.2.0" + } + }, + "eslint@8.49.0": { + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "dependencies": { + "@eslint-community/eslint-utils": "@eslint-community/eslint-utils@4.3.0_eslint@8.49.0", + "@eslint-community/regexpp": "@eslint-community/regexpp@4.8.1", + "@eslint/eslintrc": "@eslint/eslintrc@2.1.2", + "@eslint/js": "@eslint/js@8.49.0", + "@humanwhocodes/config-array": "@humanwhocodes/config-array@0.11.11", + "@humanwhocodes/module-importer": "@humanwhocodes/module-importer@1.0.1", + "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", + "ajv": "ajv@6.12.6", + "chalk": "chalk@4.1.2", + "cross-spawn": "cross-spawn@7.0.3", + "debug": "debug@4.3.4", + "doctrine": "doctrine@3.0.0", + "escape-string-regexp": "escape-string-regexp@4.0.0", + "eslint-scope": "eslint-scope@7.2.2", + "eslint-visitor-keys": "eslint-visitor-keys@3.4.3", + "espree": "espree@9.6.1_acorn@8.10.0", + "esquery": "esquery@1.5.0", + "esutils": "esutils@2.0.3", + "fast-deep-equal": "fast-deep-equal@3.1.3", + "file-entry-cache": "file-entry-cache@6.0.1", + "find-up": "find-up@5.0.0", + "glob-parent": "glob-parent@6.0.2", + "globals": "globals@13.20.0", + "graphemer": "graphemer@1.4.0", + "ignore": "ignore@5.2.4", + "imurmurhash": "imurmurhash@0.1.4", + "is-glob": "is-glob@4.0.3", + "is-path-inside": "is-path-inside@3.0.3", + "js-yaml": "js-yaml@4.1.0", + "json-stable-stringify-without-jsonify": "json-stable-stringify-without-jsonify@1.0.1", + "levn": "levn@0.4.1", + "lodash.merge": "lodash.merge@4.6.2", + "minimatch": "minimatch@3.1.2", + "natural-compare": "natural-compare@1.4.0", + "optionator": "optionator@0.9.3", + "strip-ansi": "strip-ansi@6.0.1", + "text-table": "text-table@0.2.0" + } + }, + "espree@9.5.0_acorn@8.8.2": { + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "dependencies": { + "acorn": "acorn@8.8.2", + "acorn-jsx": "acorn-jsx@5.3.2_acorn@8.8.2", + "eslint-visitor-keys": "eslint-visitor-keys@3.3.0" + } + }, + "espree@9.6.1_acorn@8.10.0": { + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "acorn@8.10.0", + "acorn-jsx": "acorn-jsx@5.3.2_acorn@8.10.0", + "eslint-visitor-keys": "eslint-visitor-keys@3.4.3" + } + }, + "esquery@1.5.0": { + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "estraverse@5.3.0" + } + }, + "esrecurse@4.3.0": { + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "estraverse@5.3.0" + } + }, + "estraverse@4.3.0": { + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dependencies": {} + }, + "estraverse@5.3.0": { + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dependencies": {} + }, + "esutils@2.0.3": { + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dependencies": {} + }, + "fast-deep-equal@3.1.3": { + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dependencies": {} + }, + "fast-glob@3.2.12": { + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", + "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", + "glob-parent": "glob-parent@5.1.2", + "merge2": "merge2@1.4.1", + "micromatch": "micromatch@4.0.5" + } + }, + "fast-json-stable-stringify@2.1.0": { + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dependencies": {} + }, + "fast-levenshtein@2.0.6": { + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dependencies": {} + }, + "fastq@1.15.0": { + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "reusify@1.0.4" + } + }, + "file-entry-cache@6.0.1": { + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "flat-cache@3.0.4" + } + }, + "fill-range@7.0.1": { + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "to-regex-range@5.0.1" + } + }, + "find-up@4.1.0": { + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "locate-path@5.0.0", + "path-exists": "path-exists@4.0.0" + } + }, + "find-up@5.0.0": { + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "locate-path@6.0.0", + "path-exists": "path-exists@4.0.0" + } + }, + "flat-cache@3.0.4": { + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "flatted@3.2.7", + "rimraf": "rimraf@3.0.2" + } + }, + "flatted@3.2.7": { + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dependencies": {} + }, + "fs.realpath@1.0.0": { + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dependencies": {} + }, + "function-bind@1.1.1": { + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dependencies": {} + }, + "glob-parent@5.1.2": { + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "is-glob@4.0.3" + } + }, + "glob-parent@6.0.2": { + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "is-glob@4.0.3" + } + }, + "glob@7.2.3": { + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "fs.realpath@1.0.0", + "inflight": "inflight@1.0.6", + "inherits": "inherits@2.0.4", + "minimatch": "minimatch@3.1.2", + "once": "once@1.4.0", + "path-is-absolute": "path-is-absolute@1.0.1" + } + }, + "globals@13.20.0": { + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "type-fest@0.20.2" + } + }, + "globby@11.1.0": { + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "array-union@2.1.0", + "dir-glob": "dir-glob@3.0.1", + "fast-glob": "fast-glob@3.2.12", + "ignore": "ignore@5.2.4", + "merge2": "merge2@1.4.1", + "slash": "slash@3.0.0" + } + }, + "grapheme-splitter@1.0.4": { + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dependencies": {} + }, + "graphemer@1.4.0": { + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dependencies": {} + }, + "has-flag@3.0.0": { + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dependencies": {} + }, + "has-flag@4.0.0": { + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dependencies": {} + }, + "has@1.0.3": { + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "function-bind@1.1.1" + } + }, + "hosted-git-info@2.8.9": { + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dependencies": {} + }, + "ignore@5.2.4": { + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dependencies": {} + }, + "import-fresh@3.3.0": { + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "parent-module@1.0.1", + "resolve-from": "resolve-from@4.0.0" + } + }, + "imurmurhash@0.1.4": { + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dependencies": {} + }, + "indent-string@4.0.0": { + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dependencies": {} + }, + "inflight@1.0.6": { + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "once@1.4.0", + "wrappy": "wrappy@1.0.2" + } + }, + "inherits@2.0.4": { + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dependencies": {} + }, + "is-arrayish@0.2.1": { + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dependencies": {} + }, + "is-builtin-module@3.2.1": { + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dependencies": { + "builtin-modules": "builtin-modules@3.3.0" + } + }, + "is-core-module@2.11.0": { + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "has@1.0.3" + } + }, + "is-extglob@2.1.1": { + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dependencies": {} + }, + "is-glob@4.0.3": { + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "is-extglob@2.1.1" + } + }, + "is-number@7.0.0": { + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dependencies": {} + }, + "is-path-inside@3.0.3": { + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dependencies": {} + }, + "isexe@2.0.0": { + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dependencies": {} + }, + "js-sdsl@4.4.0": { + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dependencies": {} + }, + "js-tokens@4.0.0": { + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dependencies": {} + }, + "js-yaml@4.1.0": { + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "argparse@2.0.1" + } + }, + "jsesc@0.5.0": { + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dependencies": {} + }, + "jsesc@3.0.2": { + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dependencies": {} + }, + "json-parse-even-better-errors@2.3.1": { + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dependencies": {} + }, + "json-schema-traverse@0.4.1": { + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dependencies": {} + }, + "json-stable-stringify-without-jsonify@1.0.1": { + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dependencies": {} + }, + "levn@0.4.1": { + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "prelude-ls@1.2.1", + "type-check": "type-check@0.4.0" + } + }, + "lines-and-columns@1.2.4": { + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dependencies": {} + }, + "locate-path@5.0.0": { + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "p-locate@4.1.0" + } + }, + "locate-path@6.0.0": { + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "p-locate@5.0.0" + } + }, + "lodash.merge@4.6.2": { + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dependencies": {} + }, + "lodash@4.17.21": { + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dependencies": {} + }, + "lru-cache@6.0.0": { + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "yallist@4.0.0" + } + }, + "merge2@1.4.1": { + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dependencies": {} + }, + "micromatch@4.0.5": { + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "braces@3.0.2", + "picomatch": "picomatch@2.3.1" + } + }, + "min-indent@1.0.1": { + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dependencies": {} + }, + "minimatch@3.1.2": { + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "brace-expansion@1.1.11" + } + }, + "ms@2.1.2": { + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dependencies": {} + }, + "natural-compare-lite@1.4.0": { + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dependencies": {} + }, + "natural-compare@1.4.0": { + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dependencies": {} + }, + "normalize-package-data@2.5.0": { + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "hosted-git-info@2.8.9", + "resolve": "resolve@1.22.1", + "semver": "semver@5.7.1", + "validate-npm-package-license": "validate-npm-package-license@3.0.4" + } + }, + "once@1.4.0": { + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "wrappy@1.0.2" + } + }, + "optionator@0.9.1": { + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "deep-is": "deep-is@0.1.4", + "fast-levenshtein": "fast-levenshtein@2.0.6", + "levn": "levn@0.4.1", + "prelude-ls": "prelude-ls@1.2.1", + "type-check": "type-check@0.4.0", + "word-wrap": "word-wrap@1.2.3" + } + }, + "optionator@0.9.3": { + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "@aashutoshrathi/word-wrap@1.2.6", + "deep-is": "deep-is@0.1.4", + "fast-levenshtein": "fast-levenshtein@2.0.6", + "levn": "levn@0.4.1", + "prelude-ls": "prelude-ls@1.2.1", + "type-check": "type-check@0.4.0" + } + }, + "p-limit@2.3.0": { + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "p-try@2.2.0" + } + }, + "p-limit@3.1.0": { + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "yocto-queue@0.1.0" + } + }, + "p-locate@4.1.0": { + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "p-limit@2.3.0" + } + }, + "p-locate@5.0.0": { + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "p-limit@3.1.0" + } + }, + "p-try@2.2.0": { + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dependencies": {} + }, + "parent-module@1.0.1": { + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "callsites@3.1.0" + } + }, + "parse-json@5.2.0": { + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "@babel/code-frame@7.18.6", + "error-ex": "error-ex@1.3.2", + "json-parse-even-better-errors": "json-parse-even-better-errors@2.3.1", + "lines-and-columns": "lines-and-columns@1.2.4" + } + }, + "path-exists@4.0.0": { + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dependencies": {} + }, + "path-is-absolute@1.0.1": { + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dependencies": {} + }, + "path-key@3.1.1": { + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dependencies": {} + }, + "path-parse@1.0.7": { + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dependencies": {} + }, + "path-type@4.0.0": { + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dependencies": {} + }, + "picomatch@2.3.1": { + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dependencies": {} + }, + "pluralize@8.0.0": { + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dependencies": {} + }, + "prelude-ls@1.2.1": { + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dependencies": {} + }, + "prettier@2.8.6": { + "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", + "dependencies": {} + }, + "prettier@3.0.3": { + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dependencies": {} + }, + "punycode@2.3.0": { + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dependencies": {} + }, + "queue-microtask@1.2.3": { + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dependencies": {} + }, + "read-pkg-up@7.0.1": { + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "find-up@4.1.0", + "read-pkg": "read-pkg@5.2.0", + "type-fest": "type-fest@0.8.1" + } + }, + "read-pkg@5.2.0": { + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "@types/normalize-package-data@2.4.1", + "normalize-package-data": "normalize-package-data@2.5.0", + "parse-json": "parse-json@5.2.0", + "type-fest": "type-fest@0.6.0" + } + }, + "regexp-tree@0.1.24": { + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "dependencies": {} + }, + "regexp-tree@0.1.27": { + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dependencies": {} + }, + "regjsparser@0.10.0": { + "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", + "dependencies": { + "jsesc": "jsesc@0.5.0" + } + }, + "regjsparser@0.9.1": { + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "jsesc@0.5.0" + } + }, + "resolve-from@4.0.0": { + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dependencies": {} + }, + "resolve@1.22.1": { + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "is-core-module@2.11.0", + "path-parse": "path-parse@1.0.7", + "supports-preserve-symlinks-flag": "supports-preserve-symlinks-flag@1.0.0" + } + }, + "reusify@1.0.4": { + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dependencies": {} + }, + "rimraf@3.0.2": { + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "glob@7.2.3" + } + }, + "run-parallel@1.2.0": { + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dependencies": { + "queue-microtask": "queue-microtask@1.2.3" + } + }, + "safe-regex@2.1.1": { + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dependencies": { + "regexp-tree": "regexp-tree@0.1.24" + } + }, + "semver@5.7.1": { + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dependencies": {} + }, + "semver@7.3.8": { + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "lru-cache@6.0.0" + } + }, + "semver@7.5.4": { + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "lru-cache@6.0.0" + } + }, + "shebang-command@2.0.0": { + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "shebang-regex@3.0.0" + } + }, + "shebang-regex@3.0.0": { + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dependencies": {} + }, + "slash@3.0.0": { + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dependencies": {} + }, + "spdx-correct@3.2.0": { + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "spdx-expression-parse@3.0.1", + "spdx-license-ids": "spdx-license-ids@3.0.13" + } + }, + "spdx-exceptions@2.3.0": { + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dependencies": {} + }, + "spdx-expression-parse@3.0.1": { + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "spdx-exceptions@2.3.0", + "spdx-license-ids": "spdx-license-ids@3.0.13" + } + }, + "spdx-license-ids@3.0.13": { + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dependencies": {} + }, + "strip-ansi@6.0.1": { + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "ansi-regex@5.0.1" + } + }, + "strip-indent@3.0.0": { + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "min-indent@1.0.1" + } + }, + "strip-json-comments@3.1.1": { + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dependencies": {} + }, + "supports-color@5.5.0": { + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "has-flag@3.0.0" + } + }, + "supports-color@7.2.0": { + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "has-flag@4.0.0" + } + }, + "supports-preserve-symlinks-flag@1.0.0": { + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dependencies": {} + }, + "text-table@0.2.0": { + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dependencies": {} + }, + "to-regex-range@5.0.1": { + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "is-number@7.0.0" + } + }, + "ts-api-utils@1.0.3_typescript@5.0.2": { + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dependencies": { + "typescript": "typescript@5.0.2" + } + }, + "tsc@2.0.4": { + "integrity": "sha512-fzoSieZI5KKJVBYGvwbVZs/J5za84f2lSTLPYf6AGiIf43tZ3GNrI1QzTLcjtyDDP4aLxd46RTZq1nQxe7+k5Q==", + "dependencies": {} + }, + "tslib@1.14.1": { + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dependencies": {} + }, + "tsutils@3.21.0_typescript@5.0.2": { + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "tslib@1.14.1", + "typescript": "typescript@5.0.2" + } + }, + "type-check@0.4.0": { + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "prelude-ls@1.2.1" + } + }, + "type-fest@0.20.2": { + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dependencies": {} + }, + "type-fest@0.6.0": { + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dependencies": {} + }, + "type-fest@0.8.1": { + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dependencies": {} + }, + "typescript@5.0.2": { + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dependencies": {} + }, + "typescript@5.2.2": { + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dependencies": {} + }, + "uri-js@4.4.1": { + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "punycode@2.3.0" + } + }, + "validate-npm-package-license@3.0.4": { + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "spdx-correct@3.2.0", + "spdx-expression-parse": "spdx-expression-parse@3.0.1" + } + }, + "which@2.0.2": { + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "isexe@2.0.0" + } + }, + "word-wrap@1.2.3": { + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dependencies": {} + }, + "wrappy@1.0.2": { + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dependencies": {} + }, + "yallist@4.0.0": { + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dependencies": {} + }, + "yocto-queue@0.1.0": { + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dependencies": {} + } + } + } +} diff --git a/esbuild.ts b/esbuild.ts new file mode 100644 index 0000000..c3971c3 --- /dev/null +++ b/esbuild.ts @@ -0,0 +1,12 @@ +import { build } from "npm:esbuild" +await build({ + entryPoints: ["src/poggies.ts"], + outfile: "dist/poggies.js", + format: "esm", + bundle: true, + treeShaking: true, + external: ["node:fs"], + minify: true, +}) + +import("npm:typescript/lib/tsc.js") // fun way to run `tsc` to generate types diff --git a/package.json b/package.json index 5d3d309..fe21dc3 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,15 @@ { "name": "poggies", - "version": "1.2.1", + "version": "2.0.0", "description": "A simple JavaScript templating engine", - "main": "./dist/poggies.js", - "types": "./dist/poggies.d.ts", - "repository": "github:tbhmens/poggies", - "exports": { - "import": "./dist/poggies.js" + "main": "dist/poggies.js", + "types": "dist/poggies.d.ts", + "repository": "github:esthedebeste/poggies", + "scripts": { + "prepack": "deno task build" }, "type": "module", - "author": "tbhmens", + "author": "esthedebeste", "license": "MIT", "keywords": [ "templating", @@ -17,28 +17,19 @@ "template", "engine" ], - "bugs": { - "url": "https://github.com/tbhmens/poggies/issues" - }, "files": [ - "dist/**/*.js", - "dist/poggies.d.ts" + "dist/poggies.*" ], - "homepage": "https://github.com/tbhmens/poggies#readme", - "scripts": { - "build": "tsc && prettier -w ./dist", - "prepack": "npm run build", - "test": "tsm ./test/test.ts" - }, + "bugs": "https://github.com/esthedebeste/poggies/issues", + "homepage": "https://github.com/esthedebeste/poggies#readme", "devDependencies": { - "@types/node": "^16.11.9", - "@typescript-eslint/eslint-plugin": "^5.4.0", - "@typescript-eslint/parser": "^5.4.0", - "eslint": "^8.3.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-unicorn": "^39.0.0", - "prettier": "^2.4.1", - "tsm": "^2.1.4", - "typescript": "^4.5.2" + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", + "esbuild": "^0.19.3", + "eslint": "^8.49.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-unicorn": "^48.0.1", + "prettier": "^3.0.3", + "typescript": "^5.2.2" } } diff --git a/readme.md b/readme.md index c1d3224..0735b9e 100644 --- a/readme.md +++ b/readme.md @@ -2,19 +2,43 @@ # poggies -Poggies is a simple 0-dependencies HTML templating engine, with a very simple syntax. +Poggies is a simple 0-dependencies HTML templating engine, with a very simple +syntax. + +```poggies +!doctype(html) +html(lang=en-US) { + head { + title "Example Page" + style " + #header{ + text-align: center; + } + .red{ + color: red; + } + " + } + body { + h1#header.red(onclick="alert('Hi')") "Hello World!" + br + span ":)" + } +} +``` ## Usage Using Poggies comes in two steps: Initializating a document and Rendering it. -You can initialize a document using `new Poggies()`. After this, you can render the document using `Poggies.render()` +You can initialize a document using `new Poggies()`. After this, you can +render the document using `Poggies.render()` ```js -import { Poggies } from "poggies"; -const hello = new Poggies('h1(class="red bold")[Hello World!]'); -const html = await hello.render(); -console.log(html); +import { Poggies } from "poggies" +const hello = new Poggies('h1(class="red bold") "Hello World!"') +const html = await hello.render() +console.log(html) ``` This will log: @@ -23,46 +47,23 @@ This will log:

Hello World!

``` -You can also use renderFile, which renders the contents of a file (hello.pog containing your poggies code, of course): +You can also use renderFile, which renders the contents of a file (hello.pog +containing your poggies code, of course): ```js -import { renderFile } from "poggies"; -const html = await renderFile("hello.pog"); -console.log(html); +import { renderFile } from "poggies" +const html = await renderFile("hello.pog") +console.log(html) ``` ## Syntax -Basic example document: - -``` -!doctype(html) -html(lang=en-US){ - head{ - title[Example Page] - style[ - #header{ - text-align: center; - } - .red{ - color: red; - } - ] - } - body{ - h1#header.red(onclick="alert('Hi')")[Hello World!] - br - span[:)] - } -} -``` - Poggies also supports JavaScript in the templates (and async/await syntax!) -To add dynamic elements to your page, add a > like so: +To add dynamic elements to your page, you can use template strings! ``` -h1(class="red bold")[>`six plus six is ${6+6}`] +h1(class="red bold") `six plus six is ${6+6}` ``` Which, when rendered, will evaluate to @@ -71,17 +72,19 @@ Which, when rendered, will evaluate to

six plus six is 12

``` -You can also input variables into the rendering process! This is done by adding an extra argument into `Poggies.render()`! +You can also input variables into the rendering process! This is done by adding +an extra argument into `Poggies.render()`! ```js -const hello = new Poggies( - 'h1(class="red bold")[>`${first} plus ${second} is ${first+second}`]' -); +// poggies +h1(class="red bold") `${first} plus ${second} is ${first+second}` + +// js const html = await hello.render({ first: 12, second: 26, -}); -console.log(html); +}) +console.log(html) ``` This will evaluate to @@ -90,7 +93,11 @@ This will evaluate to

12 plus 26 is 38

``` -Custom variables also work with renderFile of course, just input your variables into renderFile's second argument :D +Custom variables also work with renderFile of course, + +```tsx +await renderFile("hello.pog", { first: 12, second: 26 }) +``` ### Dynamic Elements @@ -98,74 +105,89 @@ You can add Elements to the children of an object dynamically! #### `For` example: -```js -import { Poggies } from "poggies"; -const wow = new Poggies("div[For ]word]>"); -const html = await wow.render({ +```tsx +// wow.pog +div[For ]{ + for(word of words) `${word}` +} +// js +const html = await renderFile("./wow.pog", { words: ["loops ", "are ", "cool"], -}); -console.log(html); -``` - -Will loop over the `words` array and display each word! Result: - -```html +}) +// html output
For loops are cool
``` -
For loops are cool
- #### `If` example: -```js -import { Poggies } from "poggies"; -const wow = new Poggies(` -span`); -const html = await wow.render({ - chance: Math.random() < 0.5, -}); -console.log(html); -``` - -Will give you a 50% chance of seeing "You got it!" Result: - -`` OR `You got it!` +```tsx +// chance.pog +span { + if(chance) "You got it!" + else ":(" +} +// js +const html = await renderFile("./chance.pog", { + chance: Math.random() < 0.5, +}) +// html output You got it! +// or :( +``` ### Templates -Poggies supports templates, which allow for easier repetition of elements. -To create a template, you can add a $ sign to the beginning of your element at the top level. -For Example: +Poggies supports templates, which allow for easier repetition of elements. To +create a template, you can add `$$` to the beginning of your element. For Example: -``` -$row(name addr){ +```tsx +// declare the template with $$row +$$row(name thebest){ tr{ - td.name[>name] - td.addr[>addr] + td.name `${name}` + td(class=(thebest ? "thebest" : "notthebest")) { + if(thebest) "The Best :D" + else "Not the Best :(" + } } } -table{ - $row(name="1st" addr="2nd") +table { + for(user of users){ + // use the template with $row + $row(name=(user.name) thebest=(user.thebest)) + } } +// html output + + + + + + + + + +
Esthe de BesteThe Best :D
John DoeNot the Best :(
``` -


+


### Extras -peepoClap You made it to the bottom of the README, it's time for some neat extras! +peepoClap +You made it to the bottom of the readme, it's time for some neat extras! -- Poggies syntax also supports # and . as shorthands for class and id! (They kind of look like CSS selectors) - Example: +- Poggies syntax also supports # and . as shorthands for class and id! (They + kind of look like CSS selectors) Example: `h1#woah.red.bold[I'm red, I'm bold, and my ID is woah!]` -- Attributes can have no value, just like in normal HTML! For example: +- Attributes can have no value, just like in normal HTML! For example: `h1(hidden)[You can't see me]` -- If an attribute doesn't contain any spaces, you can insert it without quotes, - `a(href=https://example.com/)[like this!]` - PS, if it does contain a ), this won't work -- You can stack [], {}, and <>! For example, to put a line break in the middle of a span: - `span[Line 1]{br}[Line 2]` ==> `Line 1
Line 2
` -- renderFile caches files, so your poor CPU doesn't have to parse everything again! - In a small test this lead to a huge ~3.6ms to ~0.015ms improvement! +- If an attribute doesn't contain any spaces, you can insert it without quotes, + `a(href=https://example.com/)[like this!]` + PS, if it does contain a ), this won't work of course. +- You can stack quotes and {}! For example, to put a line break in the middle + of a span: `span "Line 1"{br}"Line 2"` ==> `Line 1
Line 2
` +- renderFile caches files, so your poor CPU doesn't have to parse everything + again! In a small test this lead to a huge ~3.6ms to ~0.015ms improvement! +- Poggies is deno-, node-, and browser-compatible! diff --git a/src/element.ts b/src/element.ts index 052efd2..247dc0a 100644 --- a/src/element.ts +++ b/src/element.ts @@ -1,5 +1,6 @@ -import { ChildNodes, JSONify, Node } from "./nodes.js"; -import { isTag, isWS, jsonifyfunc, outvar } from "./utils.js"; +import { ChildNodes, Node } from "./nodes.ts" +import { Reader } from "./reader.ts" +import { isWS, outvar } from "./utils.ts" /** Elements that shouldn't have a closing tag */ const voidElements = new Set([ @@ -17,178 +18,151 @@ const voidElements = new Set([ "keygen", "source", "!doctype", -]); +]) class Attribute { - constructor(public value: string) {} - jsify() { - return JSONify(this.value); - } - /** adds a string to the end of the attribute */ - add(value: string) { - this.value += " " + value; - } -} -class DynamicAttribute { constructor(public code: string) {} jsify() { - return this.code; + return this.code } - /** adds a string to the end of the attribute */ + /** adds ` ${value}` to the end of the attribute */ add(value: string) { - this.code = `(${this.code}) + ${JSONify(value)}`; + this.code = `(${this.code})+${JSON.stringify(` ${value}`)}` } } + class Flag { jsify() { - return "true"; + return "true" } } -const parseAttributes = (source: string, index: number) => { - const attributes: Record = {}; - while (index < source.length) { - while (isWS(source[index]) && index < source.length) index++; - if (source[index] === ")") { - index++; - break; +function parseAttributes(reader: Reader) { + const attributes: Record< + string, + Attribute | Flag + > = {} + while (!reader.eof()) { + reader.whitespace() + if (reader.peek() === ")") { + reader.skip(1) + break } - let key = ""; - for (; index < source.length && isTag(source[index]); index++) - key += source[index]; - while (isWS(source[index]) && index < source.length) index++; - let value = ""; - let type: typeof Attribute | typeof DynamicAttribute | typeof Flag = Flag; - if (source[index] === "=") { - type = Attribute; - index++; - if (source[index] === ">") { - type = DynamicAttribute; - index++; + const key = reader.tag() + reader.whitespace() + if (reader.peek() === "=") { + reader.skip(1) + } else { + attributes[key] = new Flag() + continue + } // skip = + reader.whitespace() + switch (reader.peek()) { + case '"': + case "'": + case "`": + case "[": + case "(": { + const expression = reader.jsExpression() + attributes[key] = new Attribute(expression) + break } - let singleWord = true; - if (source[index] === '"') { - singleWord = false; - index++; + case "{": { + const expression = reader.jsExpression().slice(1, -1) + attributes[key] = new Attribute(expression) + break } - let escape = 0; - for (; index < source.length; index++) { - if (source[index] === "\\") escape++; - else if (singleWord && (source[index] === ")" || isWS(source[index]))) - break; - else if (source[index] === `"` && escape % 2 === 0) { - index++; - break; - } else if (escape - 1 > 0) { - value += "\\".repeat(escape / 2); - escape = 0; - value += source[index]; - } else value += source[index]; + default: // single word string + { + const string = reader.collect((char) => !(isWS(char) || char === ")")) + attributes[key] = new Attribute(JSON.stringify(string)) } } - attributes[key] = new type(value); } - return { attributes, index }; -}; -const isAttr = (kv: [string, any]): kv is [string, Attribute] => - kv[1] instanceof Attribute; -const isDynAttr = (kv: [string, any]): kv is [string, DynamicAttribute] => - kv[1] instanceof DynamicAttribute; -const isFlag = (kv: [string, any]): kv is [string, Flag] => - kv[1] instanceof Flag; + return attributes +} + export class VoidElement implements Node { constructor( public tag: string, - public attrs: Record + public attributes: Record< + string, + Attribute | Flag + >, ) {} jsify() { - const attrs = Object.entries(this.attrs); - if (attrs.length === 0) - return { multiline: false, code: JSON.stringify(`<${this.tag}>`) }; - const staticAttrs = - attrs - .filter(isAttr) - .map(([name, attr]) => ` ${name}=${attr.jsify()}`) - .join("") + - attrs - .filter(isFlag) - .map(([name]) => ` ${name}`) - .join(""); - const dynAttrs = attrs.filter(isDynAttr); - if (dynAttrs.length === 0) - return { - multiline: false, - code: JSON.stringify(`<${this.tag}${staticAttrs}>`), - }; - let code = JSON.stringify(`<${this.tag}${staticAttrs}`); - for (const [name, attr] of dynAttrs) - code += `+${JSONify(` ${name}=`)}+${jsonifyfunc}(${attr.jsify()})`; - code += '+">"'; - return { multiline: false, code }; + const attributes = Object.entries(this.attributes) + if (attributes.length === 0) { + return { multiline: false, code: JSON.stringify(`<${this.tag}>`) } + } + let code = JSON.stringify(`<${this.tag}`) + for (const [name, attribute] of attributes) { + code += attribute instanceof Flag + ? `+${JSON.stringify(` ${name}`)}` + : `+${JSON.stringify(` ${name}="`)}+${attribute.jsify()}+'"'` + } + code += '+">"' + return { multiline: false, code } } } export class Element extends VoidElement { constructor( public tag: string, - public attrs: Record, - public children: ChildNodes + public attributes: Record, + public children: ChildNodes, ) { - super(tag, attrs); + super(tag, attributes) } jsify() { - const { code } = super.jsify(); - const { multiline, code: childCode } = this.children.jsify(); - if (childCode.length === 0) - return { multiline, code: code + "+" + JSONify(``) }; + const { code } = super.jsify() + const { multiline, code: childCode } = this.children.jsify() + if (childCode.length === 0) { + return { multiline, code: code + "+" + JSON.stringify(``) } + } return { multiline, code: multiline - ? `${outvar}+=${code};${childCode}${outvar} += ${JSONify( - `` - )};` - : `${code}+${childCode}+${JSONify(``)}`, - }; + ? `${outvar}+=${code};${childCode}${outvar} += ${ + JSON.stringify( + ``, + ) + };` + : `${code}+${childCode}+${JSON.stringify(``)}`, + } } - static from( - source: string, - index: number, - isVoid = false - ): { node: VoidElement | Element; index: number } { - const len = source.length; - let tag = ""; - for (; index < len && isTag(source[index]); index++) tag += source[index]; - let attrs: Record = {}; - while ("(.#".includes(source[index])) { - if (source[index] === "(") { - index++; - let attributes: Record; - ({ attributes, index } = parseAttributes(source, index)); - attrs = { ...attrs, ...attributes }; - } else if (source[index] === ".") { - index++; - let clazz = ""; - for (; index < len && isTag(source[index]); index++) - clazz += source[index]; - if (attrs.class == null) attrs.class = new Attribute(clazz); - else if (attrs.class instanceof Flag) - attrs.class = new Attribute(clazz); - else attrs.class.add(clazz); - } else if (source[index] === "#") { - index++; - let id = ""; - for (; index < len && isTag(source[index]); index++) - id += source[index]; - attrs.id = new Attribute(id); + static from(tag: string, reader: Reader, isVoid = false): VoidElement | Element { + let attributes_: Record = {} + while ("(.#".includes(reader.peek())) { + switch (reader.peek()) { + case "(": { + reader.skip(1) + const attributes = parseAttributes(reader) + attributes_ = { ...attributes_, ...attributes } + break + } + case ".": { + reader.skip(1) + const clazz = reader.tag() + if (attributes_.class == undefined) attributes_.class = new Attribute(JSON.stringify(clazz)) + else if (attributes_.class instanceof Flag) { + attributes_.class = new Attribute(JSON.stringify(clazz)) + } else attributes_.class.add(clazz) + break + } + case "#": { + reader.skip(1) + const id = reader.tag() + attributes_.id = new Attribute(JSON.stringify(id)) + break + } + // No default } } - while (isWS(source[index]) && index < len) index++; - let children: ChildNodes; - ({ children, index } = ChildNodes.from(source, index)); - if (isVoid || voidElements.has(tag.toLowerCase())) - if (children.nodes.length > 0) - throw new Error(`${tag} cannot have children`); - else return { node: new VoidElement(tag, attrs), index }; - return { - node: new Element(tag, attrs, children), - index, - }; + reader.whitespace() + const children = ChildNodes.from(reader) + if (isVoid || voidElements.has(tag.toLowerCase())) { + if (children.nodes.length > 0) { + throw new Error(`${tag} cannot have children`) + } else return new VoidElement(tag, attributes_) + } + return new Element(tag, attributes_, children) } } diff --git a/src/nodes.ts b/src/nodes.ts index 6c3cd77..6eab5dd 100644 --- a/src/nodes.ts +++ b/src/nodes.ts @@ -1,158 +1,154 @@ -import { Element } from "./element.js"; -import { Template, TemplateUsage } from "./templating.js"; -import { isTag, isWS, outvar } from "./utils.js"; +import { Element } from "./element.ts" +import { Reader } from "./reader.ts" +import { TemplateDeclaration, TemplateUsage } from "./templating.ts" +import { escapeHTML, escapehtmlfunc, escapeJSON, isTag, outvar } from "./utils.ts" -export interface Node { - jsify(): { - multiline: boolean; - code: string; - }; +export interface JsifyResult { + multiline: boolean + code: string } -export const multilinify = (js: ReturnType): string => - js.multiline ? js.code : `${outvar}+=${js.code};`; -export const JSONify = (str: string) => JSON.stringify(str); -class Text implements Node { - constructor(public text: string) {} - jsify() { - return { multiline: false, code: JSONify(this.text) }; - } - static from(source: string, index: number) { - const endI = source.indexOf("]", index); - return { index: endI, node: new Text(source.slice(index, endI)) }; - } +export interface Node { + jsify(): JsifyResult } +export const multilinify = (js: JsifyResult): string => js.multiline ? js.code : `${outvar}+=${js.code};` class DynamicText implements Node { constructor(public code: string) {} jsify() { - return { multiline: false, code: this.code }; - } - static from(source: string, index: number) { - const endI = source.indexOf("]", index); - return { - index: endI, - node: new DynamicText(source.slice(index, endI)), - }; + return { multiline: false, code: this.code } } } class Dynamic implements Node { + static readonly dynamics = new Set(["if", "else", "for"]) constructor( public type: string, public declaration: string, - public children: ChildNodes + public children: ChildNodes, ) {} jsify() { - let code = - this.type === "for" && !/^\s*.+\s+(of|in)\s+/.test(this.declaration) - ? // Prevent for...of and for...in from leaking into global scope - `for (let ${this.declaration}) {` - : `${this.type} (${this.declaration}) {`; - code += multilinify(this.children.jsify()); - code += "}"; - return { multiline: true, code }; + let code = this.type === "for" && !/^\s*.+\s+(of|in)\s+/.test(this.declaration) + // Prevent for...of and for...in from leaking into global scope + ? `for(let ${this.declaration}){` + : `${this.type}(${this.declaration}){` + code += multilinify(this.children.jsify()) + code += "}" + return { multiline: true, code } } - static from(source: string, index: number) { - const len = source.length; - let type = ""; - for (; index < len && isTag(source[index]); index++) type += source[index]; - while (isWS(source[index]) && index < len) index++; - if (source[index] !== "(") throw new Error("Expected ( after dynamic name"); - let content = ""; - let open = 1; + static from(type: string, reader: Reader): Node { + reader.whitespace() + if (reader.peek() !== "(") { + if (type === "else") return DynamicElse.from(reader) + else throw new Error(`Expected ( after dynamic name ${type}`) + } + let content = "" + let open = 1 + reader.skip(1) // Skip past the initial ( while (open > 0) { - content += source[++index]; - if (source[index] === "(") open++; - else if (source[index] === ")") open--; + // todo use skipJsExpression here? + const c = reader.next() + content += c + if (c === "(") open++ + else if (c === ")") open-- } - index++; - content = content.slice(0, -1); // Remove trailing ) - while (isWS(source[index]) && index < len) index++; - let children: ChildNodes; - ({ children, index } = ChildNodes.from(source, index)); + content = content.slice(0, -1) // Remove trailing ) + reader.whitespace() + const children = ChildNodes.from(reader) + return new Dynamic(type, content, children) + } +} + +class DynamicElse implements Node { + constructor(public children: ChildNodes) {} + jsify() { return { - node: new Dynamic(type, content, children), - index, - }; + multiline: true, + code: `else{${multilinify(this.children.jsify())}}`, + } + } + /** Starts after else[whitespace] */ + static from(reader: Reader) { + const children = ChildNodes.from(reader) + return new DynamicElse(children) } } export class ChildNodes implements Node { - static readonly starts = "[{<"; - size: number; constructor(public nodes: Node[]) { - this.size = nodes.length; + } + get size() { + return this.nodes.length } jsify() { - let result = ""; - let lastML = false; - let hasML = false; + let result = "" + let lastML = false + let hasML = false for (const node of this.nodes) { - const { multiline, code } = node.jsify(); + const { multiline, code } = node.jsify() if (!hasML && multiline) { - hasML = true; - if (!lastML && result.length > 0) result = `${outvar}+=${result}`; + hasML = true + if (!lastML && result.length > 0) result = `${outvar}+=${result}` } - if (lastML) result += multiline ? code : `${outvar}+=${code}`; - else if (result.length === 0) result += code; - else result += multiline ? `;${code}` : `+${code}`; - lastML = multiline; + if (lastML) result += multiline ? code : `${outvar}+=${code}` + else if (result.length === 0) result += code + else result += multiline ? `;${code}` : `+${code}` + lastML = multiline } - if (hasML && !lastML) result += ";"; - return { multiline: hasML, code: result }; + if (hasML && !lastML) result += ";" + return { multiline: hasML, code: result } } - static from( - source: string, - index: number, - creatingTemplates = false - ): { children: ChildNodes; index: number } { - const T = creatingTemplates ? Template : TemplateUsage; - const len = source.length; - while (isWS(source[index]) && index < len) index++; - const nodes: Node[] = []; - while (index < source.length) - if (source[index] === "[") { - index++; - let type: typeof Text | typeof DynamicText = Text; - if (source[index] === ">") { - type = DynamicText; - index++; - } - const { index: i, node } = type.from(source, index); - nodes.push(node); - index = i + 1; - while (isWS(source[index]) && index < len) index++; - } - // Children - else if (source[index] === "{") { - index++; - while (isWS(source[index]) && index < len) index++; - while (isTag(source[index]) || source[index] === "$") { - if (source[index] === "$") { - let template: Node; - ({ template, index } = T.from(source, index)); - nodes.push(template); - } else { - let node: Node; - ({ node, index } = Element.from(source, index)); - nodes.push(node); + static from(reader: Reader): ChildNodes { + reader.whitespace() + const nodes: Node[] = [] + loop: + while (!reader.eof()) { + const c = reader.peek() + switch (c) { + // Children + case "{": { + reader.next() + reader.whitespace() + let c = reader.peek() + while (isTag(c) || c === "$") { + if (c === "$" && reader.peek(1) == "$") { + reader.skip(2) // Skip past $$ + const name = reader.tag() + nodes.push(TemplateDeclaration.from(name, reader)) + } else if (c === "$") { + reader.skip(1) // Skip past $ + const name = reader.tag() + nodes.push(TemplateUsage.from(name, reader)) + } else { + const tag = reader.tag() + if (Dynamic.dynamics.has(tag)) { + nodes.push(Dynamic.from(tag, reader)) + } else { + nodes.push(Element.from(tag, reader)) + } + } + c = reader.peek() } + reader.next() + reader.whitespace() + break } - index++; - while (isWS(source[index]) && index < len) index++; - } - // Dynamics (if, for) - else if (source[index] === "<") { - index++; - while (source[index] !== ">") { - while (isWS(source[index]) && index < len) index++; - let node: Dynamic; - ({ node, index } = Dynamic.from(source, index)); - nodes.push(node); - while (isWS(source[index]) && index < len) index++; + case '"': + case "'": { + const string = reader.jsString() + nodes.push(new DynamicText(c + escapeJSON(escapeHTML(string.slice(1, -1))) + c)) + reader.whitespace() + break + } + case "`": { + const string = reader.jsString() + nodes.push(new DynamicText(`${escapehtmlfunc}(${string})`)) + reader.whitespace() + break + } + default: { + break loop } - index++; - while (isWS(source[index]) && index < len) index++; - } else break; - return { children: new ChildNodes(nodes), index }; + } + } + return new ChildNodes(nodes) } } diff --git a/src/poggies.ts b/src/poggies.ts index a85c7a2..0860d48 100644 --- a/src/poggies.ts +++ b/src/poggies.ts @@ -1,74 +1,99 @@ -import { ChildNodes, multilinify } from "./nodes.js"; -import { inputvar, jsonifyfunc, outvar } from "./utils.js"; -const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor; +import { ChildNodes, multilinify } from "./nodes.ts" +import { Reader } from "./reader.ts" +import { escapeHTMLSource, inputvar, jsonifyfunc, outvar, readTextFile } from "./utils.ts" +// only this file's .d.ts is exported to npm!! +// be careful not to export types from other files :p + +// eslint-disable-next-line @typescript-eslint/no-empty-function -- function only exists for its constructor +const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor export type Options = { /** @deprecated `!doctype(html)` is now valid poggies code, use that instead. */ - doctype?: string | false; -}; + doctype?: string | false +} + +export type RenderFunction = ( + input: Record, + jsonify?: (string: string) => string, +) => Promise + export class Poggies { - private nodes: ChildNodes; - js: string; - func: ( - input: Record, - jsonify?: (str: string) => string - ) => Promise; + private nodes: ChildNodes + private func!: RenderFunction + /** The body of the function. Available before calling compile() or javascript() */ + js: string constructor(source: string) { - const { children } = ChildNodes.from("{" + source + "}", 0, true); - this.nodes = children; - const js = multilinify(this.nodes.jsify()); - this.js = `let ${outvar}="";with(${inputvar}){${js}}return ${outvar};`; + const reader = new Reader("{" + source + "}") + reader.column-- // because the first character is a fake { + try { + this.nodes = ChildNodes.from(reader) + } catch (error) { + if (error instanceof Error) { + error.message += ` at (${reader.line}:${reader.column}) ("${ + reader.source.slice(reader.index - 5, reader.index + 5) + }")` + } + throw error + } + const js = multilinify(this.nodes.jsify()) + this.js = `${escapeHTMLSource}let ${outvar}="";with(${inputvar}){${js}}return ${outvar};` } - compile(): (passing: Record) => Promise { - // async function(__INPUT__, __JSONIFY__ = JSON.stringify) { ${this.js} } + /** Compiles the Poggies document into a function that can be called to return the rendered HTML */ + compile(): RenderFunction { return (this.func = new AsyncFunction( inputvar, jsonifyfunc + "=JSON.stringify", - this.js - )); + this.js, + )) + } + /** + * `async function(__INPUT__, __JSONIFY__ = JSON.stringify) { ${this.js} }`. + * Similar to this.compile().toString(), but doesn't actually compile a function. + */ + javascript(): string { + return `async function(${inputvar}, ${jsonifyfunc} = JSON.stringify) { ${this.js} }` } /** Renders this Poggies document with some given variables */ async render( - input: Record = {}, - options: Options = {} + input: Record = {}, + options: Options = {}, ): Promise { - if (this.func == null) this.compile(); - let output = await this.func(input, JSON.stringify); - const { doctype } = options; - if (doctype) output = `` + output; - return output; + if (this.func === undefined) this.compile() + let output = await this.func(input, JSON.stringify) + const { doctype } = options + if (doctype) output = `` + output + return output } } -type PathLike = string | URL; -const fileCache = new Map(); -let readFileSync: typeof import("node:fs").readFileSync | undefined; +export type PathLike = string | URL +const fileCache = new Map() /** Coggers promise-style template function */ -export const renderFile = async ( +export async function renderFile( file: PathLike, - input: Record = {}, - options: Options & { cache?: boolean } = {} -): Promise => { - if (!readFileSync) { - const fs = await import("node:fs"); - readFileSync = fs.readFileSync; - } + input: Record = {}, + options: Options & { cache?: boolean } = {}, +): Promise { if (options.cache === false) { - const poggies = new Poggies(readFileSync(file, "utf8")); - return poggies.render(input, options); + const poggies = new Poggies(await readTextFile(file)) + return poggies.render(input, options) + } + + if (!fileCache.has(file)) { + fileCache.set(file, new Poggies(await readTextFile(file))) } - if (!fileCache.has(file)) - fileCache.set(file, new Poggies(readFileSync(file, "utf8"))); - const poggies = fileCache.get(file); - return poggies.render(input, options); -}; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const poggies = fileCache.get(file)! + return poggies.render(input, options) +} /** Express-style template function */ -export const express = ( +export function express( file: string, - input: Record = {}, + input: Record = {}, options: Options = {}, - callback: (error: any, html?: string) => any -) => + callback: (error: unknown, html?: string) => unknown, +) { renderFile(file, input, options).then( - result => callback(null, result), - error => callback(error) - ); + (result) => callback(undefined, result), + (error) => callback(error), + ) +} diff --git a/src/reader.ts b/src/reader.ts new file mode 100644 index 0000000..f4d2bca --- /dev/null +++ b/src/reader.ts @@ -0,0 +1,103 @@ +import { isClose, isOpen, isStringDelimiter, isTag, isWS } from "./utils.ts" + +export class Reader { + index = 0 + line = 1 + column = 1 + constructor(public source: string) {} + /** + * Peeks at the next character in the source + * @param extra 0 returns the same as next(), 1 returns what's after that, etc. + */ + peek(extra = 0) { + return this.source[this.index + extra] + } + next() { + const char = this.source[this.index] + if (char === "\n") { + this.line++ + this.column = 1 + } else this.column++ + this.index++ + return char + } + skip(n: number) { + for (let index = 0; index < n; index++) this.next() + } + eof() { + return this.index >= this.source.length + } + collect(predicate: (char: string) => boolean) { + let result = "" + while (this.index < this.source.length && predicate(this.peek())) { + result += this.next() + } + return result + } + tag() { + return this.collect(isTag) + } + skipJsString(): void { + let escaped = false + const startLine = this.line, + startColumn = this.column + const quote = this.next() // Skip past the initial quote + for (; !this.eof(); this.next()) { + const char = this.peek() + if (escaped) escaped = false // Skip past the escaped character + else if (char === "\\") escaped = true // Escape the next character + else if (quote === "`" && char === "$" && this.peek(1) === "{") { + this.skip(2) // Skip past $ + this.jsExpression() // Skip past { ... } + } else if (char === quote) { + this.next() // Skip past the closing quote + return // End of the string! + } + } + throw new Error(`Unmatched string from (${startLine}:${startColumn})`) + } + jsString(): string { + const start = this.index + this.skipJsString() + return this.source.slice(start, this.index) + } + jsExpression(): string { + let depth = 0 + const start = this.index + while (!this.eof()) { + const char = this.peek() + if (depth === 0 && (isClose(char) || isWS(char))) { + return this.source.slice(start, this.index) + } else if (isOpen(char)) { + depth++ + this.next() + } else if (isClose(char)) { + depth-- + this.next() + } else if (isStringDelimiter(char)) this.skipJsString() + else this.next() + } + throw new Error("Unmatched bracket") + } + whitespace() { + while ( + this.index < this.source.length && + (isWS(this.source[this.index]) || + (this.source[this.index] === "/" && + this.source[this.index + 1] === "/")) + ) { + this.skip(1) + if ( + this.source[this.index] === "/" && + this.source[this.index + 1] === "/" + ) { + while ( + this.source[this.index] !== "\n" && + this.index < this.source.length + ) { + this.skip(1) + } + } + } + } +} diff --git a/src/templating.ts b/src/templating.ts index f818473..2e3a0cf 100644 --- a/src/templating.ts +++ b/src/templating.ts @@ -1,63 +1,52 @@ -import { Element, VoidElement } from "./element.js"; -import { ChildNodes, Node } from "./nodes.js"; -import { isTag, outvar } from "./utils.js"; +import { Element, VoidElement } from "./element.ts" +import { ChildNodes, Node } from "./nodes.ts" +import { Reader } from "./reader.ts" +import { outvar } from "./utils.ts" -export class Template implements Node { +export class TemplateDeclaration implements Node { constructor( public name: string, - public props: string[], - public children: ChildNodes + public properties: string[], + public children: ChildNodes, ) {} jsify() { - const { multiline, code } = this.children.jsify(); + const { multiline, code } = this.children.jsify() return { multiline: true, - code: `const $${this.name}=async({${this.props.join(",")}})=>${ - multiline ? `{let ${outvar}="";${code};return ${outvar};}` : code - };`, - }; + code: `const $${this.name.replaceAll("-", "$")}=async({${ + this.properties.join( + ",", + ) + }})=>${multiline ? `{let ${outvar}="";${code};return ${outvar};}` : code};`, + } } - static from( - source: string, - index: number - ): { template: Template; index: number } { - const len = source.length; - index++; // Skip past the initial `$` - let name = ""; - for (; index < len && isTag(source[index]); index++) name += source[index]; - if (source[index] !== "(") - throw new Error("Invalid template tag, no input declaration"); - const end = source.indexOf(")", index + 1); - const props: string[] = source - .slice(index + 1, end) - .split(/\s/) - .map(s => s.trim()); - index = end + 1; - let children: ChildNodes; - ({ children, index } = ChildNodes.from(source, index)); - return { template: new Template(name, props, children), index }; + static from(name: string, reader: Reader): TemplateDeclaration { + if (reader.next() !== "(") { + throw new Error("Invalid template tag, no input declaration") + } + const text = reader.collect((char) => char !== ")") + const properties = text.split(/\s+/).map((s) => s.trim()) + reader.skip(1) // Skip past the closing `)` + const children = ChildNodes.from(reader) + return new TemplateDeclaration(name, properties, children) } } export class TemplateUsage extends VoidElement { jsify() { - const attrObj = Object.entries(this.attrs) - .map(([name, attr]) => `${JSON.stringify(name)}:${attr.jsify()}`) - .join(","); + const attributeObject = Object.entries(this.attributes) + .map(([name, attribute]) => `${JSON.stringify(name)}:${attribute.jsify()}`) + .join(",") return { multiline: false, - code: `(await $${this.tag}({${attrObj}}))`, - }; + code: `(await $${this.tag.replaceAll("-", "$")}({${attributeObject}}))`, + } } - static from( - source: string, - index: number - ): { template: TemplateUsage; index: number } { - index++; // Skip past the initial `$` - let template: VoidElement | Element; - ({ node: template, index } = Element.from(source, index, true)); - if ("children" in template) - throw new Error("Template usages cannot have children"); - return { template: new TemplateUsage(template.tag, template.attrs), index }; + static from(name: string, reader: Reader): TemplateUsage { + const template: VoidElement | Element = Element.from(name, reader, true) + if ("children" in template) { + throw new Error("Template usages cannot have children") + } + return new TemplateUsage(name, template.attributes) } } diff --git a/src/utils.ts b/src/utils.ts index 8c7bb2c..d030267 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,6 +1,77 @@ -export const isTag = (char: string) => /^[\w!-]+$/.test(char); -export const isWS = (char: string) => /^\s+$/.test(char); +import { PathLike } from "./poggies.ts" -export const inputvar = "__INPUT__"; -export const outvar = "__OUT__"; -export const jsonifyfunc = "__JSONIFY__"; +export const isTag = (char: string) => /^[\w!-]+$/.test(char) + +export const isWS = (char: string) => /^\s+$/.test(char) + +export const inputvar = "__INPUT__" +export const outvar = "__OUT__" +export const jsonifyfunc = "__JSONIFY__" + +export const isOpen = (char: string) => /^[([{]$/.test(char) +export const isClose = (char: string) => /^[)\]}]$/.test(char) +export const isStringDelimiter = (char: string) => /^["'`]$/.test(char) + +const htmlEscapeMap = { + '"': """, + "'": "'", + "&": "&", + "<": "<", + ">": ">", +} +const htmlEscapeRegex = /["&'<>]/g +export const escapeHTML = (string: string) => + string.replaceAll( + htmlEscapeRegex, + (char) => htmlEscapeMap[char as keyof typeof htmlEscapeMap], + ) + +const jsonEscapeRegex = /[\p{Cc}"]/gu +export const escapeJSON = (stringContent: string) => + stringContent.replaceAll( + jsonEscapeRegex, + // eslint-disable-next-line unicorn/prefer-code-point -- we do need to get the char code here + (char) => `\\u${char.charCodeAt(0).toString(16).padStart(4, "0")}`, + ) +// for inside of generated code +export const escapeHTMLSource = `\ +const __HTML_ESCAPE_MAP__ = { + '"': """, + "'": "'", + "&": "&", + "<": "<", + ">": ">", +} +const __HTML_ESCAPE_REGEX__ = /["&'<>]/g +const __ESCAPE_HTML__ = (string) => + string.replaceAll( + __HTML_ESCAPE_REGEX__, + (char) => __HTML_ESCAPE_MAP__[char], + ) +` +export const escapehtmlfunc = "__ESCAPE_HTML__" + +declare global { + // @ts-ignore if deno already exists + const Deno: undefined | { readTextFile: (file: PathLike) => Promise } + // @ts-ignore if process already exists + const process: undefined | { release: { name: string } } +} + +export let readTextFile = async function (file: PathLike): Promise { + if (typeof Deno !== "undefined") { + readTextFile = (file) => Deno.readTextFile(file) + } else if ( + typeof process !== "undefined" && + process.release.name === "node" + ) { + const fs = await import("node:fs") + const { readFile } = fs.promises + readTextFile = (file) => readFile(file, "utf8") + } else { + throw new Error( + "Unsupported environment for renderFile, expected Deno or Node.js", + ) + } + return readTextFile(file) // call the new function +} diff --git a/test/bench.ts b/test/bench.ts new file mode 100644 index 0000000..a119791 --- /dev/null +++ b/test/bench.ts @@ -0,0 +1,15 @@ +import { Poggies } from "../src/poggies.ts" +import { data } from "./utils.ts" + +const source = Deno.readTextFileSync(new URL("test.pog", import.meta.url)) +Deno.bench("parse", async () => { + new Poggies(source) +}) +const poggies = new Poggies(source) +Deno.bench("compile", async () => { + poggies.compile() +}) +poggies.compile() +Deno.bench("render", async () => { + await poggies.render(data) +}) diff --git a/test/reader.test.ts b/test/reader.test.ts new file mode 100644 index 0000000..7f3007f --- /dev/null +++ b/test/reader.test.ts @@ -0,0 +1,50 @@ +import { assertEquals } from "https://deno.land/std@0.201.0/assert/mod.ts" +import { Reader } from "../src/reader.ts" + +Deno.test("whitespace", async (t) => { + await t.step("a end", () => { + const source = "a end" + const reader = new Reader(source) + reader.skip(1) // skip a + reader.whitespace() + assertEquals(reader.index, source.indexOf("end")) + }) + await t.step("a comment end", () => { + const source = "a // comment \n end" + const reader = new Reader(source) + reader.skip(1) // skip a + reader.whitespace() + assertEquals(reader.index, source.indexOf("end")) + }) +}) + +Deno.test("jsExpression", async (t) => { + await t.step("last argument", () => { + const source = "$foo(arg=[1, 2, 3])" + const reader = new Reader(source) + reader.index = source.indexOf("[") + assertEquals(reader.jsExpression(), "[1, 2, 3]") + assertEquals(reader.index, source.indexOf("]") + 1) + }) + await t.step("first argument", () => { + const source = "$foo(arg=[1, 2, 3] nothing in particular)" + const reader = new Reader(source) + reader.index = source.indexOf("[") + assertEquals(reader.jsExpression(), "[1, 2, 3]") + }) + await t.step("contains string containing a bracket", () => { + const source = "$foo(arg=[1, ']', 3])" + const reader = new Reader(source) + reader.index = source.indexOf("[") + assertEquals(reader.jsExpression(), "[1, ']', 3]") + }) + await t.step( + "contains string containing brackets, a real escape, a fake escape, and the wrong end quotes", + () => { + const source = "$foo(arg=[1, ']\\'\"`])\\\\', 3])" + const reader = new Reader(source) + reader.index = source.indexOf("[") + assertEquals(reader.jsExpression(), "[1, ']\\'\"`])\\\\', 3]") + }, + ) +}) diff --git a/test/render-input.ts b/test/render-input.ts index 4cfa1bc..35cedb3 100644 --- a/test/render-input.ts +++ b/test/render-input.ts @@ -1,33 +1,48 @@ -import { readFileSync, unlinkSync, watchFile, writeFileSync } from "node:fs"; -import { Poggies } from "../src/poggies.js"; +import { fromFileUrl } from "https://deno.land/std@0.180.0/path/mod.ts" +import { Poggies } from "../src/poggies.ts" +import { data } from "./utils.ts" -const data = { - first: 12, - second: 26, - words: ["loops ", "are ", "cool"], - chance: Math.random() < 0.5, -}; -const input = new URL("./input.pog", import.meta.url); -const output = new URL("./output.html", import.meta.url); -const outputJS = new URL("./output.js", import.meta.url); -writeFileSync(input, ""); -watchFile(input, {}, () => { - const poggies = new Poggies(readFileSync(input, "utf8")); - writeFileSync( +const input = fromFileUrl(new URL("input.pog", import.meta.url)) +const output = fromFileUrl(new URL("dist/live.html", import.meta.url)) +const outputJS = fromFileUrl(new URL("dist/live.js", import.meta.url)) +Deno.writeTextFileSync(input, "") +const watcher = Deno.watchFs(input) +console.log("Live reloading ./input.pog to dist/live.html and dist/live.js") + +function clean() { + console.log("Bye!") + Deno.removeSync(input) +} + +addEventListener("beforeunload", clean) +addEventListener("unload", clean) +Deno.addSignalListener("SIGINT", () => { + Deno.exit() +}) + +for await (const event of watcher) { + if (event.kind !== "modify") continue + const poggies = new Poggies(Deno.readTextFileSync(input) || "ERROR!") + Deno.writeTextFileSync( + outputJS, + `// @ts-nocheck\nasync function anonymous(__INPUT__,__JSONIFY__=JSON.stringify){${poggies.js}}`, + ) + try { + poggies.compile() + } catch (error) { + console.error(error) + console.dir(poggies, { depth: Number.POSITIVE_INFINITY }) + continue + } + Deno.writeTextFileSync( outputJS, - "/*eslint-disable unicorn/no-abusive-eslint-disable*/\n/*eslint-disable*/\nasync function anonymous(__INPUT__){" + - poggies.js + - "}" - ); + "// @ts-nocheck\n" + poggies.compile().toString(), + ) poggies .render(data) - .then(html => writeFileSync(output, html)) - .catch(console.error); -}); -console.log("Live reloading ./input.pog to ./output.html and ./output.js"); -process.once("SIGINT", () => { - unlinkSync(outputJS); - unlinkSync(output); - unlinkSync(input); - process.exit(); -}); + // eslint-disable-next-line unicorn/prefer-top-level-await + .then((html) => { + Deno.writeTextFileSync(output, html) + console.log("Rendered to ./dist/live.html") + }, console.error) +} diff --git a/test/test.pog b/test/test.pog index ca3a214..7b7b218 100644 --- a/test/test.pog +++ b/test/test.pog @@ -1,49 +1,78 @@ !doctype(html) -$link(href target text){ - a(href=>href target=>target)[>new URL(href).hostname] +$$list(items){ + ul { + for(item of items){ + li `${item}` + } + } } -$list(items){ - ulitem] - }> +$$row(name thebest){ + tr { + td.name `${name}` + td(class=(thebest ? "thebest" : "notthebest")) { + if(thebest) "The Best :D" + else "Not the Best :(" + } + } } html(lang=en-US){ head{ - title[Test Page] - style[ - #root{ + title "Test Page" + style " + #root { font-family: cursive; } - .green{ + .green { color: lime; } - .red{ + .red { color: red; } - .bold{ + .bold { font-weight: bold; } - ] + table { + border-collapse: collapse; + } + table, th, td { + border: 3px solid pink; + } + " } body#root{ - h1#hey-world.red.bold[Hello World!] + $$link-fr(href target){ + a(href=(href) target=(target)) `${new URL(href).hostname}` + } + + h1#hey-world.red.bold "Hello World!" p( class="bold green" data-close=")" - )[:D] - $link(href=>`https://${site}.${tld}/` target=_blank) - $list(items=>[1,2,3]) - p.red(hidden)[If this is visible, attributes aren't working properly.] + ) ":D" + // hooray! a comment! + $link-fr(href=`https://${site}.${tld}/` target=_blank) + $list(items=[1, 2, 3]) + p.red(hidden) "If this is visible, attributes aren't working properly." + h1 "People:" + table{ + tr{ + th.name "Name" + th.thebest "The Best?" + } + for(user of users){ + $row(name=(user.name) thebest=(user.thebest)) + } + } + br + if(ifstatements.working()) "If statements work!" + br + for(word of forTest.sentence) `${word}` br + for(double of doubleTest) { + if(double.show) `${double.content}` + } } - - {br} - word]> - {br} - double.content] - >> } multielemtest{ - div[Multiple Parent Elements work!] + div "Multiple Parent Elements work!" } \ No newline at end of file diff --git a/test/test.ts b/test/test.ts deleted file mode 100644 index e17303c..0000000 --- a/test/test.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { mkdirSync, readFileSync, writeFileSync } from "node:fs"; -import { Poggies, renderFile } from "../src/poggies.js"; - -const ansi = (...n: number[]) => `\x1b[${n.join(";")}m`; -const reset = ansi(0); -const green = ansi(32); -const styled = (str: string, style: string) => `${style}${str}${reset}`; -mkdirSync(new URL("./output", import.meta.url), { recursive: true }); -console.log(styled("Poggies Benchmark / Test", ansi(32, 4))); -const data = { - site: "example", - tld: "com", - forTest: { sentence: ["For ", "of ", "loops ", "work!"] }, - ifstatements: { working: () => true }, - doubleTest: [ - { show: true, content: "For and If combined is " }, - { show: false, content: "not " }, - { show: true, content: "working!" }, - ], -}; -const total = styled("Total Time Taken", green); -const parsing = styled("Parsing", green); -const compiling = styled("Compiling", green); -const firstRender = styled("First Render", green); - -const source = readFileSync(new URL("./test.pog", import.meta.url)).toString(); -console.time(total); -console.time(parsing); -const poggies = new Poggies(source); -console.timeEnd(parsing); -try { - console.time(compiling); - const compiled = poggies.compile(); - console.timeEnd(compiling); - console.time(firstRender); - await poggies.render(data); - console.timeEnd(firstRender); - console.timeEnd(total); - writeFileSync( - new URL("./output/poggies.js", import.meta.url), - "/*eslint-disable unicorn/no-abusive-eslint-disable*/\n/*eslint-disable*/\n" + - compiled.toString() - ); - writeFileSync( - new URL("./output/poggies.html", import.meta.url), - await renderFile(new URL("./test.pog", import.meta.url), data) - ); - - const start = process.hrtime.bigint(); - for (let i = 0; i < 100; i++) await poggies.render(data); - const end = process.hrtime.bigint(); - const msAvg = Number(end - start) / 100000000; - console.log(green + `100 renders average${reset}: ${msAvg} ms/render`); - console.log("\n"); - console.log( - green + - "Rendered to ./output/poggies.html, compile output at ./output/poggies.js" + - reset - ); -} catch (error) { - writeFileSync( - new URL("./output/poggies.js", import.meta.url), - "/* eslint-disable unicorn/no-abusive-eslint-disable */\n/* eslint-disable */\nasync function anonymous(__INPUT__, __JSONIFY__ = JSON.stringify) {" + - poggies.js + - "}" - ); - console.error("Error caught. Compiled output at ./output/poggies.js"); - throw error; -} diff --git a/test/tsconfig.json b/test/tsconfig.json deleted file mode 100644 index 79f9f52..0000000 --- a/test/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "include": [".", "../poggies.d.ts"], - "compilerOptions": { - "target": "ES2019", - "module": "ESNext", - "outDir": "./dist", - "moduleResolution": "node", - "downlevelIteration": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "declaration": true - } -} diff --git a/test/utils.ts b/test/utils.ts new file mode 100644 index 0000000..16181e4 --- /dev/null +++ b/test/utils.ts @@ -0,0 +1,40 @@ +// deno does these without decimals, polyfill with more precision +const timers = new Map() +console.time = function time(name: string) { + timers.set(name, performance.now()) +} +console.timeEnd = function timeEnd(name: string) { + const end = performance.now() + const start = timers.get(name) + if (start === undefined) throw new Error("Timer not started") + const ms = end - start + console.log( + `${name}: ${ms.toFixed(10).replace(/0+$/, "")}ms`, + ) +} + +export const data = { + site: "example", + tld: "com", + forTest: { sentence: ["For ", "of ", "loops ", "work!"] }, + ifstatements: { working: () => true }, + doubleTest: [ + { show: true, content: "For and If combined is " }, + { show: false, content: "not " }, + { show: true, content: "working!" }, + ], + first: 12, + second: 26, + words: ["loops ", "are ", "cool"], + chance: Math.random() < 0.5, + users: [ + { + name: "Esthe de Beste", + thebest: true, + }, + { + name: "John Doe", + thebest: false, + }, + ], +} diff --git a/tsconfig.json b/tsconfig.json index ea4fb36..cad6c7b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,16 @@ { - "include": ["./src/**.ts"], + "include": ["./src/**/*.ts"], "compilerOptions": { - "target": "ES2019", + "target": "ES2022", "module": "ESNext", - "outDir": "./dist", + "outDir": "dist", "rootDir": "./src", - "moduleResolution": "node", - "downlevelIteration": true, + "moduleResolution": "bundler", "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "declaration": true + "declaration": true, + "allowImportingTsExtensions": true, + "emitDeclarationOnly": true, + "isolatedModules": true, + "stripInternal": true } }