From 890c1f74edfe166b531826192193be72241192d9 Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Wed, 8 Jun 2022 20:24:19 +0000 Subject: [PATCH] update to new arch (#2) Closes #1 Reviewed-on: https://git.pleshevski.ru/pleshevskiy/pleshevski.ru/pulls/2 Co-authored-by: Dmitriy Pleshevskiy Co-committed-by: Dmitriy Pleshevskiy --- .dockerignore | 14 +- .drone.yml | 49 + .eslintrc.yml | 28 - .gitignore | 21 +- .vscode/settings.json | 3 - Dockerfile | 27 +- context.ts | 24 + deno.json | 6 + docker-compose.yml | 5 +- flake.lock | 43 + flake.nix | 22 + import_map.json | 5 + src/log.mts => log.ts | 0 makefile | 30 +- package-lock.json | 2849 ------------------------------- package.json | 20 - public/styles/main.css | 546 ++++++ public/styles/main.css.map | 1 + server.ts | 177 ++ src/components/layout.mts | 31 - src/components/page_layout.mts | 34 - src/config.mts | 17 - src/context.mts | 3 - src/lang.mts | 13 - src/main.mts | 7 - src/server.mts | 110 -- src/utils.mts | 9 - src/views/about.mts | 50 - src/views/e404.mts | 14 - src/views/works.mts | 32 - static/styles.css | 150 -- styles/atoms/flex.scss | 6 + styles/atoms/misc.scss | 3 + styles/atoms/mod.scss | 5 + styles/atoms/sizes.scss | 9 + styles/atoms/typography.scss | 57 + styles/atoms/white-spaces.scss | 11 + styles/base/layout.scss | 11 + styles/base/reset.scss | 305 ++++ styles/main.scss | 6 + styles/mixins/flex.scss | 165 ++ styles/mixins/mod.scss | 2 + styles/mixins/white-spaces.scss | 29 + styles/uikit/dropdown.scss | 83 + styles/uikit/main-menu.scss | 21 + styles/uikit/mod.scss | 2 + styles/variables.scss | 9 + translates/eng.ts | 33 + translates/rus.ts | 35 + tsconfig.json | 21 - views/comp/layout.ts | 19 + views/comp/page_layout.ts | 59 + views/pages/about.ts | 49 + views/pages/e404.ts | 15 + views/pages/e500.ts | 15 + views/pages/works.ts | 32 + views/uikit/link.ts | 15 + views/uikit/typo.ts | 6 + 58 files changed, 1912 insertions(+), 3451 deletions(-) create mode 100644 .drone.yml delete mode 100644 .eslintrc.yml delete mode 100644 .vscode/settings.json create mode 100644 context.ts create mode 100644 deno.json create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 import_map.json rename src/log.mts => log.ts (100%) delete mode 100644 package-lock.json delete mode 100644 package.json create mode 100644 public/styles/main.css create mode 100644 public/styles/main.css.map create mode 100644 server.ts delete mode 100644 src/components/layout.mts delete mode 100644 src/components/page_layout.mts delete mode 100644 src/config.mts delete mode 100644 src/context.mts delete mode 100644 src/lang.mts delete mode 100644 src/main.mts delete mode 100644 src/server.mts delete mode 100644 src/utils.mts delete mode 100644 src/views/about.mts delete mode 100644 src/views/e404.mts delete mode 100644 src/views/works.mts delete mode 100644 static/styles.css create mode 100644 styles/atoms/flex.scss create mode 100644 styles/atoms/misc.scss create mode 100644 styles/atoms/mod.scss create mode 100644 styles/atoms/sizes.scss create mode 100644 styles/atoms/typography.scss create mode 100644 styles/atoms/white-spaces.scss create mode 100644 styles/base/layout.scss create mode 100644 styles/base/reset.scss create mode 100644 styles/main.scss create mode 100644 styles/mixins/flex.scss create mode 100644 styles/mixins/mod.scss create mode 100644 styles/mixins/white-spaces.scss create mode 100644 styles/uikit/dropdown.scss create mode 100644 styles/uikit/main-menu.scss create mode 100644 styles/uikit/mod.scss create mode 100644 styles/variables.scss create mode 100644 translates/eng.ts create mode 100644 translates/rus.ts delete mode 100644 tsconfig.json create mode 100644 views/comp/layout.ts create mode 100644 views/comp/page_layout.ts create mode 100644 views/pages/about.ts create mode 100644 views/pages/e404.ts create mode 100644 views/pages/e500.ts create mode 100644 views/pages/works.ts create mode 100644 views/uikit/link.ts create mode 100644 views/uikit/typo.ts diff --git a/.dockerignore b/.dockerignore index 238888b..d794bd4 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,12 +1,10 @@ - /* -!/tsconfig.json +!/public +!/styles +!/translates +!/views -# node modules -!/package.json -!/package-lock.json +!/*.ts +!/*.json -# sources -!/src -!/static \ No newline at end of file diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..f7e90e3 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,49 @@ +kind: pipeline +type: docker +name: default + +trigger: + branch: + - main + event: + - push + +steps: + - name: build-docker-image + image: plugins/docker + settings: + username: + from_secret: org_registry_username + password: + from_secret: org_registry_password + registry: ${ORG_REGISTRY} + repo: ${ORG_REGISTRY}/${DRONE_REPO} + tags: + - ${DRONE_COMMIT_SHA:0:8} + - ${DRONE_TARGET_BRANCH} + + - name: deploy + when: + status: + - success + image: registry.pleshevski.ru/drone_plugins/docker_stack + volumes: + - name: dockersock + path: /var/run/docker.sock + environment: + PLESHEVSKI_IMAGE: ${ORG_REGISTRY}/${DRONE_REPO}:${DRONE_COMMIT_SHA:0:8} + settings: + username: + from_secret: org_registry_username + password: + from_secret: org_registry_password + name: 'pleshevski' + +image_pull_secrets: + - org_docker_config + +volumes: + - name: dockersock + host: + path: /var/run/docker.sock + diff --git a/.eslintrc.yml b/.eslintrc.yml deleted file mode 100644 index 3d13c97..0000000 --- a/.eslintrc.yml +++ /dev/null @@ -1,28 +0,0 @@ -parser: "@typescript-eslint/parser" -env: - es6: true - node: true -parserOptions: - ecmaVersion: 2020 - sourceType: "module" -extends: - - prettier - - plugin:prettier/recommended - - "plugin:@typescript-eslint/recommended" -rules: - "@typescript-eslint/no-unused-vars": - - error - - vars: all - args: after-used - argsIgnorePattern: ^_ - varsIgnorePattern: ^_ - ignoreRestSiblings: true - "@typescript-eslint/no-empty-interface": off - "@typescript-eslint/no-explicit-any": off - "@typescript-eslint/explicit-function-return-type": - - warn - - allowExpressions: false - allowTypedFunctionExpressions: true - allowHigherOrderFunctions: true - "@typescript-eslint/camelcase": off - "@typescript-eslint/no-use-before-define": off diff --git a/.gitignore b/.gitignore index 875691d..0262266 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,18 @@ /* -# editors -!/.vscode - -# ignores !/*ignore -# config !/*file +!/*.nix !/*.yml -!/*.json -# sources -!/src -!/static +!/*.json +!/*.ts + +!/public +!/styles +!/translates +!/views + +# misc +.DS_Store + diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index ff30c44..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "editor.tabSize": 2 -} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index ca03832..6fa85e9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,24 +1,13 @@ -FROM node:16.14.2-alpine3.14 +FROM denoland/deno:alpine-1.22.1 + +EXPOSE 33334 WORKDIR /app -RUN apk update \ - && apk upgrade \ - && apk add --no-cache bash git openssh +USER deno -COPY package*.json ./ +ADD . . +# Compile the main app so that it doesn't need to be compiled each startup/entry. +RUN deno cache server.ts -RUN npm install \ - && apk del bash git openssh - -COPY tsconfig.json ./ -COPY src ./src - -RUN npm run build \ - && npm prune --production - -COPY static ./static/ - -EXPOSE 30000 - -CMD npm run start +CMD ["run", "-A", "server.ts"] diff --git a/context.ts b/context.ts new file mode 100644 index 0000000..6b88679 --- /dev/null +++ b/context.ts @@ -0,0 +1,24 @@ +import { Translations } from "./translates/rus.ts"; + +export interface Context { + locPath: string; + lang: Lang; + tr: Translations; +} + +export function getLangHref(lang: Lang, url: string): string { + return getLangUrlPrefix(lang) + url; +} + +export function getLangUrlPrefix(lang: Lang): string { + return lang === Lang.Rus ? "" : `/${lang}`; +} + +export function iterLangs(): Lang[] { + return [Lang.Eng, Lang.Rus]; +} + +export enum Lang { + Rus = "rus", + Eng = "eng", +} diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..f76bf0a --- /dev/null +++ b/deno.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "lib": ["deno.ns", "dom"] + }, + "importMap": "./import_map.json" +} diff --git a/docker-compose.yml b/docker-compose.yml index a878de7..004eced 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ networks: services: site: - image: pleshevski + image: $PLESHEVSKI_IMAGE networks: - rp_public deploy: @@ -27,5 +27,4 @@ services: - traefik.http.routers.pleshevski_https.entrypoints=https - traefik.http.routers.pleshevski_https.tls=true - traefik.http.routers.pleshevski_https.tls.certresolver=le - - traefik.http.services.pleshevski.loadbalancer.server.port=30000 - + - traefik.http.services.pleshevski.loadbalancer.server.port=33334 diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..3660fb7 --- /dev/null +++ b/flake.lock @@ -0,0 +1,43 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1654593855, + "narHash": "sha256-c+SyXvj7THre87OyIdZfRVR+HhI/g1ZDrQ3VUtTuHkU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "033bd4fa9a8fbe0c68a88e925d9a884161044b25", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "utils": "utils" + } + }, + "utils": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..da35d3b --- /dev/null +++ b/flake.nix @@ -0,0 +1,22 @@ +{ + description = "Pleshevski personal site"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + utils.url = "github:numtide/flake-utils"; + }; + + outputs = {self, nixpkgs, utils}: + let out = system: + let pkgs = nixpkgs.legacyPackages."${system}"; + in { + devShell = pkgs.mkShell { + buildInputs = with pkgs; [ + gnumake + nodePackages.sass + ]; + }; + }; + in with utils.lib; eachSystem defaultSystems out; + +} diff --git a/import_map.json b/import_map.json new file mode 100644 index 0000000..6caab00 --- /dev/null +++ b/import_map.json @@ -0,0 +1,5 @@ +{ + "imports": { + "ren/": "https://git.pleshevski.ru/pleshevskiy/ren/raw/branch/main/ren/" + } +} diff --git a/src/log.mts b/log.ts similarity index 100% rename from src/log.mts rename to log.ts diff --git a/makefile b/makefile index 909e4b1..90e4ed6 100644 --- a/makefile +++ b/makefile @@ -1,10 +1,15 @@ PAR := $(MAKE) -j 128 -DOCKER_NAME := pleshevski -DOCKER_TAG := pleshevski - +DOCKER_NAME := recipes +DOCKER_TAG := recipes watch: - $(PAR) hr ts-w + ${PAR} deno-w sass-w + +deno-w: + deno run -A --watch server.ts + +sass-w: + sass -w styles/main.scss public/styles/main.css docker-restart: docker-stop docker-run @@ -16,20 +21,3 @@ docker-run: docker-build: docker build -t ${DOCKER_TAG} . - -build: ts - -start: - npm run start - -hr: - deno run -A ~/sandbox/hr/server.ts target static - -ts: - npm run build - -ts-w: - NODE_ENV=develop npx tsc-watch --onSuccess "make start" - -clean: - rm -rf target diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index a569673..0000000 --- a/package-lock.json +++ /dev/null @@ -1,2849 +0,0 @@ -{ - "name": "pleshev.ski", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "dependencies": { - "ren": "github:pleshevskiy/ren" - }, - "devDependencies": { - "@types/node": "^17.0.21", - "@typescript-eslint/eslint-plugin": "^5.14.0", - "@typescript-eslint/parser": "^5.14.0", - "eslint": "^8.10.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.0.0", - "prettier": "^2.5.1", - "tsc-watch": "^4.6.0", - "typescript": "^4.6.2" - } - }, - "../../sandbox/ren": { - "version": "0.0.1", - "extraneous": true, - "license": "MIT", - "devDependencies": { - "@types/node": "^17.0.21", - "@typescript-eslint/eslint-plugin": "^5.14.0", - "@typescript-eslint/parser": "^5.14.0", - "eslint": "^8.10.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.0.0", - "prettier": "^2.5.1", - "tsc-watch": "^4.6.0", - "typescript": "^4.6.2" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", - "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "debug": "^4.3.2" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.14.0", - "eslint-visitor-keys": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", - "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.2.0", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, - "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/node-cleanup": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", - "integrity": "sha1-esGavSl+Caf3KnFUXZUbUX5N3iw=", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/ps-tree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", - "dev": true, - "dependencies": { - "event-stream": "=3.3.4" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/ren": { - "version": "0.0.1", - "resolved": "git+ssh://git@github.com/pleshevskiy/ren.git#1b21c2d79675a0063d05fdf1c9255828dbb01745", - "license": "MIT" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1" - } - }, - "node_modules/string-argv": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.1.2.tgz", - "integrity": "sha512-mBqPGEOMNJKXRo7z0keX0wlAhbBAjilUdPW13nN0PecVryZxdHIeM7TqbsSUA7VYuS00HGC6mojP7DlQzfa9ZA==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tsc-watch": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-4.6.0.tgz", - "integrity": "sha512-DRMADjFe44EDWb+YMIOj4b83UrU6le27L3/o0/9FlmA01ikFd5Dl9RD5h1hpeh0mQdIqXvwfHZszCcjhH3bAmQ==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "node-cleanup": "^2.1.2", - "ps-tree": "^1.2.0", - "string-argv": "^0.1.1", - "strip-ansi": "^6.0.0" - }, - "bin": { - "tsc-watch": "index.js" - }, - "engines": { - "node": ">=8.17.0" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - }, - "dependencies": { - "@eslint/eslintrc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", - "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "debug": "^4.3.2" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.14.0", - "eslint-visitor-keys": "^3.0.0" - } - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", - "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.2.0", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-cleanup": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", - "integrity": "sha1-esGavSl+Caf3KnFUXZUbUX5N3iw=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "ps-tree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", - "dev": true, - "requires": { - "event-stream": "=3.3.4" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "ren": { - "version": "git+ssh://git@github.com/pleshevskiy/ren.git#1b21c2d79675a0063d05fdf1c9255828dbb01745", - "from": "ren@github:pleshevskiy/ren" - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2" - } - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "string-argv": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.1.2.tgz", - "integrity": "sha512-mBqPGEOMNJKXRo7z0keX0wlAhbBAjilUdPW13nN0PecVryZxdHIeM7TqbsSUA7VYuS00HGC6mojP7DlQzfa9ZA==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tsc-watch": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-4.6.0.tgz", - "integrity": "sha512-DRMADjFe44EDWb+YMIOj4b83UrU6le27L3/o0/9FlmA01ikFd5Dl9RD5h1hpeh0mQdIqXvwfHZszCcjhH3bAmQ==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "node-cleanup": "^2.1.2", - "ps-tree": "^1.2.0", - "string-argv": "^0.1.1", - "strip-ansi": "^6.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 3cb1ef3..0000000 --- a/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "scripts": { - "build": "tsc", - "start": "node target/scripts/main.mjs" - }, - "devDependencies": { - "@types/node": "^17.0.21", - "@typescript-eslint/eslint-plugin": "^5.14.0", - "@typescript-eslint/parser": "^5.14.0", - "eslint": "^8.10.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.0.0", - "prettier": "^2.5.1", - "tsc-watch": "^4.6.0", - "typescript": "^4.6.2" - }, - "dependencies": { - "ren": "github:pleshevskiy/ren" - } -} diff --git a/public/styles/main.css b/public/styles/main.css new file mode 100644 index 0000000..42f42dc --- /dev/null +++ b/public/styles/main.css @@ -0,0 +1,546 @@ +@charset "UTF-8"; +:root { + --default-color-black: #000000; + --default-color-black-0: hsla(0, 0%, 0%, 0); + --default-color-black-0x15: hsla(0, 0%, 0%, 0.15); + --default-color-black-0x6: hsla(0, 0%, 0%, 0.6); + --default-color-white: #FFFFFF; + --default-color-warning: #ffee58; + --default-color-error: #b00008; + --default-color-success: #417505; + --color-brand-blue: #1966df; + --color-graphite: #212121; + --color-warm-gray: #757575; + --color-pale: #B6B6B6; + --color-faded: #E0E0E0; + --max-width: 1440px; + --min-width: 320px; + --rad-std-half: 0.125rem; + --rad-std: 0.25rem; + --rad-std-x2: 0.5rem; + --rad-std-x3: 0.75rem; + --default-font-size: 16px; + --f-family: system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Roboto,Oxygen-Sans, Ubuntu, Cantarell, "Segoe UI", Verdana, sans-serif; + --f-wei-thin: 100; + --f-wei-reg: 400; + --f-wei-bold: 700; + --f-wei-black: 800; + --z-ind-background: -100; + --z-ind-backward: -1; + --z-ind-select: 50; + --z-ind-tooltip: 75; + --z-ind-high: 100; + --z-ind-overlay: 500; +} + +*, +::before, +::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + background-color: var(--default-color-white); + font-size: var(--default-font-size); + line-height: 1; + height: 100%; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body { + color: var(--color-graphite); + font-weight: var(--f-wei-regular); + font-family: var(--f-family); + min-width: var(--min-width); + width: 100%; + height: 100%; +} + +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +details > summary { + cursor: pointer; + list-style: none; +} +details > summary::before, details > summary::-webkit-details-marker { + display: none; +} + +audio, canvas, progress, video { + display: inline-block; + vertical-align: baseline; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +address, caption, cite, code, dfn, strong, th, var { + font-style: normal; + font-weight: var(--f-wei-regular); +} + +h1, h2, h3, h4, h5, h6 { + font-weight: var(--f-wei-bold); + line-height: 1; +} + +b, strong, optgroup { + font-weight: var(--f-wei-bold); +} + +dfn, em, i { + font-style: italic; +} + +iframe, abbr, acronym, img { + border: 0; + outline: 0; +} + +mark { + background: var(--default-color-warning); + color: var(--default-color-black); +} + +small { + font-size: 80%; +} + +sub, sup { + font-size: 80%; + vertical-align: baseline; + line-height: 0; + position: relative; +} + +sup { + top: -0.25em; +} + +sub { + bottom: -0.25em; +} + +q::before, q::after { + content: ""; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +code, kbd, pre, samp { + font-family: monospace; + font-size: 1em; +} + +pre { + overflow: auto; +} + +figure { + margin: 0; +} + +fieldset { + border: 1px solid var(--color-pale); + padding: 0.25rem 0.75rem; +} + +legend { + border: 0; + color: inherit; + display: table; + word-spacing: normal; + max-width: 100%; +} + +button, input, optgroup, select, textarea { + color: inherit; + font: inherit; +} + +button, input { + overflow: visible; +} + +button, select { + text-transform: none; +} + +input { + line-height: 1; +} + +button::-moz-focus-inner, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +button:-moz-focusring, +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +input, input:focus, +button, textarea, +select, a:focus { + outline: 0; + border: 0; +} + +input::-webkit-input-placeholder, +input:-moz-placeholder, +textarea::-webkit-input-placeholder, +textarea:-moz-placeholder { + color: var(--color-pale); +} + +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + height: auto; +} + +input[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +input[type=search]::-webkit-search-cancel-button, +input[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + color: inherit; +} + +button, +input[type=button], +input[type=reset], +input[type=submit] { + -webkit-appearance: button; + cursor: pointer; +} + +button[disabled], input[disabled] { + cursor: no-drop; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + outline: 0; +} + +textarea { + overflow: auto; + resize: none; +} + +a { + cursor: pointer; + text-decoration: none; + color: inherit; +} +a:hover, a:focus { + color: var(--color-brand-blue); +} + +table { + border-collapse: collapse; + border-spacing: 0; + table-layout: fixed; +} + +ul, ol { + list-style: none; + margin: 0; + padding: 0; +} + +[hidden], template { + display: none; +} + +svg:not(:root) { + overflow: hidden; +} + +::selection { + background-color: var(--default-color-black); + color: var(--default-color-white); +} + +.footer { + border-top: 1px solid var(--color-faded); +} + +.maw-100p { + max-width: 100%; +} + +.maw-content, .content-width { + max-width: var(--max-content-width); +} + +.miw-content, #main { + min-width: var(--min-content-width); +} + +.w-100p, .responsive-typography ul li, .responsive-typography ol li, .responsive-typography ul, .responsive-typography ol, #root, #main, .content, .content-width { + width: 100%; +} + +.mah-100p { + max-height: 100%; +} + +.mah-100vh { + max-height: 100vh; +} + +.mih-100vh, #root { + min-height: 100vh; +} + +.mar-ha, .content-width { + margin-left: auto; + margin-right: auto; +} + +.pad-0x5, .main-menu > a { + padding: 0.5rem; +} + +.pad-h-1x25, .content-width { + padding-right: 1.25rem; + padding-left: 1.25rem; +} + +.pad-v-1, .header, .footer { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.gap-v-1x5 > :not([hidden]):not(.hidden-input) + :not([hidden]):not(.hidden-input), #main > :not([hidden]):not(.hidden-input) + :not([hidden]):not(.hidden-input) { + margin-top: 1.5rem; +} + +.gap-h-0x5 > :not(:last-child):not(:only-child) { + margin-right: 0.5rem; +} + +.gap-h-1 > :not(:last-child):not(:only-child), .main-menu > :not(:last-child):not(:only-child) { + margin-right: 1rem; +} + +.row-sta-sta, .main-menu { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} + +.row-sta-bet { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} + +.col-sta-sta { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} + +.col-str-sta, #root, #main { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; +} + +.flex-1, #main, .content { + -webkit-box-flex: 1 0; + -ms-flex: 1 0; + flex: 1 0; +} + +.responsive-typography h3 { + font-size: 24px; + margin: 1.5rem 0; +} +.responsive-typography > div, .responsive-typography p, .responsive-typography li { + font-size: 18px; + line-height: 1.5; +} +.responsive-typography ul li, .responsive-typography ol li { + position: relative; + min-height: 1.5rem; + padding-left: 1.5rem; +} +.responsive-typography ul li::before, .responsive-typography ol li::before { + content: ""; + position: absolute; + top: 0; + left: 0; +} +.responsive-typography ul > li::before, .responsive-typography ol > li::before { + background-color: var(--color-brand-blue); + border-radius: 50%; + width: 0.5rem; + height: 0.5rem; + margin-top: 0.5rem; + margin-left: 0.25rem; +} +.responsive-typography ul > * + *, .responsive-typography ol > * + * { + margin-top: 2rem; +} +.responsive-typography > div + div, .responsive-typography p + p { + margin-top: 1rem; +} +.responsive-typography li + li { + margin-top: 0.5rem; +} + +.anim, .main-menu > a, a, .anim::before, .main-menu > a::before, a::before, .anim::after, .main-menu > a::after, a::after { + transition: all 0.2s ease-in-out; +} + +.main-menu > a { + color: var(--color-brand-blue); + border-radius: 6px; + border: 1px solid var(--color-brand-blue); + text-decoration: none; +} +.main-menu > a:hover, .main-menu > a[aria-current]:not([aria-current=""]) { + color: var(--default-color-white); + background-color: var(--color-brand-blue); +} + +/* dropdown + * Source: https://codepen.io/markcaron/pen/wdVmpB + * + * TODO: change styles + * */ +.dropdown { + position: relative; + display: inline-block; +} +.dropdown > input[type=checkbox] { + position: absolute; + left: -100vw; +} +.dropdown > label { + display: inline-block; + padding: 6px 15px; + color: #333; + line-height: 1.5em; + text-decoration: none; + border: 1px solid #8c8c8c; + cursor: pointer; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.dropdown > label:hover { + border-color: #333; +} +.dropdown > label:after { + content: "▲"; + font-size: 10px; + display: inline-block; + margin-left: 6px; + vertical-align: top; +} +.dropdown > ul { + position: absolute; + z-index: 999; + display: block; + left: -100vw; + bottom: calc(1.5em + 14px); + border: 1px solid #8c8c8c; + background: #fff; + padding: 6px 0; + margin: 0; + list-style: none; + width: 100%; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15); +} +.dropdown > ul a { + display: block; + padding: 6px 15px; + text-decoration: none; + color: #333; +} +.dropdown > ul a:hover, .dropdown > ul a:focus { + background: #ececec; +} +.dropdown > input[type=checkbox]:checked ~ ul { + left: 0; +} +.dropdown > input[type=checkbox]:checked + label:after { + content: "▼"; +} + +/*# sourceMappingURL=main.css.map */ diff --git a/public/styles/main.css.map b/public/styles/main.css.map new file mode 100644 index 0000000..a2f9c4f --- /dev/null +++ b/public/styles/main.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../styles/base/reset.scss","../../styles/base/layout.scss","../../styles/atoms/sizes.scss","../../styles/atoms/white-spaces.scss","../../styles/mixins/white-spaces.scss","../../styles/atoms/flex.scss","../../styles/mixins/flex.scss","../../styles/atoms/typography.scss","../../styles/atoms/misc.scss","../../styles/uikit/main-menu.scss","../../styles/uikit/dropdown.scss"],"names":[],"mappings":";AAEA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAKF;EACE;EACA;;AAEA;EAEE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;EAEE;;;AAGF;EACE;EACA;;;AAGF;AAAA;EAEE;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;AAKA;EACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;ACvSF;EAEE;;;ACTF;EAAe;;;AACf;EAAe;;;AACf;EAAe;;;AACf;EAAU;;;AAEV;EAAa;;;AACb;EAAa;;;AACb;EAAa;;;ACPb;ECQgB;EAAmB;;;ADNnC;ECQmB;;;ADPnB;ECWqB;EAEA;;;ADZrB;ECSqB;EAEA;;;AAInB;EAfmB;;;AAmBnB;EAlBmB;;;AAkBnB;EAlBmB;;;ACLrB;ECCE;EACA;EACA;EAWA;EACA;EACA;EACA;EA4CA;EACA;EACA;EAoCA;EACA;EACA;;;ADpGF;ECAE;EACA;EACA;EAWA;EACA;EACA;EACA;EAmEA;EACA;EACA;EAaA;EACA;EACA;;;ADnGF;ECDE;EACA;EACA;EAmBA;EACA;EACA;EACA;EAoCA;EACA;EACA;EAoCA;EACA;EACA;;;ADlGF;ECFE;EACA;EACA;EAmBA;EACA;EACA;EACA;EAoCA;EACA;EACA;EAsDA;EACA;EACA;;;ADlHF;ECuCE,kBDvCsB;ECwCtB,UDxCsB;ECyCtB,MDzCsB;;;AEHtB;EACE;EACA;;AAGF;EACE;EACA;;AAMA;EAGE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAIJ;EACE;;AAGF;EACE;;;ACjDJ;EACE;;;ACGA;EAIE;EACA;EACA;EACA;;AAEA;EAEE;EACA;;;ACfN;AAAA;AAAA;AAAA;AAAA;AAMA;EACE;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAMJ;EACE;;AAGF;EACE","file":"main.css"} \ No newline at end of file diff --git a/server.ts b/server.ts new file mode 100644 index 0000000..c281d56 --- /dev/null +++ b/server.ts @@ -0,0 +1,177 @@ +import { StrRenderer } from "ren/str.ts"; +import * as log from "./log.ts"; +import rusTranslates from "./translates/rus.ts"; +import type { Translations } from "./translates/rus.ts"; +import { Context, getLangHref, Lang } from "./context.ts"; +import { E404Page } from "./views/pages/e404.ts"; +import { E500Page } from "./views/pages/e500.ts"; +import { AboutPage } from "./views/pages/about.ts"; +import { WorksPage } from "./views/pages/works.ts"; +import { Layout } from "./views/comp/layout.ts"; + +if (import.meta.main) { + await main(); +} + +async function main() { + await startServer({ port: 33334 }); +} + +async function startServer(cfg: ServerConfig) { + const srv = Deno.listen({ hostname: "localhost", port: cfg.port }); + log.info(`Server listening at http://localhost:${cfg.port}`); + + for await (const conn of srv) { + serveHttp(conn); + } +} + +interface ServerConfig { + port: number; +} + +async function serveHttp(conn: Deno.Conn) { + const httpConn = Deno.serveHttp(conn); + + for await (const reqEvt of httpConn) { + const res = await handleRequest(reqEvt.request); + reqEvt.respondWith(res); + } +} + +async function handleRequest(req: Request): Promise { + log.info({ method: req.method, url: req.url }); + + if (req.method === "GET") { + return await handleGet(req); + } else { + return new Response("Method Not Allowed", { status: 405 }); + } +} + +async function handleGet(req: Request) { + const ctx = createContextFromRequest(req); + + try { + const res = await tryCreateFileResponse(ctx.locPath); + return res; + } catch (_) { + if (ctx.lang !== Lang.Rus) { + await loadAndUpdateTranslations(ctx); + } + log.debug({ context: ctx }); + + const ren = new StrRenderer({ + wrapNode: Layout.bind(null, ctx), + onVisitAttr: ([key, value]) => { + if (key === "lhref" && typeof value === "string") { + return ["href", getLangHref(ctx.lang, value)]; + } else { + return [key, value]; + } + }, + }); + + try { + if (ctx.locPath === "/" || ctx.locPath === "/about") { + return createHtmlResponse(ren.render(AboutPage(ctx))); + } else if (ctx.locPath === "/works") { + return createHtmlResponse(ren.render(WorksPage(ctx))); + } else { + return createHtmlResponse(ren.render(E404Page(ctx)), 404); + } + } catch (_) { + return createHtmlResponse(ren.render(E500Page(ctx)), 500); + } + } +} + +async function loadAndUpdateTranslations(ctx: Context) { + try { + const translates = await import(`./translates/${ctx.lang}.ts`); + ctx.tr = Object.entries(translates.default as Partial) + .reduce( + (acc, [key, val]) => ({ + ...acc, + [key as keyof Translations]: val, + }), + { ...ctx.tr } as Translations, + ); + } catch (err) { + log.debug({ err }); + /* ignore */ + } +} + +function createContextFromRequest(req: Request): Context { + const locUrl = new URL(req.url); + const lang = langFromUrl(locUrl); + + return { + lang, + locPath: stripPrefix(`/${lang}`, locUrl.pathname), + tr: rusTranslates, + }; +} + +function langFromUrl(url: URL): Lang { + return url.pathname.startsWith("/eng/") ? Lang.Eng : Lang.Rus; +} + +function stripPrefix(prefix: string, val: string): string { + return val.startsWith(prefix) ? val.slice(prefix.length) : val; +} + +function createHtmlResponse(body: string, status = 200): Response { + return new Response(body, { + status, + headers: getContentTypeHeader("html"), + }); +} + +async function tryCreateFileResponse(urlPath: string): Promise { + const filePath = extractFilePath(urlPath); + log.debug({ filePath }); + if (!filePath) throw new SkipFile(); + + const content = await Deno.readTextFile(filePath).catch(() => { + throw new SkipFile(); + }); + + return createFileResponse(content, getFileExt(filePath)); +} + +class SkipFile extends Error {} + +function createFileResponse(content: string, fileExt: string): Response { + return new Response(content, { + headers: getContentTypeHeader(fileExt), + }); +} + +function extractFilePath(urlPath: string): string | null { + const relPath = urlPath.slice(1); + if (relPath.startsWith("styles/")) { + return `public/${relPath}`; + } + return null; +} + +function getContentTypeHeader(fileExt: string): Record { + return { "content-type": getContentTypeByExt(fileExt) }; +} + +function getContentTypeByExt(fileExt: string): string { + switch (fileExt) { + case "html": + return "text/html"; + case "css": + return "text/css"; + default: + return "text/plain"; + } +} + +function getFileExt(filePath: string): string { + return filePath.slice((filePath.lastIndexOf(".") - 1 >>> 0) + 2); +} diff --git a/src/components/layout.mts b/src/components/layout.mts deleted file mode 100644 index 0b784e9..0000000 --- a/src/components/layout.mts +++ /dev/null @@ -1,31 +0,0 @@ -import { AnyNode, E, Ea, Elem } from "ren"; -import { config } from "../config.mjs"; -import { div } from "../utils.mjs"; - -export function Layout(page: AnyNode): Elem { - return Ea("html", { lang: "ru" }, [ - E("head", [ - Ea("meta", { charset: "utf-8" }), - Ea("meta", { - name: "viewport", - content: "width=device-width, initial-scale=1", - }), - Ea("link", { - rel: "stylesheet", - href: "/static/styles.css", - }), - E("title", "pleshevski"), - ]), - E("body", [div({ id: "root" }, page), config.isDev && HotReloadScript()]), - ]); -} - -function HotReloadScript(): Elem { - return E( - "script", - `const ws = new WebSocket("ws://localhost:30001"); - ws.addEventListener("message", (m) => { - if (m.data === "RELOAD") location.reload(); - });` - ); -} diff --git a/src/components/page_layout.mts b/src/components/page_layout.mts deleted file mode 100644 index 1bc3e9c..0000000 --- a/src/components/page_layout.mts +++ /dev/null @@ -1,34 +0,0 @@ -import { AnyNode, Ea, Elem } from "ren"; -import { Context } from "../context.mjs"; -import { div } from "../utils.mjs"; - -export function PageLayout(ctx: Context, ...children: AnyNode[]): Elem { - return Ea("div", { id: "main" }, [ - Header(ctx.locPath), - Ea("div", { class: "content" }, children), - // Footer(), - ]); -} - -export function Header(locPath: string): Elem { - return Ea("header", { class: "header" }, [ - div({ class: "content-width" }, HeaderNav(locPath)), - ]); -} - -export function HeaderNav(locPath: string): Elem { - return Ea("nav", { class: "main-menu" }, [ - NavLink(locPath, "/", "Обо мне"), - NavLink(locPath, "/works", "Работы"), - ]); -} - -export function NavLink(locPath: string, href: string, text: string): Elem { - const attrs = { href }; - if (locPath === href) attrs["aria-current"] = "true"; - return Ea("a", attrs, text); -} - -export function Footer(): Elem { - return Ea("footer", { class: "footer" }, "footer"); -} diff --git a/src/config.mts b/src/config.mts deleted file mode 100644 index 4314470..0000000 --- a/src/config.mts +++ /dev/null @@ -1,17 +0,0 @@ -export const config = createConfig(); - -export function createConfig(): Config { - return { - isDev: process.env.NODE_ENV === "develop", - server: { port: 30000 }, - }; -} - -export interface Config { - isDev: boolean; - server: ServerConfig; -} - -export interface ServerConfig { - port: number; -} diff --git a/src/context.mts b/src/context.mts deleted file mode 100644 index 96a571b..0000000 --- a/src/context.mts +++ /dev/null @@ -1,3 +0,0 @@ -export interface Context { - locPath: string; -} diff --git a/src/lang.mts b/src/lang.mts deleted file mode 100644 index c4d0c68..0000000 --- a/src/lang.mts +++ /dev/null @@ -1,13 +0,0 @@ -export function isNil(v: Nilable): v is Nil { - return v == null; -} - -export type Nullable = T | null; - -export type Nilable = T | Nil; - -export type Nil = null | undefined; - -export function isBool(v: unknown): v is boolean { - return typeof v === "boolean"; -} diff --git a/src/main.mts b/src/main.mts deleted file mode 100644 index 4fb396c..0000000 --- a/src/main.mts +++ /dev/null @@ -1,7 +0,0 @@ -import { createServer } from "./server.mjs"; - -main(); - -function main(): void { - createServer(); -} diff --git a/src/server.mts b/src/server.mts deleted file mode 100644 index be03308..0000000 --- a/src/server.mts +++ /dev/null @@ -1,110 +0,0 @@ -import * as http from "http"; -import * as fs from "fs/promises"; -import * as path from "path"; -import { Layout } from "./components/layout.mjs"; -import { config } from "./config.mjs"; -import { debug, info } from "./log.mjs"; -import { StrRenderer } from "ren"; -import { AboutPage } from "./views/about.mjs"; -import { E404 } from "./views/e404.mjs"; -import { WorksPage } from "./views/works.mjs"; -import { Context } from "./context.mjs"; - -export function createServer(): void { - const server = http.createServer(handleHttpReq); - server.listen(config.server.port, () => { - info( - "[server]", - `Server listening at http://localhost:${config.server.port}` - ); - }); -} - -async function handleHttpReq( - httpReq: http.IncomingMessage, - httpRes: http.ServerResponse -): Promise { - try { - const req = tryIntoAppServerRequest(httpReq); - - debug("[server]", { req }); - - if (req.url.startsWith("/static")) { - const relFilePath = path.join(process.cwd(), req.url.slice(1)); - const mimeType = mimeTypeByExt.get(path.extname(relFilePath)); - - const fileContent = await fs - .readFile(relFilePath, { encoding: "utf-8" }) - .catch((_e) => null); - - if (fileContent && mimeType) { - httpRes.writeHead(200, { "content-type": mimeType }).end(fileContent); - } else { - httpRes.writeHead(404).end("Not found"); - } - } else { - const ctx: Context = { locPath: req.url }; - const ren = new StrRenderer(); - if (/^[/](?:about[/]?)?$/.test(req.url)) { - httpRes - .writeHead(200, { "content-type": "text/html" }) - .end(ren.render(Layout(AboutPage(ctx)))); - } else if (/^[/]works[/]?$/.test(req.url)) { - httpRes - .writeHead(200, { "content-type": "text/html" }) - .end(ren.render(Layout(WorksPage(ctx)))); - } else { - httpRes - .writeHead(404, { "content-type": "text/html" }) - .end(ren.render(Layout(E404(ctx)))); - } - } - } catch (err) { - if (err instanceof InvalidServerRequest) { - httpRes.writeHead(400).end("Bad request"); - } else if (err instanceof UnsupportedRestMethod) { - httpRes.writeHead(405).end("Method not allowed"); - } - } -} - -const mimeTypeByExt = new Map([[".css", "text/css"]]); - -export function tryIntoAppServerRequest( - req: http.IncomingMessage -): ServerRequest { - if (!req.method || !req.url) throw new InvalidServerRequest(); - - return { - method: tryIntoAppRestMethod(req.method), - url: req.url, - }; -} - -export interface ServerRequest { - method: RestMethod; - url: string; -} - -export class InvalidServerRequest extends Error {} - -export function tryIntoAppRestMethod(rest: string): RestMethod { - switch (rest.toUpperCase()) { - case "GET": - return RestMethod.Get; - default: - throw new UnsupportedRestMethod(); - } -} - -export enum RestMethod { - Get = "GET", -} - -export class UnsupportedRestMethod extends Error {} - -export interface ServerResponse { - statusCode?: number; - headers?: Headers; - body: string; -} diff --git a/src/utils.mts b/src/utils.mts deleted file mode 100644 index 267e1f3..0000000 --- a/src/utils.mts +++ /dev/null @@ -1,9 +0,0 @@ -import { E, Ea, Et } from "ren"; - -export const p = Et.bind(null, "p"); -export const h2 = Et.bind(null, "h2"); -export const h3 = Et.bind(null, "h3"); - -export const div = Ea.bind(null, "div"); -export const ul = E.bind(null, "ul"); -export const li = E.bind(null, "li"); diff --git a/src/views/about.mts b/src/views/about.mts deleted file mode 100644 index 27a9815..0000000 --- a/src/views/about.mts +++ /dev/null @@ -1,50 +0,0 @@ -import { PageLayout } from "../components/page_layout.mjs"; -import { AnyNode } from "ren"; -import { div, h3, li, p, ul } from "../utils.mjs"; -import { Context } from "../context.mjs"; - -export function AboutPage(ctx: Context): AnyNode { - return PageLayout( - ctx, - div({ class: "content-width responsive-typography" }, [ - div({}, [ - p("Привет!"), - p("Меня зовут Дмитрий Плешевский."), - p( - "Я ведущий разработчик программного обеспечения, архитектор,", - "руководитель команды, а так же ментор." - ), - p( - "Open-source проекты – моя страсть! Придумываю, экспериментирую,", - "воплощаю, улучшаю проекты в свое свободное время" - ), - p( - "Помимо программирования я люблю готовить и проводить время со своей", - "любимой семьей!" - ), - ]), - div({}, [ - h3("Языки программирования"), - p("Предпочитаю: Rust, TS"), - p("Огромный опыт: Rust, TS, JS, Python"), - p("Ограниченный опыт: Haskell, Java, C#"), - ]), - div({}, [ - h3("Базы данных"), - p("Предпочитаю: Postgres"), - p("Огромный опыт: Postgres, MySQL, Sqlite, mongo"), - ]), - div({}, [ - h3("Создание приложений"), - ul([ - li("Традиционное (SSR + Forms)"), - li("API (REST/GraphQL/WebSocket/EventSource)"), - li("Динамическое (SPA)"), - li("Гибридное (SSR + SPA)"), - li("Консольные"), - li("Кроссплатформенные"), - ]), - ]), - ]) - ); -} diff --git a/src/views/e404.mts b/src/views/e404.mts deleted file mode 100644 index f77fce9..0000000 --- a/src/views/e404.mts +++ /dev/null @@ -1,14 +0,0 @@ -import { PageLayout } from "../components/page_layout.mjs"; -import { AnyNode, Ea } from "ren"; -import { div } from "../utils.mjs"; -import { Context } from "../context.mjs"; - -export function E404(ctx: Context): AnyNode { - return PageLayout( - ctx, - div( - { class: "content-width" }, - Ea("h3", { class: "font-h3" }, "Страница не найдена") - ) - ); -} diff --git a/src/views/works.mts b/src/views/works.mts deleted file mode 100644 index 77ec332..0000000 --- a/src/views/works.mts +++ /dev/null @@ -1,32 +0,0 @@ -import { PageLayout } from "../components/page_layout.mjs"; -import { AnyNode, Ea } from "ren"; -import { div, h3, li, ul } from "../utils.mjs"; -import { Context } from "../context.mjs"; - -export function WorksPage(ctx: Context): AnyNode { - return PageLayout( - ctx, - div({ class: "content-width responsive-typography" }, [ - h3("Одни из моих последних работ"), - ul([ - li(Ea("a", { href: "https://github.com/pleshevskiy/ren" }, "ren")), - li(Ea("a", { href: "https://github.com/pleshevskiy/hwt" }, "hwt")), - li( - Ea( - "a", - { href: "https://github.com/pleshevskiy/sonic-channel" }, - "sonic-channel" - ) - ), - li(Ea("a", { href: "https://github.com/pleshevskiy/migra" }, "migra")), - li( - Ea( - "a", - { href: "https://github.com/pleshevskiy/itconfig-rs" }, - "itconfig-rs" - ) - ), - ]), - ]) - ); -} diff --git a/static/styles.css b/static/styles.css deleted file mode 100644 index 7f916ea..0000000 --- a/static/styles.css +++ /dev/null @@ -1,150 +0,0 @@ -:root { - --min-width: 320px; - --max-width: 1024px; - - --default-color-white: #ffffff; - --color-blue: #1966df; - - --default-font-size: 16px; - --font-family: system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Roboto,Oxygen-Sans, Ubuntu, Cantarell, "Segoe UI", Verdana, sans-serif; - --font-weight-regular: 400; -} - -*, *::before, *::after { - box-sizing: border-box; - padding: 0; - margin: 0; -} - -html { - background-color: var(--default-color-white); - font-size: var(--default-font-size); - line-height: 1; - -webkit-text-size-adjust: 100%; - -moz-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -body { - font-weight: var(--font-weight-regular); - font-family: var(--font-family); - min-width: var(--min-width); -} - -html, body { - height: 100%; - width: 100%; -} - -ul, ol { - list-style: none; -} - -#root { - min-height: 100vh; - align-items: stretch; -} - -#root, -#main { - display: flex; - flex-direction: column; -} - -#main, -.content { - flex: 1 0; -} - -.header { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} - -.main-menu { - display: flex; - flex-direction: row; -} - -// anim -.main-menu > a { - transition: all .2s ease-in-out; -} - -.main-menu > a { - color: var(--color-blue); - padding: 0.5rem; - border-radius: 6px; - border: 1px solid var(--color-blue); - text-decoration: none; -} -.main-menu > a:hover, -.main-menu > a[aria-current]:not([aria-current=""]) { - color: var(--default-color-white); - background-color: var(--color-blue); -} -.main-menu > a:not(:last-child) { - margin-right: 1rem; -} - -.content-width { - width: 100%; - max-width: var(--max-width); - margin-left: auto; - margin-right: auto; - padding-left: 1.25rem; - padding-right: 1.25rem; -} - -.responsive-typography h3 { - font-size: 24px; -} - -.responsive-typography > div, -.responsive-typography p, -.responsive-typography li { - font-size: 18px; - line-height: 1.5; -} - -.responsive-typography ul, -.responsive-typography ol { - width: 100%; -} - -.responsive-typography ul li, -.responsive-typography ol li { - position: relative; - width: 100%; - min-height: 1.5rem; - padding-left: 1.5rem; -} - -.responsive-typography ul li::before, -.responsive-typography ol li::before { - content: ''; - position: absolute; - top: 0; - left: 0; -} - -.responsive-typography ul > li::before { - background-color: var(--color-blue); - border-radius: 50%; - width: 0.5rem; - height: 0.5rem; - margin-top: 0.5rem; - margin-left: 0.25rem; -} - -.responsive-typography > * + * { - margin-top: 2rem; -} - -.responsive-typography > div + div, -.responsive-typography p + p { - margin-top: 1rem; -} -.responsive-typography li + li { - margin-top: 0.5rem; -} diff --git a/styles/atoms/flex.scss b/styles/atoms/flex.scss new file mode 100644 index 0000000..968a8a1 --- /dev/null +++ b/styles/atoms/flex.scss @@ -0,0 +1,6 @@ +.row-sta-sta { @include flex-layout(row, sta, sta) } +.row-sta-bet { @include flex-layout(row, sta, bet) } +.col-sta-sta { @include flex-layout(col, sta, sta) } +.col-str-sta { @include flex-layout(col, str, sta) } + +.flex-1 { @include flex(1 0) } diff --git a/styles/atoms/misc.scss b/styles/atoms/misc.scss new file mode 100644 index 0000000..8b8987e --- /dev/null +++ b/styles/atoms/misc.scss @@ -0,0 +1,3 @@ +.anim, .anim::before, .anim::after { + transition: all 0.2s ease-in-out; +} diff --git a/styles/atoms/mod.scss b/styles/atoms/mod.scss new file mode 100644 index 0000000..172a120 --- /dev/null +++ b/styles/atoms/mod.scss @@ -0,0 +1,5 @@ +@import 'sizes'; +@import 'white-spaces'; +@import 'flex'; +@import 'typography'; +@import 'misc'; diff --git a/styles/atoms/sizes.scss b/styles/atoms/sizes.scss new file mode 100644 index 0000000..f8c5060 --- /dev/null +++ b/styles/atoms/sizes.scss @@ -0,0 +1,9 @@ +.maw-100p { max-width: 100% } +.maw-content { max-width: var(--max-content-width) } +.miw-content { min-width: var(--min-content-width) } +.w-100p { width: 100% } + +.mah-100p { max-height: 100% } +.mah-100vh { max-height: 100vh } +.mih-100vh { min-height: 100vh } + diff --git a/styles/atoms/typography.scss b/styles/atoms/typography.scss new file mode 100644 index 0000000..43f8fbd --- /dev/null +++ b/styles/atoms/typography.scss @@ -0,0 +1,57 @@ +.responsive-typography { + + h3 { + font-size: 24px; + margin: 1.5rem 0; + } + + > div, p, li { + font-size: 18px; + line-height: 1.5; + } + + ul, ol { + @extend .w-100p; + + li { + @extend .w-100p; + + position: relative; + min-height: 1.5rem; + padding-left: 1.5rem; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + } + } + + > li::before { + background-color: var(--color-brand-blue); + border-radius: 50%; + width: 0.5rem; + height: 0.5rem; + margin-top: 0.5rem; + margin-left: 0.25rem; + } + + > * + * { + margin-top: 2rem; + } + } + + > div + div, p + p { + margin-top: 1rem; + } + + li + li { + margin-top: 0.5rem; + } + +} + + + + diff --git a/styles/atoms/white-spaces.scss b/styles/atoms/white-spaces.scss new file mode 100644 index 0000000..be309bf --- /dev/null +++ b/styles/atoms/white-spaces.scss @@ -0,0 +1,11 @@ +.mar-ha { @include mar-ha } + +.pad-0x5 { @include pad(0.5) } +.pad-h-1x25 { @include pad-h(1.25) } +.pad-v-1 { @include pad-v(1) } + +.gap-v-1x5 { @include gap-v(1.5) } + +.gap-h-0x5 { @include gap-h(0.5) } +.gap-h-1 { @include gap-h(1) } + diff --git a/styles/base/layout.scss b/styles/base/layout.scss new file mode 100644 index 0000000..749785c --- /dev/null +++ b/styles/base/layout.scss @@ -0,0 +1,11 @@ +#root { @extend .col-str-sta, .w-100p, .mih-100vh } +#main { @extend .col-str-sta, .flex-1, .miw-content, .w-100p, .gap-v-1x5 } +.content { @extend .flex-1, .w-100p } +.content-width { @extend .maw-content, .w-100p, .mar-ha, .pad-h-1x25 } + +.header { @extend .pad-v-1 } + +.footer { + @extend .pad-v-1; + border-top: 1px solid var(--color-faded); +} diff --git a/styles/base/reset.scss b/styles/base/reset.scss new file mode 100644 index 0000000..2c801e4 --- /dev/null +++ b/styles/base/reset.scss @@ -0,0 +1,305 @@ +@use "sass:math"; + +:root { + // Default Colors + --default-color-black: #000000; + --default-color-black-0: hsla(0, 0%, 0%, 0); + --default-color-black-0x15: hsla(0, 0%, 0%, 0.15); + --default-color-black-0x6: hsla(0, 0%, 0%, 0.6); + --default-color-white: #FFFFFF; + --default-color-warning: #ffee58; + --default-color-error: #b00008; + --default-color-success: #417505; + // Project Colors + --color-brand-blue: #1966df; + --color-graphite: #212121; + --color-warm-gray: #757575; + --color-pale: #B6B6B6; + --color-faded: #E0E0E0; + // Layout + --max-width: #{$page-max-width + px}; + --min-width: #{$page-min-width + px}; + // Borders + --rad-std-half: #{math.div($radius, 2)}; + --rad-std: #{$radius}; + --rad-std-x2: #{$radius * 2}; + --rad-std-x3: #{$radius * 3}; + // Font + --default-font-size: 16px; + --f-family: system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Roboto,Oxygen-Sans, Ubuntu, Cantarell, "Segoe UI", Verdana, sans-serif; + --f-wei-thin: 100; + --f-wei-reg: 400; // Normal = Regular + --f-wei-bold: 700; + --f-wei-black: 800; // Extra Bold = Black + // Z-index + --z-ind-background: -100; + --z-ind-backward: -1; + --z-ind-select: 50; + --z-ind-tooltip: 75; + --z-ind-high: 100; + --z-ind-overlay: 500; +} + +*, +::before, +::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + background-color: var(--default-color-white); + font-size: var(--default-font-size); + line-height: 1; + height: 100%; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body { + color: var(--color-graphite); + font-weight: var(--f-wei-regular); + font-family: var(--f-family); + min-width: var(--min-width); + width: 100%; + height: 100%; +} + +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +summary {} + +details > summary { + cursor: pointer; + list-style: none; + + &::before, + &::-webkit-details-marker { + display: none; + } +} + +audio, canvas, progress, video { + display: inline-block; + vertical-align: baseline; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +address, caption, cite, code, dfn, strong, th, var { + font-style: normal; + font-weight: var(--f-wei-regular); +} + +h1, h2, h3, h4, h5, h6 { + font-weight: var(--f-wei-bold); + line-height: 1; +} + +b, strong, optgroup { + font-weight: var(--f-wei-bold); +} + +dfn, em, i { + font-style: italic; +} + +iframe, abbr, acronym, img { + border: 0; + outline: 0; +} + +mark { + background: var(--default-color-warning); + color: var(--default-color-black); +} + +small { + font-size: 80%; +} + +sub, sup { + font-size: 80%; + vertical-align: baseline; + line-height: 0; + position: relative; +} + +sup { + top: -0.25em; +} + +sub { + bottom: -0.25em; +} + +q::before, q::after { + content: ''; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +code, kbd, pre, samp { + font-family: monospace; + font-size: 1em; +} + +pre { + overflow: auto; +} + +figure { + margin: 0; +} + +fieldset { + border: 1px solid var(--color-pale); + padding: 0.25rem 0.75rem; +} + +legend { + border: 0; + color: inherit; + display: table; + word-spacing: normal; + max-width: 100%; +} + +button, input, optgroup, select, textarea { + color: inherit; + font: inherit; +} + +button, input { + overflow: visible; +} + +button, select { + text-transform: none; +} + +input { + line-height: 1; +} + +button::-moz-focus-inner, +[type='button']::-moz-focus-inner, +[type='reset']::-moz-focus-inner, +[type='submit']::-moz-focus-inner { + border-style: none; + padding: 0; +} + +button:-moz-focusring, +[type='button']:-moz-focusring, +[type='reset']:-moz-focusring, +[type='submit']:-moz-focusring { + outline: 1px dotted ButtonText; +} + +input, input:focus, +button, textarea, +select, a:focus { + outline: 0; + border: 0; +} + +input::-webkit-input-placeholder, +input:-moz-placeholder, +textarea::-webkit-input-placeholder, +textarea:-moz-placeholder { + color: var(--color-pale); +} + +input[type='number']::-webkit-inner-spin-button, +input[type='number']::-webkit-outer-spin-button { + height: auto; +} + +input[type='search'] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +input[type='search']::-webkit-search-cancel-button, +input[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + color: inherit; +} + +button, +input[type='button'], +input[type='reset'], +input[type='submit'] { + -webkit-appearance: button; + cursor: pointer; +} + +button[disabled], input[disabled] { + cursor: no-drop; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + outline: 0; +} + +textarea { + overflow: auto; + resize: none; +} + +a { + cursor: pointer; + text-decoration: none; + color: inherit; + + // TODO: move to other place + @extend .anim; + + &:hover, &:focus { + color: var(--color-brand-blue); + } +} + +table { + border-collapse: collapse; + border-spacing: 0; + table-layout: fixed; +} + +ul, ol { + list-style: none; + margin: 0; + padding: 0; +} + +[hidden], template { + display: none; +} + +svg:not(:root) { + overflow: hidden; +} + +::selection { + background-color: var(--default-color-black); + color: var(--default-color-white); +} + diff --git a/styles/main.scss b/styles/main.scss new file mode 100644 index 0000000..a539986 --- /dev/null +++ b/styles/main.scss @@ -0,0 +1,6 @@ +@import 'variables'; +@import 'mixins/mod'; +@import 'base/reset'; +@import 'base/layout'; +@import 'atoms/mod'; +@import 'uikit/mod'; diff --git a/styles/mixins/flex.scss b/styles/mixins/flex.scss new file mode 100644 index 0000000..0b8f923 --- /dev/null +++ b/styles/mixins/flex.scss @@ -0,0 +1,165 @@ +@mixin dis-flex { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +@mixin dis-inl-flex { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; +} + +@mixin flex-dir-row { + @include dis-flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; +} + +@mixin flex-dir-col { + @include dis-flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +@mixin flex-dir($val) { + @if $val == row {@include flex-dir-row;} + @else if $val == col {@include flex-dir-col;} + @else {@error 'unknown flex-direction: #{$val}';} +} + +@mixin flex-wrap($val: wrap) { + -ms-flex-wrap: $val; + flex-wrap: $val; +} + +@mixin flex-nowrap { + @include flex-wrap(nowrap); +} + +@mixin flex($val) { + -webkit-box-flex: $val; + -ms-flex: $val; + flex: $val; +} + +@mixin flex-shrink($val) { + -ms-flex-negative: $val; + flex-shrink: $val; +} + +@mixin ord($val) { + -webkit-box-ordinal-group: $val + 1; + -ms-flex-order: $val; + order: $val; +} + +@mixin flex-jus-sta { + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +@mixin flex-jus-cen { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +@mixin flex-jus-end { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +@mixin flex-jus-aro { + -ms-flex-pack: distribute; + justify-content: space-around; +} + +@mixin flex-jus-bet { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +@mixin flex-jus($val) { + @if $val == sta {@include flex-jus-sta;} + @else if $val == cen {@include flex-jus-cen;} + @else if $val == end {@include flex-jus-end;} + @else if $val == aro {@include flex-jus-aro;} + @else if $val == bet {@include flex-jus-bet;} + @else {@error 'unknown flex-jus (justify-content) property: #{$val}';} +} + +@mixin flex-ali-sta { + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} + +@mixin flex-ali-cen { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +@mixin flex-ali-end { + -webkit-box-align: end; + -ms-flex-align: end; + align-items: flex-end; +} + +@mixin flex-ali-str { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; +} + +@mixin flex-ali($val) { + @if $val == sta {@include flex-ali-sta;} + @else if $val == cen {@include flex-ali-cen;} + @else if $val == end {@include flex-ali-end;} + @else if $val == str {@include flex-ali-str;} + @else {@error 'unknown flex-ali (align-items) property: #{$val}';} +} + +@mixin ali-self-sta { + -ms-flex-item-align: start; + align-self: flex-start; +} + +@mixin ali-self-cen { + -ms-flex-item-align: center; + -ms-grid-row-align: center; + align-self: center; +} + +@mixin ali-self-end { + -ms-flex-item-align: end; + align-self: flex-end; +} + +@mixin ali-self-str { + -ms-flex-item-align: stretch; + -ms-grid-row-align: stretch; + align-self: stretch; +} + +@mixin ali-self($val) { + @if $val == sta {@include ali-self-sta;} + @else if $val == cen {@include ali-self-cen;} + @else if $val == end {@include ali-self-end;} + @else if $val == str {@include ali-self-str;} + @else {@error 'unknown ali-self (align-self) property: #{$val}';} +} + +@mixin flex-layout($dir: none, $ali: none, $jus: none) { + @if $dir != none {@include flex-dir($dir);} + @if $jus != none {@include flex-jus($jus);} + @if $ali != none {@include flex-ali($ali);} +} diff --git a/styles/mixins/mod.scss b/styles/mixins/mod.scss new file mode 100644 index 0000000..276fb85 --- /dev/null +++ b/styles/mixins/mod.scss @@ -0,0 +1,2 @@ +@import 'flex'; +@import 'white-spaces'; diff --git a/styles/mixins/white-spaces.scss b/styles/mixins/white-spaces.scss new file mode 100644 index 0000000..fbfd577 --- /dev/null +++ b/styles/mixins/white-spaces.scss @@ -0,0 +1,29 @@ + +@mixin mar($val) { margin: #{$val}rem } +@mixin mar-v($val) { @include mar-t($val); @include mar-b($val) } +@mixin mar-h($val) { @include mar-r($val); @include mar-l($val) } +@mixin mar-t($val) { margin-top: #{$val}rem } +@mixin mar-r($val) { margin-right: #{$val}rem } +@mixin mar-b($val) { margin-bottom: #{$val}rem } +@mixin mar-l($val) { margin-left: #{$val}rem } +@mixin mar-ha { margin-left: auto; margin-right: auto } + +@mixin pad($val) { padding: #{$val}rem } +@mixin pad-v($val) { @include pad-t($val); @include pad-b($val) } +@mixin pad-h($val) { @include pad-r($val); @include pad-l($val) } +@mixin pad-t($val) { padding-top: #{$val}rem } +@mixin pad-r($val) { padding-right: #{$val}rem } +@mixin pad-b($val) { padding-bottom: #{$val}rem } +@mixin pad-l($val) { padding-left: #{$val}rem } + +@mixin gap-v($val) { + > :not([hidden]):not(.hidden-input) + :not([hidden]):not(.hidden-input) { @include mar-t($val) } +} + +@mixin gap-h($val) { + > :not(:last-child):not(:only-child) { @include mar-r($val) } +} + +@mixin gap-h-l($val) { + > :not([hidden]):not(.hidden-input) + :not([hidden]):not(.hidden-input) { @include mar-l($val) } +} diff --git a/styles/uikit/dropdown.scss b/styles/uikit/dropdown.scss new file mode 100644 index 0000000..4ce34b3 --- /dev/null +++ b/styles/uikit/dropdown.scss @@ -0,0 +1,83 @@ + +/* dropdown + * Source: https://codepen.io/markcaron/pen/wdVmpB + * + * TODO: change styles + * */ + +.dropdown { + position: relative; + display: inline-block; + + & > input[type="checkbox"] { + position: absolute; + left: -100vw; + } + + & > label { + display: inline-block; + padding: 6px 15px; + color: #333; + line-height: 1.5em; + text-decoration: none; + border: 1px solid #8c8c8c; + cursor: pointer; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + + &:hover { + border-color: #333; + } + + &:after { + content: "▲"; + font-size: 10px; + display: inline-block; + margin-left: 6px; + vertical-align: top; + } + } + + & > ul { + position: absolute; + z-index: 999; + display: block; + left: -100vw; + bottom: calc(1.5em + 14px); + border: 1px solid #8c8c8c; + background: #fff; + padding: 6px 0; + margin: 0; + list-style: none; + width: 100%; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 3px 8px rgba(0,0,0,.15); + -moz-box-shadow: 0 3px 8px rgba(0,0,0,.15); + box-shadow: 0 3px 8px rgba(0,0,0,.15); + + a { + display: block; + padding: 6px 15px; + text-decoration: none; + color: #333; + + &:hover, &:focus { + background: #ececec; + } + } + } + + & > input[type="checkbox"]:checked { + & ~ ul { + left: 0; + } + + & + label:after { + content: "▼"; + } + } +} + diff --git a/styles/uikit/main-menu.scss b/styles/uikit/main-menu.scss new file mode 100644 index 0000000..d26d52b --- /dev/null +++ b/styles/uikit/main-menu.scss @@ -0,0 +1,21 @@ + +.main-menu { + @extend .row-sta-sta, .gap-h-1; + + > a { + @extend .pad-0x5, .anim; + + // TODO: move to atoms + color: var(--color-brand-blue); + border-radius: 6px; + border: 1px solid var(--color-brand-blue); + text-decoration: none; + + &:hover, + &[aria-current]:not([aria-current=""]) { + color: var(--default-color-white); + background-color: var(--color-brand-blue); + } + } +} + diff --git a/styles/uikit/mod.scss b/styles/uikit/mod.scss new file mode 100644 index 0000000..4de409d --- /dev/null +++ b/styles/uikit/mod.scss @@ -0,0 +1,2 @@ +@import 'main-menu'; +@import 'dropdown'; diff --git a/styles/variables.scss b/styles/variables.scss new file mode 100644 index 0000000..cc38d60 --- /dev/null +++ b/styles/variables.scss @@ -0,0 +1,9 @@ +@use "sass:math"; + +$radius: 0.25rem; +$col: 12; +$col-gutter: 24; +$page-max-width: 1440; +$page-min-width: 320; +$content-width: $page-max-width - ($col-gutter * 2); +$col-width: math.div($content-width - $col-gutter * $col - 1, $col); diff --git a/translates/eng.ts b/translates/eng.ts new file mode 100644 index 0000000..d5bd618 --- /dev/null +++ b/translates/eng.ts @@ -0,0 +1,33 @@ +import { Translations } from "./rus.ts"; + +export default { + About: "About", + Works: "Works", + My_latest_works: "My latest works", + Source_code: "Source code", + Page_not_found: "Page not found", + Internal_server_error: "Internal server error", + about: { + Hi: "Hi!", + My_name_is_Dmitriy_Pleshevskiy: "My name is Dmitriy Pleshevskiy.", + I_am_lead_software_developer_architect_team_leader_and_mentor: + "I'm a lead software developer, architect, team leader and mentor", + Open_source_projects_are_my_passion_I_invent_experiment_implement_and_improve_projects_in_my_spare_time: + "Open-source projects are my passion! I invest, exeriment, implement and improve projects in my spare time", + Besides_programming_I_love_to_cook_and_spend_time_with_my_beloved_family: + "Besides programming, I love to cook and spend time with my beloved family!", + Programming_languages: "Programming languages", + Prefer: "Prefer", + Extensive_experience: "Extensive experience", + Limited_experience: "Limited experience", + + Databases: "Databases", + + Creating_applications: "Creating applications", + Traditional: "Traditional", + Dynamic: "Dynamic", + Hybrid: "Hybrid", + Console: "Console", + Crossplatform: "Crossplatform", + }, +} as Translations; diff --git a/translates/rus.ts b/translates/rus.ts new file mode 100644 index 0000000..881f6f2 --- /dev/null +++ b/translates/rus.ts @@ -0,0 +1,35 @@ +export const rus = { + About: "Обо мне", + Works: "Работы", + My_latest_works: "Мои последние работы", + Source_code: "Исходный код", + Page_not_found: "Страница не найдена", + Internal_server_error: "Внутренняя ошибка сервера", + about: { + Hi: "Привет!", + My_name_is_Dmitriy_Pleshevskiy: "Меня зовут Дмитрий Плешевский.", + I_am_lead_software_developer_architect_team_leader_and_mentor: + "Я ведущий разработчик програмного обеспечения, архитектор, руководитель команды, а так же ментор.", + Open_source_projects_are_my_passion_I_invent_experiment_implement_and_improve_projects_in_my_spare_time: + "Open-source проекты – моя страсть! Придумываю, экспериментирую, воплощаю, улучшаю проекты в свое свободное время", + Besides_programming_I_love_to_cook_and_spend_time_with_my_beloved_family: + "Помимо программирования я люблю готовить и проводить время со своей любимой семьей!", + Programming_languages: "Языки программирования", + Prefer: "Предпочитаю", + Extensive_experience: "Огромный опыт", + Limited_experience: "Ограниченный опыт", + + Databases: "Базы данных", + + Creating_applications: "Создание приложений", + Traditional: "Традиционные", + Dynamic: "Динамичное", + Hybrid: "Гибридное", + Console: "Консольные", + Crossplatform: "Кроссплатформенные", + }, +}; + +export default rus; + +export type Translations = typeof rus; diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 0aac9a7..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "outDir": "target/scripts", - "target": "esnext", - "module": "esnext", - "lib": ["dom", "esnext"], - "moduleResolution": "node", - "rootDir": "src", - "forceConsistentCasingInFileNames": true, - "suppressImplicitAnyIndexErrors": true, - "skipLibCheck": true, - "allowSyntheticDefaultImports": true, - "strict": true, - "noImplicitReturns": true, - "noImplicitThis": true, - "noImplicitAny": true - }, - "include": [ - "src/**/*.mts" - ], -} diff --git a/views/comp/layout.ts b/views/comp/layout.ts new file mode 100644 index 0000000..573e39f --- /dev/null +++ b/views/comp/layout.ts @@ -0,0 +1,19 @@ +import { AnyNode, E } from "ren/node.ts"; +import { Context } from "../../context.ts"; + +export function Layout(ctx: Context, page: AnyNode): AnyNode { + return E("html", { lang: ctx.lang }, [ + E("head", [], [ + E("meta", { charset: "utf-8" }), + E("meta", { + name: "viewport", + content: "width=device-width, initial-scale=1", + }), + E("link", { rel: "stylesheet", href: "/styles/main.css" }), + E("title", [], "Recipes"), + ]), + E("body", [], [ + E("div", { id: "root" }, [page]), + ]), + ]); +} diff --git a/views/comp/page_layout.ts b/views/comp/page_layout.ts new file mode 100644 index 0000000..64460ee --- /dev/null +++ b/views/comp/page_layout.ts @@ -0,0 +1,59 @@ +import { AnyNode, Attrs, E, Elem } from "ren/node.ts"; +import { classNames } from "ren/attrs.ts"; +import { Context, getLangHref, iterLangs, Lang } from "../../context.ts"; +import { Link, RepoLink } from "../uikit/link.ts"; + +export function PageLayout(ctx: Context, children: AnyNode[]): Elem { + return E("div", { id: "main" }, [ + Header(ctx), + E("div", classNames("content"), children), + Footer(ctx), + ]); +} + +export function Header(ctx: Context): AnyNode { + return E("header", classNames("header gap-v-1x5"), [ + E("div", classNames("content-width"), [HeaderNav(ctx)]), + ]); +} + +export function HeaderNav(ctx: Context): AnyNode { + return E("nav", classNames("main-menu"), [ + Link(ctx.tr.About, navLink("/", ctx)), + Link(ctx.tr.Works, navLink("/works", ctx)), + ]); +} + +function navLink(lhref: string, ctx?: Context): Attrs { + const attrs: Attrs = { lhref }; + if (ctx?.locPath === lhref) attrs["aria-current"] = "true"; + return attrs; +} + +export function Footer(ctx: Context): AnyNode { + return E("footer", classNames("footer"), [ + E("div", classNames("content-width row-sta-bet"), [ + RepoLink(ctx.tr.Source_code, "/pleshevskiy/recipes"), + ChangeLang(ctx), + ]), + ]); +} + +export function ChangeLang(ctx: Context): AnyNode { + const dropdownId = "change_langs"; + return E("div", classNames("dropdown"), [ + E("input", { id: dropdownId, type: "checkbox" }), + E("label", { for: dropdownId }, ctx.lang), + E( + "ul", + [], + iterLangs().filter((l) => l !== ctx.lang).map((l) => + ChangeLangBtn(ctx, l) + ), + ), + ]); +} + +export function ChangeLangBtn(ctx: Context, lang: Lang): AnyNode { + return Link(lang, { "href": getLangHref(lang, ctx.locPath) }); +} diff --git a/views/pages/about.ts b/views/pages/about.ts new file mode 100644 index 0000000..b621cf8 --- /dev/null +++ b/views/pages/about.ts @@ -0,0 +1,49 @@ +import { PageLayout } from "../comp/page_layout.ts"; +import { AnyNode, E } from "ren/node.ts"; +import { classNames } from "ren/attrs.ts"; +import { Context } from "../../context.ts"; +import { H3 } from "../uikit/typo.ts"; + +const p = E.bind(null, "p", []); +const ul = E.bind(null, "ul", []); +const li = E.bind(null, "li", []); + +export function AboutPage(ctx: Context): AnyNode { + return PageLayout(ctx, [ + E("div", classNames("content-width responsive-typography"), [ + p(ctx.tr.about.Hi), + p(ctx.tr.about.My_name_is_Dmitriy_Pleshevskiy), + p( + ctx.tr.about + .I_am_lead_software_developer_architect_team_leader_and_mentor, + ), + p( + ctx.tr.about + .Open_source_projects_are_my_passion_I_invent_experiment_implement_and_improve_projects_in_my_spare_time, + ), + p( + ctx.tr.about + .Besides_programming_I_love_to_cook_and_spend_time_with_my_beloved_family, + ), + + H3(ctx.tr.about.Programming_languages), + p(`${ctx.tr.about.Prefer}: Rust, TS, Bash`), + p(`${ctx.tr.about.Extensive_experience}: Rust, TS, JS, Python, Bash`), + p(`${ctx.tr.about.Limited_experience}: Haskell, Java, C#, C++`), + + H3(ctx.tr.about.Databases), + p(`${ctx.tr.about.Prefer}: Postgres`), + p(`${ctx.tr.about.Extensive_experience}: Postgres, MySQL, Sqlite, Mongo`), + + H3(ctx.tr.about.Creating_applications), + ul([ + li(`${ctx.tr.about.Traditional} (SSR + Forms)`), + li("API (REST/GraphQL/WebSocket/EventSource)"), + li(`${ctx.tr.about.Dynamic} (SPA)`), + li(`${ctx.tr.about.Hybrid} (SSR + SPA)`), + li(ctx.tr.about.Console), + li(ctx.tr.about.Crossplatform), + ]), + ]), + ]); +} diff --git a/views/pages/e404.ts b/views/pages/e404.ts new file mode 100644 index 0000000..56cdb1b --- /dev/null +++ b/views/pages/e404.ts @@ -0,0 +1,15 @@ +import { PageLayout } from "../comp/page_layout.ts"; +import { AnyNode, E } from "ren/node.ts"; +import { classNames } from "ren/attrs.ts"; +import { Context } from "../../context.ts"; +import { H3 } from "../uikit/typo.ts"; + +export function E404Page(ctx: Context): AnyNode { + return PageLayout(ctx, [E404(ctx)]); +} + +export function E404(ctx: Context): AnyNode { + return E("div", classNames("content-width gap-v-1x5"), [ + H3(ctx.tr.Page_not_found), + ]); +} diff --git a/views/pages/e500.ts b/views/pages/e500.ts new file mode 100644 index 0000000..3a45b91 --- /dev/null +++ b/views/pages/e500.ts @@ -0,0 +1,15 @@ +import { PageLayout } from "../comp/page_layout.ts"; +import { AnyNode, E } from "ren/node.ts"; +import { classNames } from "ren/attrs.ts"; +import { Context } from "../../context.ts"; +import { H3 } from "../uikit/typo.ts"; + +export function E500Page(ctx: Context): AnyNode { + return PageLayout(ctx, [E500(ctx)]); +} + +export function E500(ctx: Context): AnyNode { + return E("div", classNames("content-width gap-v-1x5"), [ + H3(ctx.tr.Internal_server_error), + ]); +} diff --git a/views/pages/works.ts b/views/pages/works.ts new file mode 100644 index 0000000..817ff9b --- /dev/null +++ b/views/pages/works.ts @@ -0,0 +1,32 @@ +import { PageLayout } from "../comp/page_layout.ts"; +import { AnyNode, E } from "ren/node.ts"; +import { classNames } from "ren/attrs.ts"; +import { Context } from "../../context.ts"; +import { H3 } from "../uikit/typo.ts"; + +const ul = E.bind(null, "ul", []); +const li = E.bind(null, "li", []); + +export function WorksPage(ctx: Context): AnyNode { + return PageLayout(ctx, [ + E("div", classNames("content-width gap-v-1x5 responsive-typography"), [ + H3(ctx.tr.My_latest_works), + ul([ + li([RepoLink("ren", "/pleshevskiy/ren")]), + li([RepoLink("hwt", "github.com/pleshevskiy/hwt")]), + li([RepoLink("sonic-channel", "github.com/pleshevskiy/sonic-channel")]), + li([RepoLink("migra", "github.com/pleshevskiy/migra")]), + li([RepoLink("itconfig", "/pleshevskiy/itconfig")]), + ]), + ]), + ]); +} + +export function RepoLink(name: string, repo: string): AnyNode { + const gitBase = new URL("https://git.pleshevski.ru"); + return E("a", { + target: "_blank", + href: new URL(repo, gitBase).toString(), + rel: "external nofollow noopener noreferrer", + }, name); +} diff --git a/views/uikit/link.ts b/views/uikit/link.ts new file mode 100644 index 0000000..1c3f7d1 --- /dev/null +++ b/views/uikit/link.ts @@ -0,0 +1,15 @@ +import { AnyNode, Attrs, E } from "ren/node.ts"; + +export function RepoLink(name: string, repo: string): AnyNode { + const gitBase = new URL("https://git.pleshevski.ru"); + + return Link(name, { + target: "_blank", + href: new URL(repo, gitBase).toString(), + rel: "external nofollow noopener noreferrer", + }); +} + +export function Link(text: string, attrs: Attrs | Attrs[]): AnyNode { + return E("a", attrs, text); +} diff --git a/views/uikit/typo.ts b/views/uikit/typo.ts new file mode 100644 index 0000000..5f95691 --- /dev/null +++ b/views/uikit/typo.ts @@ -0,0 +1,6 @@ +import { classNames } from "ren/attrs.ts"; +import { E, Elem } from "ren/node.ts"; + +export function H3(text: string): Elem { + return E("h3", classNames("font-h3"), text); +}