├── api ├── __init__.py ├── models.py ├── requirements.txt ├── routes.py ├── test_app.py ├── config.py └── main.py ├── .husky ├── .gitignore └── pre-commit ├── .prettierignore ├── src ├── __tests__ │ ├── index.html │ ├── index.js │ ├── header │ │ ├── EmbedCode.spec.js │ │ ├── Download.spec.js │ │ ├── Commit.spec.js │ │ ├── Share.spec.js │ │ ├── Run.spec.js │ │ └── Header.spec.js │ ├── test.js │ └── panes │ │ ├── PaneLeft.spec.js │ │ ├── PaneRight.spec.js │ │ └── PaneSwitch.spec.js ├── main.js ├── App.vue ├── header │ ├── Commit.vue │ ├── Share.vue │ ├── Header.vue │ ├── Download.vue │ ├── Run.vue │ └── EmbedCode.vue ├── panes │ ├── PaneRight.vue │ ├── PaneSwitch.vue │ ├── PaneLeft.vue │ └── PaneSplit.vue ├── codemirror │ ├── CodeMirror.vue │ ├── python.js │ ├── theme.js │ └── codemirror.js ├── assets │ └── logo.svg └── store.js ├── app.json ├── .gitignore ├── heroku.yml ├── .github ├── renovate.json ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── bug_report.md │ └── feature_request.md ├── pull_request_template.md ├── workflows │ ├── release.yml │ └── ci.yml └── contributing.md ├── public └── _headers ├── netlify.toml ├── scripts ├── install_deps.sh ├── run_code_style.sh ├── gen_pycompletions.py └── release.js ├── Dockerfile ├── windi.config.js ├── LICENSE ├── vite.config.js ├── package.json ├── index.html ├── CHANGELOG.md ├── README.md └── pnpm-lock.yaml /api/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist 2 | pnpm-lock.yaml 3 | -------------------------------------------------------------------------------- /src/__tests__/index.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/__tests__/index.js: -------------------------------------------------------------------------------- 1 | const modules = import.meta.globEager('./**/*.spec.js') 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | pnpm lint-staged 5 | -------------------------------------------------------------------------------- /api/models.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | 4 | class InputCode(BaseModel): 5 | source: str 6 | -------------------------------------------------------------------------------- /api/requirements.txt: -------------------------------------------------------------------------------- 1 | uvicorn[standard]==0.17.6 2 | pydantic==1.9.1 3 | fastapi==0.78.0 4 | asyncpg==0.25.0 5 | gunicorn==20.1.0 6 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "buildpacks": [ 3 | { 4 | "url": "heroku/python" 5 | } 6 | ], 7 | "stack": "container" 8 | } 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | .vscode 7 | *.log 8 | __pycache__ 9 | **/python.json 10 | -------------------------------------------------------------------------------- /heroku.yml: -------------------------------------------------------------------------------- 1 | build: 2 | docker: 3 | web: Dockerfile 4 | run: 5 | web: gunicorn -w 4 -k uvicorn.workers.UvicornWorker api.main:app 6 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import 'virtual:windi.css' 4 | 5 | createApp(App).mount('#app') 6 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["config:base", "schedule:weekly", "group:allNonMajor"], 3 | "labels": ["dependencies"], 4 | "pin": false, 5 | "rangeStrategy": "bump" 6 | } 7 | -------------------------------------------------------------------------------- /public/_headers: -------------------------------------------------------------------------------- 1 | /assets/* 2 | cache-control: max-age=31536000 3 | cache-control: immutable 4 | 5 | /* 6 | X-XSS-Protection: 1; mode=block 7 | Referrer-Policy: no-referrer 8 | X-Content-Type-Options: nosniff 9 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build.environment] 2 | NODE_VERSION = "14" 3 | PYTHON_VERSION = "3.7" 4 | 5 | [build] 6 | publish = "dist" 7 | command = "npx pnpm i --frozen-lockfile --store=node_modules/.pnpm-store && npx pnpm run build" 8 | -------------------------------------------------------------------------------- /scripts/install_deps.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | set -xeu 4 | 5 | pip install -r ./api/requirements.txt --no-cache-dir 6 | 7 | EXTRA=./api/requirements-extra.txt 8 | 9 | if [ -e $EXTRA ]; then 10 | pip install -r $EXTRA --no-cache-dir 11 | fi 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Questions & Discussions 4 | url: https://github.com/toyai/python-playground/discussions 5 | about: 6 | Use GitHub discussions for message-board style questions and discussions. 7 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.10.4-slim-buster 2 | 3 | WORKDIR /workspace 4 | 5 | COPY ./ /workspace/ 6 | 7 | RUN apt-get update && \ 8 | apt-get upgrade -y && \ 9 | apt-get autoremove -y && \ 10 | apt-get clean && \ 11 | python -m pip install -U pip wheel setuptools --no-cache-dir && \ 12 | sh ./scripts/install_deps.sh 13 | 14 | CMD [ "gunicorn", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "api.main:app" ] 15 | -------------------------------------------------------------------------------- /src/header/Commit.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 15 | v{{ version }}@{{ currentCommit }} 16 | 17 | 18 | -------------------------------------------------------------------------------- /scripts/run_code_style.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | set -xeu 4 | 5 | if [ $1 = "lint" ]; then 6 | flake8 . --max-line-length 80 7 | isort . --check --profile black 8 | black . -l 80 --check 9 | elif [ $1 = "fmt" ]; then 10 | isort . --profile black 11 | black . -l 80 12 | elif [ $1 = "install" ]; then 13 | pip install \ 14 | pytest \ 15 | requests \ 16 | black \ 17 | isort \ 18 | flake8 \ 19 | flake8-bugbear \ 20 | flake8-comprehensions \ 21 | flake8-executable 22 | fi 23 | -------------------------------------------------------------------------------- /src/__tests__/header/EmbedCode.spec.js: -------------------------------------------------------------------------------- 1 | import { mount } from '@vue/test-utils' 2 | import EmbedCode from '../../header/EmbedCode.vue' 3 | import { test } from 'uvu' 4 | import * as assert from 'uvu/assert' 5 | 6 | test('EmbedCode button', () => { 7 | const wrapper = mount(EmbedCode) 8 | 9 | const embed = wrapper.get('[data-test="embedText"]') 10 | 11 | assert.ok(embed.exists(), 'embed text should exist.') 12 | assert.ok(embed.isVisible(), 'embed text should be visible.') 13 | }) 14 | 15 | test.run() 16 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ### Description 4 | 5 | fix # 6 | 7 | 8 | 9 | ### Additional context 10 | 11 | 12 | 13 | --- 14 | 15 | ### What is the purpose of this pull request? 16 | 17 | - [ ] Bug fix 18 | - [ ] New feature 19 | - [ ] Other 20 | -------------------------------------------------------------------------------- /src/__tests__/header/Download.spec.js: -------------------------------------------------------------------------------- 1 | import { mount } from '@vue/test-utils' 2 | import Download from '../../header/Download.vue' 3 | import { test } from 'uvu' 4 | import * as assert from 'uvu/assert' 5 | 6 | test('download button', () => { 7 | const wrapper = mount(Download) 8 | 9 | const download = wrapper.get('[data-test="downloadText"]') 10 | 11 | assert.ok(download.exists(), 'Download text should exist.') 12 | assert.ok(download.isVisible(), 'Download text should be visible.') 13 | }) 14 | 15 | test.run() 16 | -------------------------------------------------------------------------------- /src/__tests__/header/Commit.spec.js: -------------------------------------------------------------------------------- 1 | import { mount } from '@vue/test-utils' 2 | import { version } from '../../../package.json' 3 | import Commit from '../../header/Commit.vue' 4 | import { test } from 'uvu' 5 | import * as assert from 'uvu/assert' 6 | 7 | test('renders a commit', () => { 8 | const wrapper = mount(Commit) 9 | 10 | const commit = wrapper.get('[data-test="commit"]') 11 | 12 | assert.is( 13 | commit.text(), 14 | `v${version}@${__COMMIT__.slice(0, 7)}`, 15 | 'commit should match.', 16 | ) 17 | }) 18 | 19 | test.run() 20 | -------------------------------------------------------------------------------- /src/__tests__/header/Share.spec.js: -------------------------------------------------------------------------------- 1 | import { mount } from '@vue/test-utils' 2 | import Share from '../../header/Share.vue' 3 | import { test } from 'uvu' 4 | import * as assert from 'uvu/assert' 5 | 6 | test('copy shareable URL', async () => { 7 | const wrapper = mount(Share) 8 | 9 | await wrapper.find('button').trigger('click') 10 | const share = wrapper.get('[data-test="shareText"]') 11 | 12 | assert.ok(share.exists(), 'Share text should exist.') 13 | assert.ok(share.isVisible(), 'Share text should be visible.') 14 | }) 15 | 16 | test.run() 17 | -------------------------------------------------------------------------------- /src/__tests__/header/Run.spec.js: -------------------------------------------------------------------------------- 1 | import { mount } from '@vue/test-utils' 2 | import Run from '../../header/Run.vue' 3 | import { test } from 'uvu' 4 | import * as assert from 'uvu/assert' 5 | 6 | test('run code button', async () => { 7 | const wrapper = mount(Run) 8 | 9 | const status = wrapper.get('[data-test="runStatus"]') 10 | 11 | assert.is(status.text(), 'Run', 'Button should include Run') 12 | 13 | await wrapper.find('button').trigger('click') 14 | assert.is(status.text(), 'Running', 'Button should include Running') 15 | }) 16 | 17 | test.run() 18 | -------------------------------------------------------------------------------- /api/routes.py: -------------------------------------------------------------------------------- 1 | import io 2 | import traceback 3 | from contextlib import redirect_stdout 4 | 5 | from fastapi import APIRouter, Body 6 | 7 | from api.models import InputCode 8 | 9 | route = APIRouter() 10 | input = Body(...) 11 | 12 | 13 | @route.post("/") 14 | def index(input: InputCode = input): 15 | with io.StringIO() as f: 16 | with redirect_stdout(f): 17 | try: 18 | exec(input.source) 19 | except Exception: 20 | return traceback.format_exc() 21 | result = f.getvalue() 22 | return result 23 | -------------------------------------------------------------------------------- /windi.config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import { defineConfig } from 'windicss/helpers' 3 | 4 | export default defineConfig({ 5 | theme: { 6 | extend: { 7 | cursor: { 8 | 'ew-resize': 'ew-resize', 9 | }, 10 | }, 11 | }, 12 | alias: { 13 | 'header-btn': 'mx-1 inline-flex items-center content-center', 14 | 'file-tab-btn': 15 | 'cursor-pointer px-4 py-1 w-max h-32px border-b-3 border-solid border-b-blue-500 font-mono text-sm', 16 | 'pane-switch-btn': 17 | 'border rounded mx-1 py-1 px-4 hover:(bg-blue-600 text-white)', 18 | }, 19 | }) 20 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 'Bug Report' 3 | about: 'Submit a report to help us improve' 4 | title: '' 5 | labels: 'bug: pending triage' 6 | --- 7 | 8 | ### Reproduction link 9 | 10 | 11 | 12 | ### Steps to reproduce 13 | 14 | 15 | 16 | ### What is expected? 17 | 18 | 19 | 20 | ### What is actually happening? 21 | 22 | 23 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: release 2 | on: 3 | push: 4 | tags: 5 | - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 6 | 7 | jobs: 8 | release: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout code 12 | uses: actions/checkout@v3 13 | 14 | - uses: yyx990803/release-tag@master 15 | env: 16 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 17 | with: 18 | tag_name: ${{ github.ref }} 19 | body: | 20 | Please refer to [CHANGELOG.md](https://github.com/toyai/python-playground/blob/main/CHANGELOG.md) for details. 21 | -------------------------------------------------------------------------------- /src/panes/PaneRight.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | Result 8 | 9 | Click ▶ Run to see the result: 12 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 'New Feature Request' 3 | about: 'Propose a new feature to be added' 4 | title: '' 5 | labels: 'enhancement: pending triage' 6 | --- 7 | 8 | ### Clear and concise description of the problem 9 | 10 | 11 | 12 | ### Suggested solution 13 | 14 | 15 | 16 | ### Alternative 17 | 18 | 19 | 20 | ### Additional context 21 | 22 | 23 | -------------------------------------------------------------------------------- /scripts/gen_pycompletions.py: -------------------------------------------------------------------------------- 1 | import builtins 2 | import inspect 3 | import json 4 | import keyword 5 | 6 | PYTHON_JSON_FILE = "./src/codemirror/python.json" 7 | 8 | 9 | def get_builtins(check): 10 | names = {} 11 | for k, v in sorted(builtins.__dict__.items()): 12 | if check(v) and not k.startswith("_"): 13 | names[k] = inspect.getdoc(v) 14 | 15 | return names 16 | 17 | 18 | with open(PYTHON_JSON_FILE, "w") as f: 19 | py_builtins = { 20 | "keywords": sorted(keyword.kwlist), 21 | "builtInFunctions": get_builtins(inspect.isbuiltin), 22 | "builtInClasses": get_builtins(inspect.isclass), 23 | } 24 | json.dump(py_builtins, f) 25 | -------------------------------------------------------------------------------- /src/__tests__/test.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import { chromium } from 'playwright-chromium' 3 | import { createServer } from 'vite' 4 | 5 | const PORT = 3001 6 | 7 | async function main() { 8 | const server = await createServer({ 9 | root: './src/__tests__/', 10 | configFile: './vite.config.js', 11 | server: { 12 | port: PORT, 13 | }, 14 | }) 15 | 16 | await server.listen() 17 | 18 | const browser = await chromium.launch() 19 | const page = await browser.newPage() 20 | const address = `http://localhost:${PORT}` 21 | 22 | page.on('console', (msg) => console.log(msg.text())) 23 | await page.goto(address, { waitUntil: 'domcontentloaded' }) 24 | 25 | await browser.close() 26 | await server.close() 27 | } 28 | 29 | main() 30 | -------------------------------------------------------------------------------- /api/test_app.py: -------------------------------------------------------------------------------- 1 | from fastapi.testclient import TestClient 2 | 3 | from .main import app 4 | 5 | client = TestClient(app) 6 | 7 | 8 | def test_index_404(): 9 | response = client.get("/") 10 | assert response.status_code == 404 11 | assert response.json() == {"detail": "Not Found"} 12 | 13 | 14 | def test_no_access_to_api(): 15 | response = client.get("/api/playground/") 16 | assert response.status_code == 405 17 | assert response.json() == {"detail": "Method Not Allowed"} 18 | 19 | 20 | def test_post_code(): 21 | response = client.post( 22 | "/api/playground/", 23 | headers={"Content-Type": "application/json"}, 24 | json={"source": "print('Hello World!')"}, 25 | ) 26 | assert response.status_code == 200 27 | assert response.text == "Hello World!\n" 28 | -------------------------------------------------------------------------------- /src/panes/PaneSwitch.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | 18 | 19 | 25 | {{ btn }} 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/__tests__/panes/PaneLeft.spec.js: -------------------------------------------------------------------------------- 1 | import { mount } from '@vue/test-utils' 2 | import { test } from 'uvu' 3 | import * as assert from 'uvu/assert' 4 | import PaneLeft from '../../panes/PaneLeft.vue' 5 | 6 | test('PaneLeft', () => { 7 | const wrapper = mount(PaneLeft) 8 | 9 | const mainPy = wrapper.get('[data-test="mainPy"]') 10 | const loading = wrapper.get('[data-test="loadingStatus"]') 11 | 12 | assert.is(mainPy.text(), 'main.py', 'mainPy text should match.') 13 | assert.ok(mainPy.exists(), 'mainPy code should exist') 14 | assert.ok(mainPy.isVisible(), 'mainPy text should be visible.') 15 | assert.is(loading.text(), 'Loading Code...', 'loading text should match.') 16 | assert.ok(loading.exists(), 'loading text should exist') 17 | assert.ok(loading.isVisible(), 'loading text should be visible.') 18 | }) 19 | 20 | test.run() 21 | -------------------------------------------------------------------------------- /src/panes/PaneLeft.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | main.py 21 | 22 | 23 | 24 | Loading Code... 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/__tests__/panes/PaneRight.spec.js: -------------------------------------------------------------------------------- 1 | import { mount } from '@vue/test-utils' 2 | import { test } from 'uvu' 3 | import * as assert from 'uvu/assert' 4 | import PaneRight from '../../panes/PaneRight.vue' 5 | 6 | test('PaneRight', () => { 7 | const wrapper = mount(PaneRight) 8 | 9 | const resultBtn = wrapper.get('[data-test="resultBtn"]') 10 | const result = wrapper.get('[data-test="result"]') 11 | 12 | assert.is(resultBtn.text(), 'Result', 'resultBtn text should match.') 13 | assert.ok(resultBtn.exists(), 'resultBtn should exist') 14 | assert.ok(resultBtn.isVisible(), 'resultBtn should be visible.') 15 | assert.is( 16 | result.text(), 17 | 'Click ▶ Run to see the result:', 18 | 'result should match with the label.', 19 | ) 20 | assert.ok(result.exists(), 'result should exist') 21 | assert.ok(result.isVisible(), 'result should be visible.') 22 | }) 23 | 24 | test.run() 25 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | - main 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v3 14 | - uses: actions/setup-python@v4 15 | with: 16 | python-version: 3.8 17 | 18 | - uses: actions/setup-node@v3 19 | with: 20 | node-version: 16 21 | 22 | - uses: actions/cache@v3 23 | with: 24 | path: | 25 | ~/.pnpm-store 26 | ~/.cache/pip 27 | key: pnpm-n-pip-cache-${{ hashFiles('pnpm-lock.yaml') }} 28 | restore-keys: | 29 | pnpm-n-pip-cache-${{ hashFiles('pnpm-lock.yaml') }} 30 | pnpm-n-pip-cache- 31 | 32 | - name: Setup 33 | run: | 34 | pip install wheel setuptools pip -U 35 | npm i -g pnpm 36 | pnpm setup:ci 37 | 38 | - run: pnpm lint 39 | - run: python scripts/gen_pycompletions.py 40 | - run: pnpm test 41 | -------------------------------------------------------------------------------- /src/__tests__/header/Header.spec.js: -------------------------------------------------------------------------------- 1 | import { mount } from '@vue/test-utils' 2 | import Header from '../../header/Header.vue' 3 | import { test } from 'uvu' 4 | import * as assert from 'uvu/assert' 5 | 6 | test('Header bar', () => { 7 | const wrapper = mount(Header) 8 | 9 | const logo = wrapper.get('[data-test="logo"]') 10 | const playground = wrapper.get('[data-test="playgroundText"]') 11 | const pyVer = wrapper.get('[data-test="pyVer"]') 12 | 13 | assert.is(logo.attributes('alt'), 'Python Logo', 'Alt text should match.') 14 | assert.ok(playground.exists(), 'playground text should exist.') 15 | assert.ok(playground.isVisible(), 'playground text should be invisible.') 16 | assert.is( 17 | playground.text(), 18 | 'Python Playground', 19 | 'playground title should match.', 20 | ) 21 | assert.ok(pyVer.exists(), 'pyVer text should exist.') 22 | assert.ok(pyVer.isVisible(), 'pyVer text should be invisible.') 23 | assert.match(pyVer.text(), /\(v[\d\.]+\)/, 'pyVer should match.') 24 | }) 25 | 26 | test.run() 27 | -------------------------------------------------------------------------------- /api/config.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | from functools import lru_cache 4 | from typing import List 5 | 6 | from pydantic import BaseSettings 7 | 8 | PR_NUMBER = os.getenv("HEROKU_PR_NUMBER") 9 | PROD_SITE_NAME = os.getenv("PG_FRONTEND_SITE_NAME") 10 | CUSTOM_DOMAIN_URL = os.getenv("CUSTOM_DOMAIN_URL") 11 | 12 | with open("package.json", "r") as pkg: 13 | VERSION = json.load(pkg)["version"] 14 | 15 | 16 | class Settings(BaseSettings): 17 | # Version 18 | VERSION: str = VERSION 19 | 20 | # App 21 | PROJECT_NAME: str = "Python Playground" 22 | DEBUG: bool = False 23 | API_PREFIX: str = "/api/playground" 24 | ALLOWED_HOSTS: List[str] = [ 25 | f"https://{PROD_SITE_NAME}.netlify.app", 26 | "http://localhost:3000", 27 | ] 28 | if PR_NUMBER: 29 | ALLOWED_HOSTS.append( 30 | f"https://deploy-preview-{PR_NUMBER}--{PROD_SITE_NAME}.netlify.app" 31 | ) 32 | if CUSTOM_DOMAIN_URL: 33 | ALLOWED_HOSTS.append(CUSTOM_DOMAIN_URL) 34 | 35 | 36 | @lru_cache() 37 | def get_settings(): 38 | return Settings() 39 | 40 | 41 | settings = get_settings() 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021-present Jeff Yang & Davian Yang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/codemirror/CodeMirror.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/header/Share.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 25 | 29 | 30 | Share 31 | 32 | 33 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import { defineConfig } from 'vite' 3 | import vue from '@vitejs/plugin-vue' 4 | import WindiCSS from 'vite-plugin-windicss' 5 | import { execFileSync } from 'child_process' 6 | 7 | const pyVer = execFileSync('python', ['-V']).toString().trim().split(' ')[1] 8 | const commit = execFileSync('git', ['rev-parse', 'HEAD']).toString().trim() 9 | const idArr = process.env.REVIEW_ID?.split('-') 10 | const prNumber = idArr?.[idArr.length - 1] 11 | 12 | const prSiteName = process.env.PG_BACKEND_SITE_NAME_PR 13 | const prodSiteName = process.env.PG_BACKEND_SITE_NAME 14 | 15 | // PULL_REQUEST env var is string `true` or `false` 16 | const apiURL = 17 | process.env.PULL_REQUEST === 'true' 18 | ? `https://${prSiteName}-pr-${prNumber}.herokuapp.com` 19 | : process.env.NODE_ENV === 'production' 20 | ? `https://${prodSiteName}.herokuapp.com` 21 | : 'http://127.0.0.1:8000' 22 | 23 | console.log(apiURL) 24 | 25 | // https://vitejs.dev/config/ 26 | export default defineConfig({ 27 | plugins: [vue(), WindiCSS()], 28 | define: { 29 | __API_URL__: JSON.stringify(apiURL), 30 | __PY_VER__: JSON.stringify(pyVer), 31 | __COMMIT__: JSON.stringify(commit), 32 | }, 33 | }) 34 | -------------------------------------------------------------------------------- /src/header/Header.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 22 | Python Playground 27 | (v{{ pyVer }}) 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/header/Download.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | 21 | 32 | 36 | 40 | 41 | Download 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/__tests__/panes/PaneSwitch.spec.js: -------------------------------------------------------------------------------- 1 | import { mount } from '@vue/test-utils' 2 | import { test } from 'uvu' 3 | import * as assert from 'uvu/assert' 4 | import PaneSwitch from '../../panes/PaneSwitch.vue' 5 | 6 | test('PaneSwitch', async () => { 7 | const wrapper = mount(PaneSwitch) 8 | 9 | // get buttons 10 | const switchBtnCode = wrapper.get('[data-test="switchBtnCode"]') 11 | const switchBtnResult = wrapper.get('[data-test="switchBtnResult"]') 12 | 13 | // test buttons' innerText 14 | assert.is(switchBtnCode.text(), 'Code') 15 | assert.is(switchBtnResult.text(), 'Result') 16 | 17 | // click Code button 18 | await switchBtnCode.trigger('click') 19 | 20 | // test Code is emitted 21 | assert.is( 22 | wrapper.emitted('btnChange').length, 23 | 1, 24 | 'PaneSwitch should emit one value', 25 | ) 26 | assert.is( 27 | wrapper.emitted('btnChange')[0][0], 28 | 'Code', 29 | 'PaneSwitch should emit Code', 30 | ) 31 | 32 | // click Result button 33 | await switchBtnResult.trigger('click') 34 | 35 | // test Result is emitted 36 | // Code + Result, so 2 37 | assert.is( 38 | wrapper.emitted('btnChange').length, 39 | 2, 40 | 'PaneSwitch should have two values', 41 | ) 42 | assert.is( 43 | wrapper.emitted('btnChange')[1][0], 44 | 'Result', 45 | 'PaneSwitch should emit Result', 46 | ) 47 | }) 48 | 49 | test.run() 50 | -------------------------------------------------------------------------------- /src/header/Run.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 26 | 31 | 42 | 46 | 47 | {{ status }} 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /api/main.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import os 3 | 4 | from fastapi import FastAPI 5 | from starlette.middleware.cors import CORSMiddleware 6 | from starlette.responses import PlainTextResponse 7 | 8 | from api.config import Settings, settings 9 | from api.routes import route as api_router 10 | 11 | URL = "http://127.0.0.1:8000" 12 | cyan = "\x1b[36m" 13 | end = "\x1b[39m" 14 | 15 | logger = logging.getLogger("uvicorn") 16 | 17 | 18 | def show_api_docs(): 19 | logger.info(f"Swagger API docs: {cyan}{URL}/docs{end}") 20 | logger.info(f"Redoc API docs: {cyan}{URL}/redoc{end}") 21 | 22 | 23 | SHOW_API_DOCS = os.getenv("SHOW_API_DOCS") 24 | 25 | 26 | def get_application(settings: Settings = settings) -> FastAPI: 27 | application = FastAPI( 28 | title=settings.PROJECT_NAME, 29 | debug=settings.DEBUG, 30 | version=settings.VERSION, 31 | default_response_class=PlainTextResponse, 32 | on_startup=[show_api_docs], 33 | openapi_url="/openapi.json" if SHOW_API_DOCS else None, 34 | docs_url="/docs" if SHOW_API_DOCS else None, 35 | redoc_url="/redoc" if SHOW_API_DOCS else None, 36 | ) 37 | 38 | application.add_middleware( 39 | CORSMiddleware, 40 | allow_origins=settings.ALLOWED_HOSTS or ["*"], 41 | allow_credentials=True, 42 | allow_methods=["*"], 43 | allow_headers=["*"], 44 | ) 45 | 46 | application.include_router(api_router, prefix=settings.API_PREFIX) 47 | 48 | return application 49 | 50 | 51 | app = get_application() 52 | -------------------------------------------------------------------------------- /src/codemirror/python.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import { 3 | snippetCompletion, 4 | completeFromList, 5 | ifNotIn, 6 | } from '@codemirror/autocomplete' 7 | import { keywords, builtInFunctions, builtInClasses } from './python.json' 8 | 9 | /** 10 | * 11 | * @param {(string[] | Object.)} builtins 12 | * @param {string} type 13 | * @param {number} boost 14 | * @param {boolean} info 15 | * @returns {import('@codemirror/autocomplete').CompletionSource} completions 16 | */ 17 | function makeCompletions(builtins, type, boost, info) { 18 | /** 19 | * 20 | * @param {string | number} k 21 | * @returns {string} label 22 | */ 23 | const getLabel = (k) => (Array.isArray(builtins) ? builtins[k] : k) 24 | const completions = [] 25 | for (const k in builtins) { 26 | completions.push( 27 | snippetCompletion(getLabel(k), { 28 | label: getLabel(k), 29 | type: type, 30 | info: info ? builtins[k] : '', 31 | boost: boost, 32 | }), 33 | ) 34 | } 35 | return ifNotIn(['Comment', 'String'], completeFromList(completions)) 36 | } 37 | 38 | export const completionKeywords = makeCompletions( 39 | keywords, 40 | 'keyword', 41 | 99, 42 | false, 43 | ) 44 | export const completionBuiltInFunctions = makeCompletions( 45 | builtInFunctions, 46 | 'function', 47 | 98, 48 | true, 49 | ) 50 | export const completionBuiltInClasses = makeCompletions( 51 | builtInClasses, 52 | 'class', 53 | 97, 54 | true, 55 | ) 56 | export default [ 57 | completionKeywords, 58 | completionBuiltInFunctions, 59 | completionBuiltInClasses, 60 | ] 61 | -------------------------------------------------------------------------------- /src/header/EmbedCode.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 33 | 39 | 50 | 54 | 58 | 62 | 63 | Embed Code 64 | 65 | 66 | -------------------------------------------------------------------------------- /src/panes/PaneSplit.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 34 | 43 | 51 | 52 | 56 | 57 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /src/codemirror/theme.js: -------------------------------------------------------------------------------- 1 | import { HighlightStyle, tags as t } from '@codemirror/highlight' 2 | import { EditorView } from '@codemirror/view' 3 | 4 | const codeFont = 'Monaco,Menlo,Consolas,"Liberation Mono",monospace;' 5 | 6 | export const Theme = EditorView.theme({ 7 | '&': { 8 | fontSize: '0.875rem', 9 | height: 'calc(100% - 50px)', 10 | }, 11 | '&.cm-focused': { 12 | outline: 'none', 13 | }, 14 | '&.cm-focused .cm-cursor': { 15 | borderLeftWidth: '2px', 16 | }, 17 | '.cm-scroller': { 18 | fontFamily: codeFont, 19 | }, 20 | '.cm-matchingBracket, .cm-nonmatchingBracket': { 21 | backgroundColor: 'rgba(136, 136, 136, 0.3)', 22 | }, 23 | '.cm-completionIcon': { 24 | paddingRight: '1rem', 25 | }, 26 | '.cm-tooltip.cm-tooltip-autocomplete > ul': { 27 | fontFamily: codeFont, 28 | }, 29 | }) 30 | 31 | export const ThemeHighlight = HighlightStyle.define([ 32 | { 33 | tag: [ 34 | t.modifier, 35 | t.controlKeyword, 36 | t.operatorKeyword, 37 | t.definitionKeyword, 38 | t.keyword, 39 | ], 40 | class: 'text-red-600', 41 | }, 42 | { 43 | tag: [t.bool, t.null], 44 | class: 'text-cyan-600', 45 | }, 46 | { 47 | tag: [t.variableName], 48 | class: 'text-blue-gray-600', 49 | }, 50 | { 51 | tag: [ 52 | t.function(t.definition(t.variableName)), 53 | t.self, 54 | t.function(t.variableName), 55 | t.className, 56 | t.definition(t.className), 57 | ], 58 | class: 'text-purple-600', 59 | }, 60 | { 61 | tag: [t.propertyName, t.function(t.propertyName)], 62 | class: 'text-blue-600', 63 | }, 64 | { 65 | tag: [t.lineComment], 66 | class: 'text-gray-400 italic', 67 | }, 68 | { 69 | tag: [t.number], 70 | class: 'text-orange-600', 71 | }, 72 | { 73 | tag: [t.string], 74 | class: 'text-emerald-600', 75 | }, 76 | { 77 | tag: [t.regexp, t.escape], 78 | class: 'text-fuchsia-600', 79 | }, 80 | { 81 | tag: [ 82 | t.updateOperator, 83 | t.arithmeticOperator, 84 | t.bitwiseOperator, 85 | t.compareOperator, 86 | t.punctuation, 87 | t.meta, 88 | ], 89 | class: 'text-pink-600', 90 | }, 91 | { 92 | tag: [t.paren, t.squareBracket, t.brace, t.derefOperator, t.separator], 93 | class: 'text-blue-gray-600', 94 | }, 95 | ]) 96 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "python-playground", 3 | "version": "0.1.0", 4 | "description": "Interactive Playground for Python", 5 | "author": "Jeff Yang", 6 | "license": "MIT", 7 | "type": "module", 8 | "scripts": { 9 | "build": "python scripts/gen_pycompletions.py && vite build", 10 | "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", 11 | "dev": "vite", 12 | "dev:api": "SHOW_API_DOCS=1 uvicorn api.main:app --reload", 13 | "fmt": "prettier --write . && sh scripts/run_code_style.sh fmt", 14 | "lint": "prettier --check . && sh scripts/run_code_style.sh lint", 15 | "prepare": "husky install", 16 | "release": "node scripts/release.js", 17 | "serve": "vite preview", 18 | "setup:dev": "pnpm i && pip install -r api/requirements.txt && sh scripts/run_code_style.sh install", 19 | "setup:ci": "pnpm i --frozen-lockfile && pip install -r api/requirements.txt && sh scripts/run_code_style.sh install", 20 | "test": "pnpm run test:front && pnpm run test:back", 21 | "test:front": "node src/__tests__/test.js", 22 | "test:back": "pytest api/test_*.py --color yes" 23 | }, 24 | "devDependencies": { 25 | "@codemirror/autocomplete": "^0.20.1", 26 | "@codemirror/closebrackets": "^0.19.2", 27 | "@codemirror/commands": "^0.20.0", 28 | "@codemirror/comment": "^0.19.1", 29 | "@codemirror/fold": "^0.19.4", 30 | "@codemirror/gutter": "^0.19.9", 31 | "@codemirror/highlight": "^0.19.8", 32 | "@codemirror/history": "^0.19.2", 33 | "@codemirror/lang-python": "^0.20.0", 34 | "@codemirror/language": "^0.20.2", 35 | "@codemirror/matchbrackets": "^0.19.4", 36 | "@codemirror/search": "^0.20.1", 37 | "@codemirror/state": "^0.20.0", 38 | "@codemirror/view": "^0.20.6", 39 | "@vitejs/plugin-vue": "^2.3.3", 40 | "@vue/test-utils": "^2.0.0", 41 | "conventional-changelog-cli": "^2.2.2", 42 | "husky": "^8.0.1", 43 | "lint-staged": "^12.4.1", 44 | "playwright-chromium": "^1.22.2", 45 | "prettier": "^2.6.2", 46 | "prompts": "^2.4.2", 47 | "semver": "^7.3.7", 48 | "uvu": "^0.5.3", 49 | "vite": "^2.9.9", 50 | "vite-plugin-windicss": "^1.8.4", 51 | "vue": "^3.2.36", 52 | "windicss": "^3.5.4" 53 | }, 54 | "keywords": [ 55 | "python", 56 | "playground", 57 | "repl" 58 | ], 59 | "prettier": "@ydcjeff/prettier-config", 60 | "lint-staged": { 61 | "*": [ 62 | "prettier --write --ignore-unknown" 63 | ], 64 | "*.py": [ 65 | "isort --profile black", 66 | "black -l 80", 67 | "flake8 --max-line-length 80" 68 | ] 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/codemirror/codemirror.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import { 3 | keymap, 4 | highlightSpecialChars, 5 | drawSelection, 6 | highlightActiveLine, 7 | EditorView, 8 | } from '@codemirror/view' 9 | import { EditorState, Transaction } from '@codemirror/state' 10 | import { history, historyKeymap } from '@codemirror/history' 11 | import { codeFolding, foldGutter, foldKeymap } from '@codemirror/fold' 12 | import { indentOnInput, indentUnit } from '@codemirror/language' 13 | import { lineNumbers, highlightActiveLineGutter } from '@codemirror/gutter' 14 | import { defaultKeymap, indentLess, indentMore } from '@codemirror/commands' 15 | import { bracketMatching } from '@codemirror/matchbrackets' 16 | import { closeBrackets, closeBracketsKeymap } from '@codemirror/closebrackets' 17 | import { searchKeymap, highlightSelectionMatches } from '@codemirror/search' 18 | import { autocompletion, completionKeymap } from '@codemirror/autocomplete' 19 | import { commentKeymap } from '@codemirror/comment' 20 | import { defaultHighlightStyle } from '@codemirror/highlight' 21 | import { python } from '@codemirror/lang-python' 22 | import pythonBuiltIns from './python.js' 23 | import { Theme, ThemeHighlight } from './theme.js' 24 | 25 | const fourSpaces = ' ' 26 | 27 | // copied from `insertTab`, changed \t with 4 spaces 28 | const insertFourSpaces = ({ state, dispatch }) => { 29 | if (state.selection.ranges.some((r) => !r.empty)) 30 | return indentMore({ state, dispatch }) 31 | dispatch( 32 | state.update(state.replaceSelection(fourSpaces), { 33 | scrollIntoView: true, 34 | annotations: Transaction.userEvent.of('input'), 35 | }), 36 | ) 37 | return true 38 | } 39 | 40 | const tabBinding = { key: 'Tab', run: insertFourSpaces, shift: indentLess } 41 | /** 42 | * @type {import('@codemirror/state').Extension} 43 | */ 44 | export const extensions = [ 45 | // sorted by 46 | // https://github.com/codemirror/basic-setup/blob/main/src/basic-setup.ts 47 | lineNumbers(), 48 | highlightActiveLineGutter(), 49 | highlightSpecialChars(), 50 | history(), 51 | codeFolding(), 52 | foldGutter(), 53 | drawSelection(), 54 | EditorView.lineWrapping, 55 | EditorState.allowMultipleSelections.of(true), 56 | indentOnInput(), 57 | Theme, 58 | ThemeHighlight, 59 | defaultHighlightStyle.fallback, 60 | bracketMatching(), 61 | closeBrackets(), 62 | autocompletion({ 63 | override: pythonBuiltIns, 64 | }), 65 | highlightActiveLine(), 66 | highlightSelectionMatches(), 67 | python(), 68 | indentUnit.of(fourSpaces), 69 | keymap.of([ 70 | ...closeBracketsKeymap, 71 | ...defaultKeymap, 72 | ...searchKeymap, 73 | ...historyKeymap, 74 | ...foldKeymap, 75 | ...commentKeymap, 76 | ...completionKeymap, 77 | tabBinding, 78 | ]), 79 | ] 80 | -------------------------------------------------------------------------------- /src/store.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import { reactive, watchEffect } from 'vue' 3 | 4 | const urlHash = location.hash.slice(1) 5 | const matchedVcsURL = location.search.match( 6 | /(?:github|gitlab)\.com\/(?:[\w\.\-]+\/){2,3}(?=blob).+/gi, 7 | ) 8 | export const store = reactive({ 9 | files: {}, 10 | result: '', 11 | }) 12 | 13 | // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa#unicode_strings 14 | // convert a Unicode string to a string in which 15 | // each 16-bit unit occupies only one byte 16 | /** 17 | * 18 | * @param {string} string 19 | * @returns converted 20 | */ 21 | function toBinary(string) { 22 | const codeUnits = new Uint16Array(string.length) 23 | for (let i = 0; i < codeUnits.length; i++) { 24 | codeUnits[i] = string.charCodeAt(i) 25 | } 26 | return String.fromCharCode(...new Uint8Array(codeUnits.buffer)) 27 | } 28 | 29 | /** 30 | * 31 | * @param {string} binary 32 | * @returns encoded 33 | */ 34 | function fromBinary(binary) { 35 | const bytes = new Uint8Array(binary.length) 36 | for (let i = 0; i < bytes.length; i++) { 37 | bytes[i] = binary.charCodeAt(i) 38 | } 39 | return String.fromCharCode(...new Uint16Array(bytes.buffer)) 40 | } 41 | 42 | /** 43 | * Fetch the raw content file from GitHub and GitLab. 44 | * @returns text 45 | */ 46 | async function fetchFromVCS() { 47 | let rawURL 48 | const vcsURL = matchedVcsURL[0] 49 | 50 | // Public GitHub 51 | if (/^github/gi.test(vcsURL)) { 52 | // replace the url with GitHub raw url 53 | // GitHub raw url is like: 54 | // https://raw.githubusercontent.com/toyai/python-playground/main/README.md 55 | // trim the trailing `/` if needed 56 | rawURL = 57 | 'https://raw.' + 58 | vcsURL 59 | .replace(/^github/, 'githubusercontent') 60 | .replace('/blob', '') 61 | .replace(/\/$/, '') 62 | } 63 | // TODO: Public GitLab 64 | 65 | try { 66 | const res = await fetch(rawURL, { referrerPolicy: 'no-referrer' }) 67 | return await res.text() 68 | } catch (e) { 69 | console.error(e) 70 | } 71 | } 72 | 73 | /** 74 | * Setup the initial code to display. 75 | * This can be the code from hash URL, VCS, or `print('Hello World!')`. 76 | * 77 | * Priority of content: 78 | * 1. Content from urlHash 79 | * 2. Content from VCS 80 | * 3. `print('Hello World!')` 81 | */ 82 | export async function setupCode() { 83 | if (urlHash) { 84 | const savedFiles = JSON.parse(fromBinary(atob(urlHash))) 85 | for (const filename in savedFiles) { 86 | store.files[filename] = savedFiles[filename] 87 | } 88 | } else if (matchedVcsURL) { 89 | store.files['main.py'] = await fetchFromVCS() 90 | } else { 91 | store.files['main.py'] = `print('Hello World!')` 92 | } 93 | } 94 | 95 | watchEffect(() => 96 | history.replaceState( 97 | null, 98 | '', 99 | '#' + btoa(toBinary(JSON.stringify(store.files))), 100 | ), 101 | ) 102 | -------------------------------------------------------------------------------- /.github/contributing.md: -------------------------------------------------------------------------------- 1 | # Python Playground Contributing Guide 2 | 3 | Hi! We're really excited that you are interested in contributing to Python 4 | Playground. Before submitting your contribution, please make sure to take a 5 | moment and read through the following guidelines: 6 | 7 | ## Pull Request Guidelines 8 | 9 | - Checkout a topic branch from the relevant branch, e.g. `main`, and merge back 10 | against that branch. 11 | 12 | - If adding a new feature: 13 | 14 | - Add accompanying test case. 15 | - Provide a convincing reason to add this feature. Ideally, you should open a 16 | suggestion issue first and have it approved before working on it. 17 | 18 | - If fixing bug: 19 | 20 | - Provide a detailed description of the bug in the PR. If the PR is fixing an 21 | issue, add issue number in the PR template. 22 | 23 | - Make sure tests pass! (You can run the tests with `pnpm test`) 24 | 25 | - It's OK to have multiple small commits as you work on the PR - GitHub can 26 | automatically squash them before merging. 27 | 28 | - No need to worry about code style as long as you have installed the dev 29 | dependencies - modified files are automatically formatted with Prettier on 30 | commit (by invoking [Git Hooks](https://git-scm.com/docs/githooks) via 31 | [husky](https://github.com/typicode/husky)). 32 | 33 | ## Development Setup 34 | 35 | You will need: 36 | 37 | - [Node.js v14.x and greater](https://nodejs.org/en/). 38 | - [pnpm v6](https://pnpm.io/installation). 39 | - [Python 3.6 and greater](https://www.python.org/downloads/). 40 | 41 | If you are using VSCode, the below extensions might be useful: 42 | 43 | - [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) 44 | - [WindiCSS IntelliSense](https://marketplace.visualstudio.com/items?itemName=voorjaar.windicss-intellisense) 45 | 46 | Create a python virtual environment: 47 | 48 | ```sh 49 | python3 -m venv ~/.python-playground 50 | source ~/.python-playground/bin/activate 51 | ``` 52 | 53 | After cloning the repo, run: 54 | 55 | ```sh 56 | # install the node and python dependencies of the project 57 | pnpm run setup:dev 58 | ``` 59 | 60 | Before running frontend and backend dev server, you will need a json file for 61 | python builtins: 62 | 63 | ```sh 64 | python scripts/gen_pycompletions.py 65 | ``` 66 | 67 | Now, frontend and backend dev server can be started: 68 | 69 | Run the below command in one terminal: 70 | 71 | ```sh 72 | pnpm run dev # for frontend Vue app 73 | ``` 74 | 75 | After executing the above command, visit http://localhost:3000 and try modifying 76 | the frontend source code. You'll get live update. 77 | 78 | Frontend source code are in `src`. 79 | 80 | Run the below command on another terminal: 81 | 82 | ```sh 83 | pnpm run dev:api # for backend FastAPI app 84 | ``` 85 | 86 | For backend testing, visit http://127.0.0.1:8000/docs for Swagger API docs and 87 | http://127.0.0.1:8000/redoc for Redoc API docs. 88 | 89 | Backend source code are in `api`. 90 | 91 | See more commands in `scripts` section in the [package.json](../package.json). 92 | -------------------------------------------------------------------------------- /scripts/release.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // largely stripped from https://github.com/vuejs/vitepress/blob/master/scripts/release.js 3 | 4 | const fs = require('fs') 5 | const path = require('path') 6 | const semver = require('semver') 7 | const prompts = require('prompts') 8 | const child_process = require('child_process') 9 | 10 | const pkgDir = process.cwd() 11 | const pkgPath = path.resolve(pkgDir, 'package.json') 12 | const pkg = require(pkgPath) 13 | const currentVersion = pkg.version 14 | 15 | const preId = process.argv.slice(2)[0] 16 | 17 | /** 18 | * @type {import('semver').ReleaseType[]} 19 | */ 20 | const versionIncrements = [ 21 | 'patch', 22 | 'minor', 23 | 'major', 24 | 'prepatch', 25 | 'preminor', 26 | 'premajor', 27 | 'prerelease', 28 | ] 29 | 30 | /** 31 | * @param {import('semver').ReleaseType} i 32 | */ 33 | const inc = (i) => semver.inc(currentVersion, i, preId) 34 | 35 | /** 36 | * @param {string} bin 37 | * @param {string[]} args 38 | */ 39 | const run = (bin, args) => child_process.execFileSync(bin, args) 40 | 41 | /** 42 | * @param {string} msg 43 | */ 44 | const step = (msg) => console.log('\x1b[36m%s\x1b[0m', msg) 45 | 46 | async function main() { 47 | /** 48 | * @type {{ release: string }} 49 | */ 50 | const { release: targetVersion } = await prompts({ 51 | type: 'select', 52 | name: 'release', 53 | message: 'Select release type', 54 | choices: versionIncrements.map((i) => { 55 | return { title: `${i} (${inc(i)})`, value: inc(i) } 56 | }), 57 | }) 58 | 59 | if (!semver.valid(targetVersion)) { 60 | throw new Error(`Invalid target version: ${targetVersion}`) 61 | } 62 | 63 | const tag = `v${targetVersion}` 64 | 65 | /** 66 | * @type {{ yes: boolean }} 67 | */ 68 | const { yes } = await prompts({ 69 | type: 'confirm', 70 | name: 'yes', 71 | message: `Releasing ${tag}. Confirm?`, 72 | }) 73 | 74 | if (!yes) { 75 | return 76 | } 77 | 78 | step('\nUpdating package version...') 79 | updateVersion(targetVersion) 80 | 81 | step('\nGenerating changelog...') 82 | run('pnpm', ['run', 'changelog']) 83 | step('\nFormatting...') 84 | run('pnpm', ['run', 'fmt']) 85 | 86 | const { yes: changelogOk } = await prompts({ 87 | type: 'confirm', 88 | name: 'yes', 89 | message: '\nChangelog generated. Does it look good?', 90 | }) 91 | 92 | if (!changelogOk) { 93 | return 94 | } 95 | 96 | step('\nCommitting changes...') 97 | run('git', ['add', '-A']) 98 | run('git', ['commit', '-m', `release: ${tag}`]) 99 | 100 | step('\nPushing to GitHub...') 101 | run('git', ['tag', tag]) 102 | run('git', ['push', 'origin', tag]) 103 | run('git', ['push', '-u', 'origin', 'main']) 104 | } 105 | 106 | /** 107 | * @param {string} version 108 | */ 109 | function updateVersion(version) { 110 | const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) 111 | pkg.version = version 112 | fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n') 113 | } 114 | 115 | main().catch((err) => console.error(err)) 116 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 16 | 21 | 26 | 30 | 34 | 38 | 39 | 40 | 41 | 42 | 43 | 47 | 48 | 49 | 50 | 51 | 55 | 56 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 71 | 72 | 76 | 77 | Python Playground 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 0.1.0 (2021-06-21) 2 | 3 | ### Bug Fixes 4 | 5 | - `EmbedCode` now reflects the updated code 6 | ([#32](https://github.com/toyai/python-playground/issues/32)) 7 | ([f57dce4](https://github.com/toyai/python-playground/commit/f57dce4f6de3dcda0149accd760b8dd3344a7c36)), 8 | closes [#29](https://github.com/toyai/python-playground/issues/29) 9 | [#30](https://github.com/toyai/python-playground/issues/30) 10 | - check netlify build is from PR with string `true` or `false` 11 | ([6f779a0](https://github.com/toyai/python-playground/commit/6f779a05b2cee1765deca95ad8cff8e9df2152da)) 12 | - do not show API docs in production 13 | ([#61](https://github.com/toyai/python-playground/issues/61)) 14 | ([53a627f](https://github.com/toyai/python-playground/commit/53a627f9d6dde2ebee90554bba7334bd07299e91)) 15 | - enable linewrapping for CodeMirror 16 | ([#60](https://github.com/toyai/python-playground/issues/60)) 17 | ([47f6be7](https://github.com/toyai/python-playground/commit/47f6be7d09399e9cb4e3e1dc674b8bf30915e1f1)) 18 | - remove 50px from height of cm-editor (fix 19 | [#31](https://github.com/toyai/python-playground/issues/31)) 20 | ([#47](https://github.com/toyai/python-playground/issues/47)) 21 | ([f0d942f](https://github.com/toyai/python-playground/commit/f0d942fd9c1371de7b13ef357131a028fc742b2a)) 22 | - show completions for keywords, not index 23 | ([#18](https://github.com/toyai/python-playground/issues/18)) 24 | ([e1f98ef](https://github.com/toyai/python-playground/commit/e1f98ef8c95c0f3ecbc9e88ea13feb98d80fa460)) 25 | - sort codemirror extensions 26 | ([#17](https://github.com/toyai/python-playground/issues/17)) 27 | ([94440db](https://github.com/toyai/python-playground/commit/94440dbc1beabe590c58f29036828bbbb4e623f7)) 28 | 29 | ### Features 30 | 31 | - add code editor pane, use CodeMirror 6 32 | ([#2](https://github.com/toyai/python-playground/issues/2)) 33 | ([cbd9246](https://github.com/toyai/python-playground/commit/cbd92464d4b9cc4a98a046c426464999c7e40361)) 34 | - add custom them based on github light theme 35 | ([#25](https://github.com/toyai/python-playground/issues/25)) 36 | ([30ca357](https://github.com/toyai/python-playground/commit/30ca357c4f944561cb8edd47106d46f1de2973dd)) 37 | - add embeddable code button & edit on playground link for embedding in `iframe` 38 | ([#16](https://github.com/toyai/python-playground/issues/16)) 39 | ([82e48a2](https://github.com/toyai/python-playground/commit/82e48a28359b4f0528b1a62950272e9b305b5239)), 40 | closes [#8](https://github.com/toyai/python-playground/issues/8) 41 | - add initial backend API 42 | ([#10](https://github.com/toyai/python-playground/issues/10)) 43 | ([c0d071d](https://github.com/toyai/python-playground/commit/c0d071d68e6ae6d23ede246009385432d93f4d7d)) 44 | - add mobile view layout 45 | ([#46](https://github.com/toyai/python-playground/issues/46)) 46 | ([0a9a71c](https://github.com/toyai/python-playground/commit/0a9a71c8ac77848d504ec3922655f4d96d4f79ed)) 47 | - add result pane ([#36](https://github.com/toyai/python-playground/issues/36)) 48 | ([f658ca9](https://github.com/toyai/python-playground/commit/f658ca9d36a76c967eb74e9d652dc647bc7c102c)) 49 | - add run icon and button 50 | ([#34](https://github.com/toyai/python-playground/issues/34)) 51 | ([6bda55f](https://github.com/toyai/python-playground/commit/6bda55f6c89337fcaa3526cecebb251de9143054)) 52 | - catch the traceback and response it 53 | ([#57](https://github.com/toyai/python-playground/issues/57)) 54 | ([22bc499](https://github.com/toyai/python-playground/commit/22bc49959c97d007fdc73baec5831861c3f0d5e7)) 55 | - download from Blob obj 56 | ([#41](https://github.com/toyai/python-playground/issues/41)) 57 | ([e4e8313](https://github.com/toyai/python-playground/commit/e4e8313e4c42495ac89df55d08d1e995420cab40)) 58 | - install extra requirements from requirements-extra.txt 59 | ([#65](https://github.com/toyai/python-playground/issues/65)) 60 | ([5f84f88](https://github.com/toyai/python-playground/commit/5f84f884a836ec0866cad897a485a360f52fbce2)) 61 | - log api docs in dev mode 62 | ([#59](https://github.com/toyai/python-playground/issues/59)) 63 | ([e00c373](https://github.com/toyai/python-playground/commit/e00c373ec695c3f8357202d8513176bcbc510f01)) 64 | - open a public file from GitHub 65 | ([#39](https://github.com/toyai/python-playground/issues/39)) 66 | ([f8c9b28](https://github.com/toyai/python-playground/commit/f8c9b289f6c8a76052dfbf7a537636dd7dfed174)) 67 | - send and run code on backend 68 | ([#42](https://github.com/toyai/python-playground/issues/42)) 69 | ([fdd52ef](https://github.com/toyai/python-playground/commit/fdd52efe7e90cbc23eafe5e4f5dd2a294e1aff1c)) 70 | - set frontend and backend url from env var 71 | ([#58](https://github.com/toyai/python-playground/issues/58)) 72 | ([05fb3ba](https://github.com/toyai/python-playground/commit/05fb3ba73e11c79024059307102e9edb2d9f4499)) 73 | - show python version playground uses to run 74 | ([#52](https://github.com/toyai/python-playground/issues/52)) 75 | ([d752279](https://github.com/toyai/python-playground/commit/d7522795d4699cb9bb82173435bf8b52aeda7a5d)) 76 | - **codemirror:** add codeFolding extension 77 | ([#38](https://github.com/toyai/python-playground/issues/38)) 78 | ([e3890ab](https://github.com/toyai/python-playground/commit/e3890ab41dedacfa83a2631727f405a202ffa520)) 79 | - unique url for every code 80 | ([#15](https://github.com/toyai/python-playground/issues/15)) 81 | ([141109d](https://github.com/toyai/python-playground/commit/141109dead1c8a1868b7cdb5b352d2fe2166b615)), 82 | closes [#3](https://github.com/toyai/python-playground/issues/3) 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python Playground 2 | 3 | [](https://github.com/toyai/python-playground/actions/workflows/ci.yml) 4 | [](https://github.com/toyai/python-playground/releases) 5 | 6 | > Interactive Playground for Python 7 | 8 | ## Features 9 | 10 | - Open python files from public GitHub repository. 11 | [Demo](https://python-playground.netlify.app/?https://github.com/toyai/python-playground/blob/main/api/main.py) 12 | 13 | - Unique URL for every python code/file. 14 | [Demo](https://python-playground.netlify.app/#ewAiAG0AYQBpAG4ALgBwAHkAIgA6ACIAIwAgAFAAeQB0AGgAbwBuACAAMwA6ACAARgBpAGIAbwBuAGEAYwBjAGkAIABzAGUAcgBpAGUAcwAgAHUAcAAgAHQAbwAgAG4AXABuAGQAZQBmACAAZgBpAGIAKABuACkAOgBcAG4AIAAgACAAIABhACwAIABiACAAPQAgADAALAAgADEAXABuACAAIAAgACAAdwBoAGkAbABlACAAYQAgADwAIABuADoAXABuACAAIAAgACAAIAAgACAAIABwAHIAaQBuAHQAKABhACwAIABlAG4AZAA9ACcAIAAnACkAXABuACAAIAAgACAAIAAgACAAIABhACwAIABiACAAPQAgAGIALAAgAGEAKwBiAFwAbgAgACAAIAAgAHAAcgBpAG4AdAAoACkAXABuAGYAaQBiACgAMQAwADAAMAApAFwAbgAiAH0A) 15 | 16 | - Embeddable in the documentations. 17 | [Demo](https://ydcjeff.github.io/sphinxcontrib-playground/play.html) 18 | 19 | - Show the python traceback as a result if errors occur. 20 | [Demo](https://python-playground.netlify.app/#ewAiAG0AYQBpAG4ALgBwAHkAIgA6ACIAcAByAGkAbgB0ACgAJwBIAGUAbABsAG8AIABXAG8AcgBsAGQAIQAnACIAfQA=) 21 | 22 | - Autocompletion for Python builtins. 23 | 24 | - Export the code to `.py` file. 25 | 26 | - Mobile friendly. 27 | 28 | ## Goal 29 | 30 | The original goal of this project is to have interactive examples in the 31 | documentation of the python projects like the documentations of the popular 32 | JavaScript frameworks. 33 | 34 | However since this app is running on the free tier of Netlify and Heroku, we 35 | cannot install every python package due to the storage size, memory limit, and 36 | version conflicting can occur, too. 37 | 38 | So, instead we make a basic app with Python only and let the projects' 39 | maintainers install the required dependencies for their python projects. 40 | 41 | ## Usage 42 | 43 | To use this app for the python projects: 44 | 45 | 1. Fork this repository. 46 | 47 | 2. Register an account for [Netlify](https://app.netlify.com) and 48 | [Heroku](https://heroku.com). 49 | 50 | 3. Put the extra python packages in `api/requirements-extra.txt` which needs to 51 | be creted. 52 | 53 | 4. Deploy the frontend app on Netlify from your forked repository. 54 | 55 | - Login with your account at https://app.netlify.com. 56 | 57 | - Choose `New site from Git`. 58 | 59 | - Choose GitHub. 60 | 61 | - Choose your forked repository. 62 | 63 | - Click `Deploy site`. _(Do not worry about the build command and publish 64 | directory. Those are already preconfigured.)_ 65 | 66 | - Change the site name in the `Site Settings`. _(The site name will be used 67 | as the environment variable in the backend app)_ 68 | 69 | 5. Deploy the backend app on Heroku from your forked repository. 70 | 71 | - Login with your account at https://heroku.com. 72 | 73 | - Choose `Create new app` from `New` dropdown at the top right corner. 74 | 75 | - Give an app name and Click `Create app`. 76 | 77 | - [Install Heroku CLI as per your OS](https://devcenter.heroku.com/articles/heroku-cli). 78 | 79 | - Type `heroku login` in the terminal. 80 | 81 | - Type `heroku stack:set container -a ` in the terminal. 82 | Replace `your-app-name` with the previous given app name. This command set 83 | the stack of your heroku app to be container which is basically docker. 84 | _(This step is required since we are going to deploy the backend app as the 85 | docker image)_ 86 | 87 | - Choose `Connect to GitHub`. Choose the forked repository. 88 | 89 | - Go to the app `Settings`. Click `Reveal Config Vars`. 90 | 91 | - Set `KEY` to be `PG_FRONTEND_SITE_NAME`. 92 | 93 | - Set `VALUE` to be your netlify site name. _Only the site name is 94 | required. You can omit `.netlify.app`_. 95 | 96 | - If the frontend app will be deployed from custom domain url, set 97 | `CUSTOM_DOMAIN_URL` as `KEY` and your custom domain url as `VALUE`. 98 | _**This custom domain url has to be full URL**_. If you are not sure 99 | about the custom domain url, use the output of `location.origin` in 100 | `Console` tab of DevTool in the browser. 101 | 102 | - Go back to `Deploy` tab. Click `Deploy Branch`. 103 | 104 | 6. Go back to the frontend app on Netlify. Click `Site settings`. 105 | 106 | - Click `Build & Deploy` in the left pane. Choose `Environment`. 107 | 108 | - Set `PG_BACKEND_SITE_NAME` as key and the name of the backend app as value. 109 | 110 | - And redeploy the site. 111 | 112 | 7. You have successfully deployed your own version of the Python Playground. 113 | 114 | 8. Since most python projects are using 115 | [Sphinx](https://www.sphinx-doc.org/en/master/) as a documentation generator, 116 | we have made a sphinx extension – 117 | [sphinxcontrib-playground](https://github.com/ydcjeff/sphinxcontrib-playground). 118 | Refer to 119 | [its documentation](https://ydcjeff.github.io/sphinxcontrib-playground/) for 120 | the usage. 121 | 122 | 9. To open a python file from GitHub, append the Playground URL + `?` in front 123 | of the github url. For example, if the github url is 124 | https://github.com/toyai/python-playground/blob/main/api/main.py, then the 125 | playground url to open that file will be like: 126 | https://python-playground.netlify.app/?https://github.com/toyai/python-playground/blob/main/api/main.py. 127 | 128 | > NOTE 129 | > 130 | > `?` is required. `https://` can be omitted if you wish though not required. 131 | 132 | ## Tech Stack 133 | 134 | - [CodeMirror 6](https://codemirror.net/6/) 135 | - [FastAPI](https://fastapi.tiangolo.com) 136 | - [Vite](https://vitejs.dev) 137 | - [Vue 3](https://v3.vuejs.org) 138 | - [WindiCSS 3](https://windicss.org) 139 | 140 | ## Contribution 141 | 142 | See [Contributing Guide](./.github/contributing.md). 143 | 144 | ## Acknowledgements 145 | 146 | This project is heavily inspired by (alphabetically): 147 | 148 | - [Black Playground](https://black.vercel.app) 149 | - [Svelte REPL](https://svelte.dev/repl) 150 | - [Vue SFC Playground](https://sfc.vuejs.org) 151 | - [WindiCSS Play](https://play.windicss.org) 152 | 153 | ## License 154 | 155 | [MIT](./LICENSE) 156 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@codemirror/autocomplete': ^0.20.1 5 | '@codemirror/closebrackets': ^0.19.2 6 | '@codemirror/commands': ^0.20.0 7 | '@codemirror/comment': ^0.19.1 8 | '@codemirror/fold': ^0.19.4 9 | '@codemirror/gutter': ^0.19.9 10 | '@codemirror/highlight': ^0.19.8 11 | '@codemirror/history': ^0.19.2 12 | '@codemirror/lang-python': ^0.20.0 13 | '@codemirror/language': ^0.20.2 14 | '@codemirror/matchbrackets': ^0.19.4 15 | '@codemirror/search': ^0.20.1 16 | '@codemirror/state': ^0.20.0 17 | '@codemirror/view': ^0.20.6 18 | '@vitejs/plugin-vue': ^2.3.3 19 | '@vue/test-utils': ^2.0.0 20 | conventional-changelog-cli: ^2.2.2 21 | husky: ^8.0.1 22 | lint-staged: ^12.4.1 23 | playwright-chromium: ^1.22.2 24 | prettier: ^2.6.2 25 | prompts: ^2.4.2 26 | semver: ^7.3.7 27 | uvu: ^0.5.3 28 | vite: ^2.9.9 29 | vite-plugin-windicss: ^1.8.4 30 | vue: ^3.2.36 31 | windicss: ^3.5.4 32 | 33 | devDependencies: 34 | '@codemirror/autocomplete': 0.20.1 35 | '@codemirror/closebrackets': 0.19.2 36 | '@codemirror/commands': 0.20.0 37 | '@codemirror/comment': 0.19.1 38 | '@codemirror/fold': 0.19.4 39 | '@codemirror/gutter': 0.19.9 40 | '@codemirror/highlight': 0.19.8 41 | '@codemirror/history': 0.19.2 42 | '@codemirror/lang-python': 0.20.0 43 | '@codemirror/language': 0.20.2 44 | '@codemirror/matchbrackets': 0.19.4 45 | '@codemirror/search': 0.20.1 46 | '@codemirror/state': 0.20.0 47 | '@codemirror/view': 0.20.6 48 | '@vitejs/plugin-vue': 2.3.3_vite@2.9.9+vue@3.2.36 49 | '@vue/test-utils': 2.0.0_vue@3.2.36 50 | conventional-changelog-cli: 2.2.2 51 | husky: 8.0.1 52 | lint-staged: 12.4.1 53 | playwright-chromium: 1.22.2 54 | prettier: 2.6.2 55 | prompts: 2.4.2 56 | semver: 7.3.7 57 | uvu: 0.5.3 58 | vite: 2.9.9 59 | vite-plugin-windicss: 1.8.4_vite@2.9.9 60 | vue: 3.2.36 61 | windicss: 3.5.4 62 | 63 | packages: 64 | 65 | /@antfu/utils/0.5.1: 66 | resolution: {integrity: sha512-8Afo0+xvYe1K8Wm4xHTymfTkpzy36aaqDvhXIayUwl+mecMG9Xzl3XjXa6swG6Bk8FBeQ646RyvmsYt6+2Be9g==} 67 | dev: true 68 | 69 | /@babel/code-frame/7.16.0: 70 | resolution: {integrity: sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==} 71 | engines: {node: '>=6.9.0'} 72 | dependencies: 73 | '@babel/highlight': 7.16.0 74 | dev: true 75 | 76 | /@babel/helper-validator-identifier/7.16.7: 77 | resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} 78 | engines: {node: '>=6.9.0'} 79 | dev: true 80 | 81 | /@babel/highlight/7.16.0: 82 | resolution: {integrity: sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==} 83 | engines: {node: '>=6.9.0'} 84 | dependencies: 85 | '@babel/helper-validator-identifier': 7.16.7 86 | chalk: 2.4.2 87 | js-tokens: 4.0.0 88 | dev: true 89 | 90 | /@babel/parser/7.16.4: 91 | resolution: {integrity: sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==} 92 | engines: {node: '>=6.0.0'} 93 | hasBin: true 94 | dependencies: 95 | '@babel/types': 7.17.10 96 | dev: true 97 | 98 | /@babel/types/7.17.10: 99 | resolution: {integrity: sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==} 100 | engines: {node: '>=6.9.0'} 101 | dependencies: 102 | '@babel/helper-validator-identifier': 7.16.7 103 | to-fast-properties: 2.0.0 104 | dev: true 105 | 106 | /@codemirror/autocomplete/0.20.1: 107 | resolution: {integrity: sha512-rWDAkE1Qn9O4LsV8tAm/KlzzqdQLaIxqDOLhVYja3rKQIWebD3dixIzg9BAKpjt+0dIaDwtIp3yinD9MefgbQQ==} 108 | dependencies: 109 | '@codemirror/language': 0.20.2 110 | '@codemirror/state': 0.20.0 111 | '@codemirror/view': 0.20.6 112 | '@lezer/common': 0.16.0 113 | dev: true 114 | 115 | /@codemirror/closebrackets/0.19.2: 116 | resolution: {integrity: sha512-ClMPzPcPP0eQiDcVjtVPl6OLxgdtZSYDazsvT0AKl70V1OJva0eHgl4/6kCW3RZ0pb2n34i9nJz4eXCmK+TYDA==} 117 | dependencies: 118 | '@codemirror/language': 0.19.8 119 | '@codemirror/rangeset': 0.19.5 120 | '@codemirror/state': 0.19.9 121 | '@codemirror/text': 0.19.6 122 | '@codemirror/view': 0.19.47 123 | dev: true 124 | 125 | /@codemirror/commands/0.20.0: 126 | resolution: {integrity: sha512-v9L5NNVA+A9R6zaFvaTbxs30kc69F6BkOoiEbeFw4m4I0exmDEKBILN6mK+GksJtvTzGBxvhAPlVFTdQW8GB7Q==} 127 | dependencies: 128 | '@codemirror/language': 0.20.2 129 | '@codemirror/state': 0.20.0 130 | '@codemirror/view': 0.20.6 131 | '@lezer/common': 0.16.0 132 | dev: true 133 | 134 | /@codemirror/comment/0.19.1: 135 | resolution: {integrity: sha512-uGKteBuVWAC6fW+Yt8u27DOnXMT/xV4Ekk2Z5mRsiADCZDqYvryrJd6PLL5+8t64BVyocwQwNfz1UswYS2CtFQ==} 136 | dependencies: 137 | '@codemirror/state': 0.19.9 138 | '@codemirror/text': 0.19.6 139 | '@codemirror/view': 0.19.47 140 | dev: true 141 | 142 | /@codemirror/fold/0.19.4: 143 | resolution: {integrity: sha512-0SNSkRSOa6gymD6GauHa3sxiysjPhUC0SRVyTlvL52o0gz9GHdc8kNqNQskm3fBtGGOiSriGwF/kAsajRiGhVw==} 144 | dependencies: 145 | '@codemirror/gutter': 0.19.9 146 | '@codemirror/language': 0.19.8 147 | '@codemirror/rangeset': 0.19.5 148 | '@codemirror/state': 0.19.9 149 | '@codemirror/view': 0.19.47 150 | dev: true 151 | 152 | /@codemirror/gutter/0.19.9: 153 | resolution: {integrity: sha512-PFrtmilahin1g6uL27aG5tM/rqR9DZzZYZsIrCXA5Uc2OFTFqx4owuhoU9hqfYxHp5ovfvBwQ+txFzqS4vog6Q==} 154 | dependencies: 155 | '@codemirror/rangeset': 0.19.2 156 | '@codemirror/state': 0.19.9 157 | '@codemirror/view': 0.19.47 158 | dev: true 159 | 160 | /@codemirror/highlight/0.19.8: 161 | resolution: {integrity: sha512-v/lzuHjrYR8MN2mEJcUD6fHSTXXli9C1XGYpr+ElV6fLBIUhMTNKR3qThp611xuWfXfwDxeL7ppcbkM/MzPV3A==} 162 | dependencies: 163 | '@codemirror/language': 0.19.8 164 | '@codemirror/rangeset': 0.19.5 165 | '@codemirror/state': 0.19.9 166 | '@codemirror/view': 0.19.47 167 | '@lezer/common': 0.15.8 168 | style-mod: 4.0.0 169 | dev: true 170 | 171 | /@codemirror/history/0.19.2: 172 | resolution: {integrity: sha512-unhP4t3N2smzmHoo/Yio6ueWi+il8gm9VKrvi6wlcdGH5fOfVDNkmjHQ495SiR+EdOG35+3iNebSPYww0vN7ow==} 173 | dependencies: 174 | '@codemirror/state': 0.19.9 175 | '@codemirror/view': 0.19.47 176 | dev: true 177 | 178 | /@codemirror/lang-python/0.20.0: 179 | resolution: {integrity: sha512-P2mIyjqBexRTaYbLmAf1HpIyNDw6nWsh2K5MiDi80+6oYwnRggU9dR3Yn9Lv0RM5ph3xJzayMbW0IpicIfA87w==} 180 | dependencies: 181 | '@codemirror/language': 0.20.2 182 | '@lezer/python': 0.16.0 183 | dev: true 184 | 185 | /@codemirror/language/0.19.8: 186 | resolution: {integrity: sha512-KhRne8qmzSKkaw+qhkwgNsPKxmThlyeJ3umfc33B9kJzVP7xhTkwX2MEPl0almM3brxMi+lPYx7gCPOy1gHsWw==} 187 | dependencies: 188 | '@codemirror/state': 0.19.9 189 | '@codemirror/text': 0.19.6 190 | '@codemirror/view': 0.19.47 191 | '@lezer/common': 0.15.8 192 | '@lezer/lr': 0.15.4 193 | dev: true 194 | 195 | /@codemirror/language/0.20.2: 196 | resolution: {integrity: sha512-WB3Bnuusw0xhVvhBocieYKwJm04SOk5bPoOEYksVHKHcGHFOaYaw+eZVxR4gIqMMcGzOIUil0FsCmFk8yrhHpw==} 197 | dependencies: 198 | '@codemirror/state': 0.20.0 199 | '@codemirror/view': 0.20.6 200 | '@lezer/common': 0.16.0 201 | '@lezer/highlight': 0.16.0 202 | '@lezer/lr': 0.16.2 203 | style-mod: 4.0.0 204 | dev: true 205 | 206 | /@codemirror/matchbrackets/0.19.4: 207 | resolution: {integrity: sha512-VFkaOKPNudAA5sGP1zikRHCEKU0hjYmkKpr04pybUpQvfTvNJXlReCyP0rvH/1iEwAGPL990ZTT+QrLdu4MeEA==} 208 | dependencies: 209 | '@codemirror/language': 0.19.8 210 | '@codemirror/state': 0.19.9 211 | '@codemirror/view': 0.19.47 212 | '@lezer/common': 0.15.8 213 | dev: true 214 | 215 | /@codemirror/rangeset/0.19.2: 216 | resolution: {integrity: sha512-5d+X8LtmeZtfFtKrSx57bIHRUpKv2HD0b74clp4fGA7qJLLfYehF6FGkJJxJb8lKsqAga1gdjjWr0jiypmIxoQ==} 217 | dependencies: 218 | '@codemirror/state': 0.19.9 219 | dev: true 220 | 221 | /@codemirror/rangeset/0.19.5: 222 | resolution: {integrity: sha512-L3b+RIwIRKOJ3pJLOtpkxCUjGnxZKFyPb0CjYWKnVLuzEIaEExWWK7sp6rsejxOy8RjYzfCHlFhYB4UdQN7brw==} 223 | dependencies: 224 | '@codemirror/state': 0.19.9 225 | dev: true 226 | 227 | /@codemirror/search/0.20.1: 228 | resolution: {integrity: sha512-ROe6gRboQU5E4z6GAkNa2kxhXqsGNbeLEisbvzbOeB7nuDYXUZ70vGIgmqPu0tB+1M3F9yWk6W8k2vrFpJaD4Q==} 229 | dependencies: 230 | '@codemirror/state': 0.20.0 231 | '@codemirror/view': 0.20.6 232 | crelt: 1.0.5 233 | dev: true 234 | 235 | /@codemirror/state/0.19.9: 236 | resolution: {integrity: sha512-psOzDolKTZkx4CgUqhBQ8T8gBc0xN5z4gzed109aF6x7D7umpDRoimacI/O6d9UGuyl4eYuDCZmDFr2Rq7aGOw==} 237 | dependencies: 238 | '@codemirror/text': 0.19.6 239 | dev: true 240 | 241 | /@codemirror/state/0.20.0: 242 | resolution: {integrity: sha512-R3XrAWCS5Xm9lx+4pDET4EUPEg+8bDfAa5zoOFIhx+VChsfew9Vy33dAjCXS5ES4Q8UecW4WM4UudmUFpZ+86A==} 243 | dev: true 244 | 245 | /@codemirror/text/0.19.6: 246 | resolution: {integrity: sha512-T9jnREMIygx+TPC1bOuepz18maGq/92q2a+n4qTqObKwvNMg+8cMTslb8yxeEDEq7S3kpgGWxgO1UWbQRij0dA==} 247 | dev: true 248 | 249 | /@codemirror/view/0.19.47: 250 | resolution: {integrity: sha512-SfbagKvJQl5dtt+9wYpo9sa3ZkMgUxTq+/hXDf0KVwIx+zu3cJIqfEm9xSx6yXkq7it7RsPGHaPasApNffF/8g==} 251 | dependencies: 252 | '@codemirror/rangeset': 0.19.5 253 | '@codemirror/state': 0.19.9 254 | '@codemirror/text': 0.19.6 255 | style-mod: 4.0.0 256 | w3c-keyname: 2.2.4 257 | dev: true 258 | 259 | /@codemirror/view/0.20.6: 260 | resolution: {integrity: sha512-k/Enz4HMcST5Waom2r8y8VtiJfgnU5+Y/pNVO45eIhsRH+0LYtAMgJqqqspWVv1apOuMzmlttw6keaPvkloakg==} 261 | dependencies: 262 | '@codemirror/state': 0.20.0 263 | style-mod: 4.0.0 264 | w3c-keyname: 2.2.4 265 | dev: true 266 | 267 | /@hutson/parse-repository-url/3.0.2: 268 | resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} 269 | engines: {node: '>=6.9.0'} 270 | dev: true 271 | 272 | /@lezer/common/0.15.8: 273 | resolution: {integrity: sha512-zpS/xty48huX4uBidupmWDYCRBYpVtoTiFhzYhd6GsQwU67WsdSImdWzZJDrF/DhcQ462wyrZahHlo2grFB5ig==} 274 | dev: true 275 | 276 | /@lezer/common/0.16.0: 277 | resolution: {integrity: sha512-H6sPCku+asKWYaNjwfQ1Uvcay9UP1Pdzu4qpy8GtRZ0cKT2AAGnj9MQGiRtY18MDntvhYRJxNGv7FNWOSV/e8A==} 278 | dev: true 279 | 280 | /@lezer/highlight/0.16.0: 281 | resolution: {integrity: sha512-iE5f4flHlJ1g1clOStvXNLbORJoiW4Kytso6ubfYzHnaNo/eo5SKhxs4wv/rtvwZQeZrK3we8S9SyA7OGOoRKQ==} 282 | dependencies: 283 | '@lezer/common': 0.16.0 284 | dev: true 285 | 286 | /@lezer/lr/0.15.4: 287 | resolution: {integrity: sha512-vwgG80sihEGJn6wJp6VijXrnzVai/KPva/OzYKaWvIx0IiXKjoMQ8UAwcgpSBwfS4Fbz3IKOX/cCNXU3r1FvpQ==} 288 | dependencies: 289 | '@lezer/common': 0.15.8 290 | dev: true 291 | 292 | /@lezer/lr/0.16.2: 293 | resolution: {integrity: sha512-bx7kkp4eLOzp+YclKMOx1P0OzWRH/6Y3EdEvsHC+rhsc7H72GvccwlKfuXlWkiKjnmzlxLTFxsNjA8v+Yj75mQ==} 294 | dependencies: 295 | '@lezer/common': 0.16.0 296 | dev: true 297 | 298 | /@lezer/python/0.16.0: 299 | resolution: {integrity: sha512-jbcidwKGE1TwmozoHel6RwqHc6/gC8KAx8ZwFYUNcIuar20dQTGgyj6MVn85njhm2ZtejUJpTkVr5KS8KGh1CQ==} 300 | dependencies: 301 | '@lezer/highlight': 0.16.0 302 | '@lezer/lr': 0.16.2 303 | dev: true 304 | 305 | /@nodelib/fs.scandir/2.1.5: 306 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 307 | engines: {node: '>= 8'} 308 | dependencies: 309 | '@nodelib/fs.stat': 2.0.5 310 | run-parallel: 1.2.0 311 | dev: true 312 | 313 | /@nodelib/fs.stat/2.0.5: 314 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 315 | engines: {node: '>= 8'} 316 | dev: true 317 | 318 | /@nodelib/fs.walk/1.2.8: 319 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 320 | engines: {node: '>= 8'} 321 | dependencies: 322 | '@nodelib/fs.scandir': 2.1.5 323 | fastq: 1.13.0 324 | dev: true 325 | 326 | /@types/minimist/1.2.2: 327 | resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} 328 | dev: true 329 | 330 | /@types/normalize-package-data/2.4.1: 331 | resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} 332 | dev: true 333 | 334 | /@vitejs/plugin-vue/2.3.3_vite@2.9.9+vue@3.2.36: 335 | resolution: {integrity: sha512-SmQLDyhz+6lGJhPELsBdzXGc+AcaT8stgkbiTFGpXPe8Tl1tJaBw1A6pxDqDuRsVkD8uscrkx3hA7QDOoKYtyw==} 336 | engines: {node: '>=12.0.0'} 337 | peerDependencies: 338 | vite: ^2.5.10 339 | vue: ^3.2.25 340 | dependencies: 341 | vite: 2.9.9 342 | vue: 3.2.36 343 | dev: true 344 | 345 | /@vue/compiler-core/3.2.36: 346 | resolution: {integrity: sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==} 347 | dependencies: 348 | '@babel/parser': 7.16.4 349 | '@vue/shared': 3.2.36 350 | estree-walker: 2.0.2 351 | source-map: 0.6.1 352 | dev: true 353 | 354 | /@vue/compiler-dom/3.2.36: 355 | resolution: {integrity: sha512-tcOTAOiW4s24QLnq+ON6J+GRONXJ+A/mqKCORi0LSlIh8XQlNnlm24y8xIL8la+ZDgkdbjarQ9ZqYSvEja6gVA==} 356 | dependencies: 357 | '@vue/compiler-core': 3.2.36 358 | '@vue/shared': 3.2.36 359 | dev: true 360 | 361 | /@vue/compiler-sfc/3.2.36: 362 | resolution: {integrity: sha512-AvGb4bTj4W8uQ4BqaSxo7UwTEqX5utdRSMyHy58OragWlt8nEACQ9mIeQh3K4di4/SX+41+pJrLIY01lHAOFOA==} 363 | dependencies: 364 | '@babel/parser': 7.16.4 365 | '@vue/compiler-core': 3.2.36 366 | '@vue/compiler-dom': 3.2.36 367 | '@vue/compiler-ssr': 3.2.36 368 | '@vue/reactivity-transform': 3.2.36 369 | '@vue/shared': 3.2.36 370 | estree-walker: 2.0.2 371 | magic-string: 0.25.7 372 | postcss: 8.4.13 373 | source-map: 0.6.1 374 | dev: true 375 | 376 | /@vue/compiler-ssr/3.2.36: 377 | resolution: {integrity: sha512-+KugInUFRvOxEdLkZwE+W43BqHyhBh0jpYXhmqw1xGq2dmE6J9eZ8UUSOKNhdHtQ/iNLWWeK/wPZkVLUf3YGaw==} 378 | dependencies: 379 | '@vue/compiler-dom': 3.2.36 380 | '@vue/shared': 3.2.36 381 | dev: true 382 | 383 | /@vue/reactivity-transform/3.2.36: 384 | resolution: {integrity: sha512-Jk5o2BhpODC9XTA7o4EL8hSJ4JyrFWErLtClG3NH8wDS7ri9jBDWxI7/549T7JY9uilKsaNM+4pJASLj5dtRwA==} 385 | dependencies: 386 | '@babel/parser': 7.16.4 387 | '@vue/compiler-core': 3.2.36 388 | '@vue/shared': 3.2.36 389 | estree-walker: 2.0.2 390 | magic-string: 0.25.7 391 | dev: true 392 | 393 | /@vue/reactivity/3.2.36: 394 | resolution: {integrity: sha512-c2qvopo0crh9A4GXi2/2kfGYMxsJW4tVILrqRPydVGZHhq0fnzy6qmclWOhBFckEhmyxmpHpdJtIRYGeKcuhnA==} 395 | dependencies: 396 | '@vue/shared': 3.2.36 397 | dev: true 398 | 399 | /@vue/runtime-core/3.2.36: 400 | resolution: {integrity: sha512-PTWBD+Lub+1U3/KhbCExrfxyS14hstLX+cBboxVHaz+kXoiDLNDEYAovPtxeTutbqtClIXtft+wcGdC+FUQ9qQ==} 401 | dependencies: 402 | '@vue/reactivity': 3.2.36 403 | '@vue/shared': 3.2.36 404 | dev: true 405 | 406 | /@vue/runtime-dom/3.2.36: 407 | resolution: {integrity: sha512-gYPYblm7QXHVuBohqNRRT7Wez0f2Mx2D40rb4fleehrJU9CnkjG0phhcGEZFfGwCmHZRqBCRgbFWE98bPULqkg==} 408 | dependencies: 409 | '@vue/runtime-core': 3.2.36 410 | '@vue/shared': 3.2.36 411 | csstype: 2.6.18 412 | dev: true 413 | 414 | /@vue/server-renderer/3.2.36_vue@3.2.36: 415 | resolution: {integrity: sha512-uZE0+jfye6yYXWvAQYeHZv+f50sRryvy16uiqzk3jn8hEY8zTjI+rzlmZSGoE915k+W/Ol9XSw6vxOUD8dGkUg==} 416 | peerDependencies: 417 | vue: 3.2.36 418 | dependencies: 419 | '@vue/compiler-ssr': 3.2.36 420 | '@vue/shared': 3.2.36 421 | vue: 3.2.36 422 | dev: true 423 | 424 | /@vue/shared/3.2.36: 425 | resolution: {integrity: sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==} 426 | dev: true 427 | 428 | /@vue/test-utils/2.0.0_vue@3.2.36: 429 | resolution: {integrity: sha512-zL5kygNq7hONrO1CzaUGprEAklAX+pH8J1MPMCU3Rd2xtSYkZ+PmKU3oEDRg8VAGdL5lNJHzDgrud5amFPtirw==} 430 | peerDependencies: 431 | vue: ^3.0.1 432 | dependencies: 433 | vue: 3.2.36 434 | dev: true 435 | 436 | /@windicss/config/1.8.4: 437 | resolution: {integrity: sha512-i4fFGFfZoRess6WMkauykHC3PFd9xKYVx7lSuLfMK7sgo6x3+l4dY42GbsWMHyLqH1sTMfyt1LgfXSIKYJozSA==} 438 | dependencies: 439 | debug: 4.3.4 440 | jiti: 1.13.0 441 | windicss: 3.5.4 442 | transitivePeerDependencies: 443 | - supports-color 444 | dev: true 445 | 446 | /@windicss/plugin-utils/1.8.4: 447 | resolution: {integrity: sha512-DqJVwAfzlgd8nYSNlmhXOey32pI8UwH7QiOWdFS/AR2O/q9oLDGHDn97Its/kZdfoyhi8ylwZNP2Pk0H7cihhQ==} 448 | dependencies: 449 | '@antfu/utils': 0.5.1 450 | '@windicss/config': 1.8.4 451 | debug: 4.3.4 452 | fast-glob: 3.2.11 453 | magic-string: 0.26.1 454 | micromatch: 4.0.5 455 | windicss: 3.5.4 456 | transitivePeerDependencies: 457 | - supports-color 458 | dev: true 459 | 460 | /JSONStream/1.3.5: 461 | resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} 462 | hasBin: true 463 | dependencies: 464 | jsonparse: 1.3.1 465 | through: 2.3.8 466 | dev: true 467 | 468 | /add-stream/1.0.0: 469 | resolution: {integrity: sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=} 470 | dev: true 471 | 472 | /aggregate-error/3.1.0: 473 | resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} 474 | engines: {node: '>=8'} 475 | dependencies: 476 | clean-stack: 2.2.0 477 | indent-string: 4.0.0 478 | dev: true 479 | 480 | /ansi-escapes/4.3.2: 481 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 482 | engines: {node: '>=8'} 483 | dependencies: 484 | type-fest: 0.21.3 485 | dev: true 486 | 487 | /ansi-regex/5.0.1: 488 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 489 | engines: {node: '>=8'} 490 | dev: true 491 | 492 | /ansi-regex/6.0.1: 493 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 494 | engines: {node: '>=12'} 495 | dev: true 496 | 497 | /ansi-styles/3.2.1: 498 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 499 | engines: {node: '>=4'} 500 | dependencies: 501 | color-convert: 1.9.3 502 | dev: true 503 | 504 | /ansi-styles/4.3.0: 505 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 506 | engines: {node: '>=8'} 507 | dependencies: 508 | color-convert: 2.0.1 509 | dev: true 510 | 511 | /ansi-styles/6.1.0: 512 | resolution: {integrity: sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==} 513 | engines: {node: '>=12'} 514 | dev: true 515 | 516 | /array-ify/1.0.0: 517 | resolution: {integrity: sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=} 518 | dev: true 519 | 520 | /arrify/1.0.1: 521 | resolution: {integrity: sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=} 522 | engines: {node: '>=0.10.0'} 523 | dev: true 524 | 525 | /astral-regex/2.0.0: 526 | resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} 527 | engines: {node: '>=8'} 528 | dev: true 529 | 530 | /braces/3.0.2: 531 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 532 | engines: {node: '>=8'} 533 | dependencies: 534 | fill-range: 7.0.1 535 | dev: true 536 | 537 | /camelcase-keys/6.2.2: 538 | resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} 539 | engines: {node: '>=8'} 540 | dependencies: 541 | camelcase: 5.3.1 542 | map-obj: 4.3.0 543 | quick-lru: 4.0.1 544 | dev: true 545 | 546 | /camelcase/5.3.1: 547 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 548 | engines: {node: '>=6'} 549 | dev: true 550 | 551 | /chalk/2.4.2: 552 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 553 | engines: {node: '>=4'} 554 | dependencies: 555 | ansi-styles: 3.2.1 556 | escape-string-regexp: 1.0.5 557 | supports-color: 5.5.0 558 | dev: true 559 | 560 | /clean-stack/2.2.0: 561 | resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} 562 | engines: {node: '>=6'} 563 | dev: true 564 | 565 | /cli-cursor/3.1.0: 566 | resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} 567 | engines: {node: '>=8'} 568 | dependencies: 569 | restore-cursor: 3.1.0 570 | dev: true 571 | 572 | /cli-truncate/2.1.0: 573 | resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} 574 | engines: {node: '>=8'} 575 | dependencies: 576 | slice-ansi: 3.0.0 577 | string-width: 4.2.3 578 | dev: true 579 | 580 | /cli-truncate/3.1.0: 581 | resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} 582 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 583 | dependencies: 584 | slice-ansi: 5.0.0 585 | string-width: 5.0.1 586 | dev: true 587 | 588 | /cliui/7.0.4: 589 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 590 | dependencies: 591 | string-width: 4.2.3 592 | strip-ansi: 6.0.1 593 | wrap-ansi: 7.0.0 594 | dev: true 595 | 596 | /color-convert/1.9.3: 597 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 598 | dependencies: 599 | color-name: 1.1.3 600 | dev: true 601 | 602 | /color-convert/2.0.1: 603 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 604 | engines: {node: '>=7.0.0'} 605 | dependencies: 606 | color-name: 1.1.4 607 | dev: true 608 | 609 | /color-name/1.1.3: 610 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 611 | dev: true 612 | 613 | /color-name/1.1.4: 614 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 615 | dev: true 616 | 617 | /colorette/2.0.16: 618 | resolution: {integrity: sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==} 619 | dev: true 620 | 621 | /commander/8.3.0: 622 | resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} 623 | engines: {node: '>= 12'} 624 | dev: true 625 | 626 | /compare-func/2.0.0: 627 | resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} 628 | dependencies: 629 | array-ify: 1.0.0 630 | dot-prop: 5.3.0 631 | dev: true 632 | 633 | /conventional-changelog-angular/5.0.13: 634 | resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} 635 | engines: {node: '>=10'} 636 | dependencies: 637 | compare-func: 2.0.0 638 | q: 1.5.1 639 | dev: true 640 | 641 | /conventional-changelog-atom/2.0.8: 642 | resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} 643 | engines: {node: '>=10'} 644 | dependencies: 645 | q: 1.5.1 646 | dev: true 647 | 648 | /conventional-changelog-cli/2.2.2: 649 | resolution: {integrity: sha512-8grMV5Jo8S0kP3yoMeJxV2P5R6VJOqK72IiSV9t/4H5r/HiRqEBQ83bYGuz4Yzfdj4bjaAEhZN/FFbsFXr5bOA==} 650 | engines: {node: '>=10'} 651 | hasBin: true 652 | dependencies: 653 | add-stream: 1.0.0 654 | conventional-changelog: 3.1.24 655 | lodash: 4.17.21 656 | meow: 8.1.2 657 | tempfile: 3.0.0 658 | dev: true 659 | 660 | /conventional-changelog-codemirror/2.0.8: 661 | resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} 662 | engines: {node: '>=10'} 663 | dependencies: 664 | q: 1.5.1 665 | dev: true 666 | 667 | /conventional-changelog-conventionalcommits/4.6.1: 668 | resolution: {integrity: sha512-lzWJpPZhbM1R0PIzkwzGBCnAkH5RKJzJfFQZcl/D+2lsJxAwGnDKBqn/F4C1RD31GJNn8NuKWQzAZDAVXPp2Mw==} 669 | engines: {node: '>=10'} 670 | dependencies: 671 | compare-func: 2.0.0 672 | lodash: 4.17.21 673 | q: 1.5.1 674 | dev: true 675 | 676 | /conventional-changelog-core/4.2.4: 677 | resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} 678 | engines: {node: '>=10'} 679 | dependencies: 680 | add-stream: 1.0.0 681 | conventional-changelog-writer: 5.0.0 682 | conventional-commits-parser: 3.2.3 683 | dateformat: 3.0.3 684 | get-pkg-repo: 4.2.1 685 | git-raw-commits: 2.0.10 686 | git-remote-origin-url: 2.0.0 687 | git-semver-tags: 4.1.1 688 | lodash: 4.17.21 689 | normalize-package-data: 3.0.3 690 | q: 1.5.1 691 | read-pkg: 3.0.0 692 | read-pkg-up: 3.0.0 693 | through2: 4.0.2 694 | dev: true 695 | 696 | /conventional-changelog-ember/2.0.9: 697 | resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} 698 | engines: {node: '>=10'} 699 | dependencies: 700 | q: 1.5.1 701 | dev: true 702 | 703 | /conventional-changelog-eslint/3.0.9: 704 | resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} 705 | engines: {node: '>=10'} 706 | dependencies: 707 | q: 1.5.1 708 | dev: true 709 | 710 | /conventional-changelog-express/2.0.6: 711 | resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} 712 | engines: {node: '>=10'} 713 | dependencies: 714 | q: 1.5.1 715 | dev: true 716 | 717 | /conventional-changelog-jquery/3.0.11: 718 | resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} 719 | engines: {node: '>=10'} 720 | dependencies: 721 | q: 1.5.1 722 | dev: true 723 | 724 | /conventional-changelog-jshint/2.0.9: 725 | resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} 726 | engines: {node: '>=10'} 727 | dependencies: 728 | compare-func: 2.0.0 729 | q: 1.5.1 730 | dev: true 731 | 732 | /conventional-changelog-preset-loader/2.3.4: 733 | resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} 734 | engines: {node: '>=10'} 735 | dev: true 736 | 737 | /conventional-changelog-writer/5.0.0: 738 | resolution: {integrity: sha512-HnDh9QHLNWfL6E1uHz6krZEQOgm8hN7z/m7tT16xwd802fwgMN0Wqd7AQYVkhpsjDUx/99oo+nGgvKF657XP5g==} 739 | engines: {node: '>=10'} 740 | hasBin: true 741 | dependencies: 742 | conventional-commits-filter: 2.0.7 743 | dateformat: 3.0.3 744 | handlebars: 4.7.7 745 | json-stringify-safe: 5.0.1 746 | lodash: 4.17.21 747 | meow: 8.1.2 748 | semver: 6.3.0 749 | split: 1.0.1 750 | through2: 4.0.2 751 | dev: true 752 | 753 | /conventional-changelog/3.1.24: 754 | resolution: {integrity: sha512-ed6k8PO00UVvhExYohroVPXcOJ/K1N0/drJHx/faTH37OIZthlecuLIRX/T6uOp682CAoVoFpu+sSEaeuH6Asg==} 755 | engines: {node: '>=10'} 756 | dependencies: 757 | conventional-changelog-angular: 5.0.13 758 | conventional-changelog-atom: 2.0.8 759 | conventional-changelog-codemirror: 2.0.8 760 | conventional-changelog-conventionalcommits: 4.6.1 761 | conventional-changelog-core: 4.2.4 762 | conventional-changelog-ember: 2.0.9 763 | conventional-changelog-eslint: 3.0.9 764 | conventional-changelog-express: 2.0.6 765 | conventional-changelog-jquery: 3.0.11 766 | conventional-changelog-jshint: 2.0.9 767 | conventional-changelog-preset-loader: 2.3.4 768 | dev: true 769 | 770 | /conventional-commits-filter/2.0.7: 771 | resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} 772 | engines: {node: '>=10'} 773 | dependencies: 774 | lodash.ismatch: 4.4.0 775 | modify-values: 1.0.1 776 | dev: true 777 | 778 | /conventional-commits-parser/3.2.3: 779 | resolution: {integrity: sha512-YyRDR7On9H07ICFpRm/igcdjIqebXbvf4Cff+Pf0BrBys1i1EOzx9iFXNlAbdrLAR8jf7bkUYkDAr8pEy0q4Pw==} 780 | engines: {node: '>=10'} 781 | hasBin: true 782 | dependencies: 783 | is-text-path: 1.0.1 784 | JSONStream: 1.3.5 785 | lodash: 4.17.21 786 | meow: 8.1.2 787 | split2: 3.2.2 788 | through2: 4.0.2 789 | dev: true 790 | 791 | /core-util-is/1.0.3: 792 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 793 | dev: true 794 | 795 | /crelt/1.0.5: 796 | resolution: {integrity: sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==} 797 | dev: true 798 | 799 | /cross-spawn/7.0.3: 800 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 801 | engines: {node: '>= 8'} 802 | dependencies: 803 | path-key: 3.1.1 804 | shebang-command: 2.0.0 805 | which: 2.0.2 806 | dev: true 807 | 808 | /csstype/2.6.18: 809 | resolution: {integrity: sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==} 810 | dev: true 811 | 812 | /dargs/7.0.0: 813 | resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} 814 | engines: {node: '>=8'} 815 | dev: true 816 | 817 | /dateformat/3.0.3: 818 | resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} 819 | dev: true 820 | 821 | /debug/4.3.3_supports-color@9.2.1: 822 | resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} 823 | engines: {node: '>=6.0'} 824 | peerDependencies: 825 | supports-color: '*' 826 | peerDependenciesMeta: 827 | supports-color: 828 | optional: true 829 | dependencies: 830 | ms: 2.1.2 831 | supports-color: 9.2.1 832 | dev: true 833 | 834 | /debug/4.3.4: 835 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 836 | engines: {node: '>=6.0'} 837 | peerDependencies: 838 | supports-color: '*' 839 | peerDependenciesMeta: 840 | supports-color: 841 | optional: true 842 | dependencies: 843 | ms: 2.1.2 844 | dev: true 845 | 846 | /decamelize-keys/1.1.0: 847 | resolution: {integrity: sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=} 848 | engines: {node: '>=0.10.0'} 849 | dependencies: 850 | decamelize: 1.2.0 851 | map-obj: 1.0.1 852 | dev: true 853 | 854 | /decamelize/1.2.0: 855 | resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} 856 | engines: {node: '>=0.10.0'} 857 | dev: true 858 | 859 | /dequal/2.0.2: 860 | resolution: {integrity: sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==} 861 | engines: {node: '>=6'} 862 | dev: true 863 | 864 | /diff/5.0.0: 865 | resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} 866 | engines: {node: '>=0.3.1'} 867 | dev: true 868 | 869 | /dot-prop/5.3.0: 870 | resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} 871 | engines: {node: '>=8'} 872 | dependencies: 873 | is-obj: 2.0.0 874 | dev: true 875 | 876 | /emoji-regex/8.0.0: 877 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 878 | dev: true 879 | 880 | /emoji-regex/9.2.2: 881 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 882 | dev: true 883 | 884 | /error-ex/1.3.2: 885 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 886 | dependencies: 887 | is-arrayish: 0.2.1 888 | dev: true 889 | 890 | /esbuild-android-64/0.14.38: 891 | resolution: {integrity: sha512-aRFxR3scRKkbmNuGAK+Gee3+yFxkTJO/cx83Dkyzo4CnQl/2zVSurtG6+G86EQIZ+w+VYngVyK7P3HyTBKu3nw==} 892 | engines: {node: '>=12'} 893 | cpu: [x64] 894 | os: [android] 895 | requiresBuild: true 896 | dev: true 897 | optional: true 898 | 899 | /esbuild-android-arm64/0.14.38: 900 | resolution: {integrity: sha512-L2NgQRWuHFI89IIZIlpAcINy9FvBk6xFVZ7xGdOwIm8VyhX1vNCEqUJO3DPSSy945Gzdg98cxtNt8Grv1CsyhA==} 901 | engines: {node: '>=12'} 902 | cpu: [arm64] 903 | os: [android] 904 | requiresBuild: true 905 | dev: true 906 | optional: true 907 | 908 | /esbuild-darwin-64/0.14.38: 909 | resolution: {integrity: sha512-5JJvgXkX87Pd1Og0u/NJuO7TSqAikAcQQ74gyJ87bqWRVeouky84ICoV4sN6VV53aTW+NE87qLdGY4QA2S7KNA==} 910 | engines: {node: '>=12'} 911 | cpu: [x64] 912 | os: [darwin] 913 | requiresBuild: true 914 | dev: true 915 | optional: true 916 | 917 | /esbuild-darwin-arm64/0.14.38: 918 | resolution: {integrity: sha512-eqF+OejMI3mC5Dlo9Kdq/Ilbki9sQBw3QlHW3wjLmsLh+quNfHmGMp3Ly1eWm981iGBMdbtSS9+LRvR2T8B3eQ==} 919 | engines: {node: '>=12'} 920 | cpu: [arm64] 921 | os: [darwin] 922 | requiresBuild: true 923 | dev: true 924 | optional: true 925 | 926 | /esbuild-freebsd-64/0.14.38: 927 | resolution: {integrity: sha512-epnPbhZUt93xV5cgeY36ZxPXDsQeO55DppzsIgWM8vgiG/Rz+qYDLmh5ts3e+Ln1wA9dQ+nZmVHw+RjaW3I5Ig==} 928 | engines: {node: '>=12'} 929 | cpu: [x64] 930 | os: [freebsd] 931 | requiresBuild: true 932 | dev: true 933 | optional: true 934 | 935 | /esbuild-freebsd-arm64/0.14.38: 936 | resolution: {integrity: sha512-/9icXUYJWherhk+y5fjPI5yNUdFPtXHQlwP7/K/zg8t8lQdHVj20SqU9/udQmeUo5pDFHMYzcEFfJqgOVeKNNQ==} 937 | engines: {node: '>=12'} 938 | cpu: [arm64] 939 | os: [freebsd] 940 | requiresBuild: true 941 | dev: true 942 | optional: true 943 | 944 | /esbuild-linux-32/0.14.38: 945 | resolution: {integrity: sha512-QfgfeNHRFvr2XeHFzP8kOZVnal3QvST3A0cgq32ZrHjSMFTdgXhMhmWdKzRXP/PKcfv3e2OW9tT9PpcjNvaq6g==} 946 | engines: {node: '>=12'} 947 | cpu: [ia32] 948 | os: [linux] 949 | requiresBuild: true 950 | dev: true 951 | optional: true 952 | 953 | /esbuild-linux-64/0.14.38: 954 | resolution: {integrity: sha512-uuZHNmqcs+Bj1qiW9k/HZU3FtIHmYiuxZ/6Aa+/KHb/pFKr7R3aVqvxlAudYI9Fw3St0VCPfv7QBpUITSmBR1Q==} 955 | engines: {node: '>=12'} 956 | cpu: [x64] 957 | os: [linux] 958 | requiresBuild: true 959 | dev: true 960 | optional: true 961 | 962 | /esbuild-linux-arm/0.14.38: 963 | resolution: {integrity: sha512-FiFvQe8J3VKTDXG01JbvoVRXQ0x6UZwyrU4IaLBZeq39Bsbatd94Fuc3F1RGqPF5RbIWW7RvkVQjn79ejzysnA==} 964 | engines: {node: '>=12'} 965 | cpu: [arm] 966 | os: [linux] 967 | requiresBuild: true 968 | dev: true 969 | optional: true 970 | 971 | /esbuild-linux-arm64/0.14.38: 972 | resolution: {integrity: sha512-HlMGZTEsBrXrivr64eZ/EO0NQM8H8DuSENRok9d+Jtvq8hOLzrxfsAT9U94K3KOGk2XgCmkaI2KD8hX7F97lvA==} 973 | engines: {node: '>=12'} 974 | cpu: [arm64] 975 | os: [linux] 976 | requiresBuild: true 977 | dev: true 978 | optional: true 979 | 980 | /esbuild-linux-mips64le/0.14.38: 981 | resolution: {integrity: sha512-qd1dLf2v7QBiI5wwfil9j0HG/5YMFBAmMVmdeokbNAMbcg49p25t6IlJFXAeLzogv1AvgaXRXvgFNhScYEUXGQ==} 982 | engines: {node: '>=12'} 983 | cpu: [mips64el] 984 | os: [linux] 985 | requiresBuild: true 986 | dev: true 987 | optional: true 988 | 989 | /esbuild-linux-ppc64le/0.14.38: 990 | resolution: {integrity: sha512-mnbEm7o69gTl60jSuK+nn+pRsRHGtDPfzhrqEUXyCl7CTOCLtWN2bhK8bgsdp6J/2NyS/wHBjs1x8aBWwP2X9Q==} 991 | engines: {node: '>=12'} 992 | cpu: [ppc64] 993 | os: [linux] 994 | requiresBuild: true 995 | dev: true 996 | optional: true 997 | 998 | /esbuild-linux-riscv64/0.14.38: 999 | resolution: {integrity: sha512-+p6YKYbuV72uikChRk14FSyNJZ4WfYkffj6Af0/Tw63/6TJX6TnIKE+6D3xtEc7DeDth1fjUOEqm+ApKFXbbVQ==} 1000 | engines: {node: '>=12'} 1001 | cpu: [riscv64] 1002 | os: [linux] 1003 | requiresBuild: true 1004 | dev: true 1005 | optional: true 1006 | 1007 | /esbuild-linux-s390x/0.14.38: 1008 | resolution: {integrity: sha512-0zUsiDkGJiMHxBQ7JDU8jbaanUY975CdOW1YDrurjrM0vWHfjv9tLQsW9GSyEb/heSK1L5gaweRjzfUVBFoybQ==} 1009 | engines: {node: '>=12'} 1010 | cpu: [s390x] 1011 | os: [linux] 1012 | requiresBuild: true 1013 | dev: true 1014 | optional: true 1015 | 1016 | /esbuild-netbsd-64/0.14.38: 1017 | resolution: {integrity: sha512-cljBAApVwkpnJZfnRVThpRBGzCi+a+V9Ofb1fVkKhtrPLDYlHLrSYGtmnoTVWDQdU516qYI8+wOgcGZ4XIZh0Q==} 1018 | engines: {node: '>=12'} 1019 | cpu: [x64] 1020 | os: [netbsd] 1021 | requiresBuild: true 1022 | dev: true 1023 | optional: true 1024 | 1025 | /esbuild-openbsd-64/0.14.38: 1026 | resolution: {integrity: sha512-CDswYr2PWPGEPpLDUO50mL3WO/07EMjnZDNKpmaxUPsrW+kVM3LoAqr/CE8UbzugpEiflYqJsGPLirThRB18IQ==} 1027 | engines: {node: '>=12'} 1028 | cpu: [x64] 1029 | os: [openbsd] 1030 | requiresBuild: true 1031 | dev: true 1032 | optional: true 1033 | 1034 | /esbuild-sunos-64/0.14.38: 1035 | resolution: {integrity: sha512-2mfIoYW58gKcC3bck0j7lD3RZkqYA7MmujFYmSn9l6TiIcAMpuEvqksO+ntBgbLep/eyjpgdplF7b+4T9VJGOA==} 1036 | engines: {node: '>=12'} 1037 | cpu: [x64] 1038 | os: [sunos] 1039 | requiresBuild: true 1040 | dev: true 1041 | optional: true 1042 | 1043 | /esbuild-windows-32/0.14.38: 1044 | resolution: {integrity: sha512-L2BmEeFZATAvU+FJzJiRLFUP+d9RHN+QXpgaOrs2klshoAm1AE6Us4X6fS9k33Uy5SzScn2TpcgecbqJza1Hjw==} 1045 | engines: {node: '>=12'} 1046 | cpu: [ia32] 1047 | os: [win32] 1048 | requiresBuild: true 1049 | dev: true 1050 | optional: true 1051 | 1052 | /esbuild-windows-64/0.14.38: 1053 | resolution: {integrity: sha512-Khy4wVmebnzue8aeSXLC+6clo/hRYeNIm0DyikoEqX+3w3rcvrhzpoix0S+MF9vzh6JFskkIGD7Zx47ODJNyCw==} 1054 | engines: {node: '>=12'} 1055 | cpu: [x64] 1056 | os: [win32] 1057 | requiresBuild: true 1058 | dev: true 1059 | optional: true 1060 | 1061 | /esbuild-windows-arm64/0.14.38: 1062 | resolution: {integrity: sha512-k3FGCNmHBkqdJXuJszdWciAH77PukEyDsdIryEHn9cKLQFxzhT39dSumeTuggaQcXY57UlmLGIkklWZo2qzHpw==} 1063 | engines: {node: '>=12'} 1064 | cpu: [arm64] 1065 | os: [win32] 1066 | requiresBuild: true 1067 | dev: true 1068 | optional: true 1069 | 1070 | /esbuild/0.14.38: 1071 | resolution: {integrity: sha512-12fzJ0fsm7gVZX1YQ1InkOE5f9Tl7cgf6JPYXRJtPIoE0zkWAbHdPHVPPaLi9tYAcEBqheGzqLn/3RdTOyBfcA==} 1072 | engines: {node: '>=12'} 1073 | hasBin: true 1074 | requiresBuild: true 1075 | optionalDependencies: 1076 | esbuild-android-64: 0.14.38 1077 | esbuild-android-arm64: 0.14.38 1078 | esbuild-darwin-64: 0.14.38 1079 | esbuild-darwin-arm64: 0.14.38 1080 | esbuild-freebsd-64: 0.14.38 1081 | esbuild-freebsd-arm64: 0.14.38 1082 | esbuild-linux-32: 0.14.38 1083 | esbuild-linux-64: 0.14.38 1084 | esbuild-linux-arm: 0.14.38 1085 | esbuild-linux-arm64: 0.14.38 1086 | esbuild-linux-mips64le: 0.14.38 1087 | esbuild-linux-ppc64le: 0.14.38 1088 | esbuild-linux-riscv64: 0.14.38 1089 | esbuild-linux-s390x: 0.14.38 1090 | esbuild-netbsd-64: 0.14.38 1091 | esbuild-openbsd-64: 0.14.38 1092 | esbuild-sunos-64: 0.14.38 1093 | esbuild-windows-32: 0.14.38 1094 | esbuild-windows-64: 0.14.38 1095 | esbuild-windows-arm64: 0.14.38 1096 | dev: true 1097 | 1098 | /escalade/3.1.1: 1099 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1100 | engines: {node: '>=6'} 1101 | dev: true 1102 | 1103 | /escape-string-regexp/1.0.5: 1104 | resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} 1105 | engines: {node: '>=0.8.0'} 1106 | dev: true 1107 | 1108 | /estree-walker/2.0.2: 1109 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1110 | dev: true 1111 | 1112 | /execa/5.1.1: 1113 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1114 | engines: {node: '>=10'} 1115 | dependencies: 1116 | cross-spawn: 7.0.3 1117 | get-stream: 6.0.1 1118 | human-signals: 2.1.0 1119 | is-stream: 2.0.1 1120 | merge-stream: 2.0.0 1121 | npm-run-path: 4.0.1 1122 | onetime: 5.1.2 1123 | signal-exit: 3.0.5 1124 | strip-final-newline: 2.0.0 1125 | dev: true 1126 | 1127 | /fast-glob/3.2.11: 1128 | resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} 1129 | engines: {node: '>=8.6.0'} 1130 | dependencies: 1131 | '@nodelib/fs.stat': 2.0.5 1132 | '@nodelib/fs.walk': 1.2.8 1133 | glob-parent: 5.1.2 1134 | merge2: 1.4.1 1135 | micromatch: 4.0.5 1136 | dev: true 1137 | 1138 | /fastq/1.13.0: 1139 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 1140 | dependencies: 1141 | reusify: 1.0.4 1142 | dev: true 1143 | 1144 | /fill-range/7.0.1: 1145 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1146 | engines: {node: '>=8'} 1147 | dependencies: 1148 | to-regex-range: 5.0.1 1149 | dev: true 1150 | 1151 | /find-up/2.1.0: 1152 | resolution: {integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c=} 1153 | engines: {node: '>=4'} 1154 | dependencies: 1155 | locate-path: 2.0.0 1156 | dev: true 1157 | 1158 | /find-up/4.1.0: 1159 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1160 | engines: {node: '>=8'} 1161 | dependencies: 1162 | locate-path: 5.0.0 1163 | path-exists: 4.0.0 1164 | dev: true 1165 | 1166 | /fsevents/2.3.2: 1167 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1168 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1169 | os: [darwin] 1170 | requiresBuild: true 1171 | dev: true 1172 | optional: true 1173 | 1174 | /function-bind/1.1.1: 1175 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1176 | dev: true 1177 | 1178 | /get-caller-file/2.0.5: 1179 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1180 | engines: {node: 6.* || 8.* || >= 10.*} 1181 | dev: true 1182 | 1183 | /get-pkg-repo/4.2.1: 1184 | resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} 1185 | engines: {node: '>=6.9.0'} 1186 | hasBin: true 1187 | dependencies: 1188 | '@hutson/parse-repository-url': 3.0.2 1189 | hosted-git-info: 4.0.2 1190 | through2: 2.0.5 1191 | yargs: 16.2.0 1192 | dev: true 1193 | 1194 | /get-stream/6.0.1: 1195 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1196 | engines: {node: '>=10'} 1197 | dev: true 1198 | 1199 | /git-raw-commits/2.0.10: 1200 | resolution: {integrity: sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==} 1201 | engines: {node: '>=10'} 1202 | hasBin: true 1203 | dependencies: 1204 | dargs: 7.0.0 1205 | lodash: 4.17.21 1206 | meow: 8.1.2 1207 | split2: 3.2.2 1208 | through2: 4.0.2 1209 | dev: true 1210 | 1211 | /git-remote-origin-url/2.0.0: 1212 | resolution: {integrity: sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=} 1213 | engines: {node: '>=4'} 1214 | dependencies: 1215 | gitconfiglocal: 1.0.0 1216 | pify: 2.3.0 1217 | dev: true 1218 | 1219 | /git-semver-tags/4.1.1: 1220 | resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} 1221 | engines: {node: '>=10'} 1222 | hasBin: true 1223 | dependencies: 1224 | meow: 8.1.2 1225 | semver: 6.3.0 1226 | dev: true 1227 | 1228 | /gitconfiglocal/1.0.0: 1229 | resolution: {integrity: sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=} 1230 | dependencies: 1231 | ini: 1.3.8 1232 | dev: true 1233 | 1234 | /glob-parent/5.1.2: 1235 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1236 | engines: {node: '>= 6'} 1237 | dependencies: 1238 | is-glob: 4.0.3 1239 | dev: true 1240 | 1241 | /graceful-fs/4.2.8: 1242 | resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} 1243 | dev: true 1244 | 1245 | /handlebars/4.7.7: 1246 | resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} 1247 | engines: {node: '>=0.4.7'} 1248 | hasBin: true 1249 | dependencies: 1250 | minimist: 1.2.5 1251 | neo-async: 2.6.2 1252 | source-map: 0.6.1 1253 | wordwrap: 1.0.0 1254 | optionalDependencies: 1255 | uglify-js: 3.14.5 1256 | dev: true 1257 | 1258 | /hard-rejection/2.1.0: 1259 | resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} 1260 | engines: {node: '>=6'} 1261 | dev: true 1262 | 1263 | /has-flag/3.0.0: 1264 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 1265 | engines: {node: '>=4'} 1266 | dev: true 1267 | 1268 | /has/1.0.3: 1269 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1270 | engines: {node: '>= 0.4.0'} 1271 | dependencies: 1272 | function-bind: 1.1.1 1273 | dev: true 1274 | 1275 | /hosted-git-info/2.8.9: 1276 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 1277 | dev: true 1278 | 1279 | /hosted-git-info/4.0.2: 1280 | resolution: {integrity: sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==} 1281 | engines: {node: '>=10'} 1282 | dependencies: 1283 | lru-cache: 6.0.0 1284 | dev: true 1285 | 1286 | /human-signals/2.1.0: 1287 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1288 | engines: {node: '>=10.17.0'} 1289 | dev: true 1290 | 1291 | /husky/8.0.1: 1292 | resolution: {integrity: sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==} 1293 | engines: {node: '>=14'} 1294 | hasBin: true 1295 | dev: true 1296 | 1297 | /indent-string/4.0.0: 1298 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 1299 | engines: {node: '>=8'} 1300 | dev: true 1301 | 1302 | /inherits/2.0.4: 1303 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1304 | dev: true 1305 | 1306 | /ini/1.3.8: 1307 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1308 | dev: true 1309 | 1310 | /is-arrayish/0.2.1: 1311 | resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} 1312 | dev: true 1313 | 1314 | /is-core-module/2.8.1: 1315 | resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} 1316 | dependencies: 1317 | has: 1.0.3 1318 | dev: true 1319 | 1320 | /is-extglob/2.1.1: 1321 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 1322 | engines: {node: '>=0.10.0'} 1323 | dev: true 1324 | 1325 | /is-fullwidth-code-point/3.0.0: 1326 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1327 | engines: {node: '>=8'} 1328 | dev: true 1329 | 1330 | /is-fullwidth-code-point/4.0.0: 1331 | resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} 1332 | engines: {node: '>=12'} 1333 | dev: true 1334 | 1335 | /is-glob/4.0.3: 1336 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1337 | engines: {node: '>=0.10.0'} 1338 | dependencies: 1339 | is-extglob: 2.1.1 1340 | dev: true 1341 | 1342 | /is-number/7.0.0: 1343 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1344 | engines: {node: '>=0.12.0'} 1345 | dev: true 1346 | 1347 | /is-obj/2.0.0: 1348 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} 1349 | engines: {node: '>=8'} 1350 | dev: true 1351 | 1352 | /is-plain-obj/1.1.0: 1353 | resolution: {integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4=} 1354 | engines: {node: '>=0.10.0'} 1355 | dev: true 1356 | 1357 | /is-stream/2.0.1: 1358 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1359 | engines: {node: '>=8'} 1360 | dev: true 1361 | 1362 | /is-text-path/1.0.1: 1363 | resolution: {integrity: sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=} 1364 | engines: {node: '>=0.10.0'} 1365 | dependencies: 1366 | text-extensions: 1.9.0 1367 | dev: true 1368 | 1369 | /isarray/1.0.0: 1370 | resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} 1371 | dev: true 1372 | 1373 | /isexe/2.0.0: 1374 | resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} 1375 | dev: true 1376 | 1377 | /jiti/1.13.0: 1378 | resolution: {integrity: sha512-/n9mNxZj/HDSrincJ6RP+L+yXbpnB8FybySBa+IjIaoH9FIxBbrbRT5XUbe8R7zuVM2AQqNMNDDqz0bzx3znOQ==} 1379 | hasBin: true 1380 | dev: true 1381 | 1382 | /js-tokens/4.0.0: 1383 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1384 | dev: true 1385 | 1386 | /json-parse-better-errors/1.0.2: 1387 | resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} 1388 | dev: true 1389 | 1390 | /json-parse-even-better-errors/2.3.1: 1391 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1392 | dev: true 1393 | 1394 | /json-stringify-safe/5.0.1: 1395 | resolution: {integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=} 1396 | dev: true 1397 | 1398 | /jsonparse/1.3.1: 1399 | resolution: {integrity: sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=} 1400 | engines: {'0': node >= 0.2.0} 1401 | dev: true 1402 | 1403 | /kind-of/6.0.3: 1404 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 1405 | engines: {node: '>=0.10.0'} 1406 | dev: true 1407 | 1408 | /kleur/3.0.3: 1409 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 1410 | engines: {node: '>=6'} 1411 | dev: true 1412 | 1413 | /kleur/4.1.4: 1414 | resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==} 1415 | engines: {node: '>=6'} 1416 | dev: true 1417 | 1418 | /kolorist/1.5.1: 1419 | resolution: {integrity: sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==} 1420 | dev: true 1421 | 1422 | /lilconfig/2.0.4: 1423 | resolution: {integrity: sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==} 1424 | engines: {node: '>=10'} 1425 | dev: true 1426 | 1427 | /lines-and-columns/1.1.6: 1428 | resolution: {integrity: sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=} 1429 | dev: true 1430 | 1431 | /lint-staged/12.4.1: 1432 | resolution: {integrity: sha512-PTXgzpflrQ+pODQTG116QNB+Q6uUTDg5B5HqGvNhoQSGt8Qy+MA/6zSnR8n38+sxP5TapzeQGTvoKni0KRS8Vg==} 1433 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1434 | hasBin: true 1435 | dependencies: 1436 | cli-truncate: 3.1.0 1437 | colorette: 2.0.16 1438 | commander: 8.3.0 1439 | debug: 4.3.3_supports-color@9.2.1 1440 | execa: 5.1.1 1441 | lilconfig: 2.0.4 1442 | listr2: 4.0.2 1443 | micromatch: 4.0.4 1444 | normalize-path: 3.0.0 1445 | object-inspect: 1.12.0 1446 | pidtree: 0.5.0 1447 | string-argv: 0.3.1 1448 | supports-color: 9.2.1 1449 | yaml: 1.10.2 1450 | transitivePeerDependencies: 1451 | - enquirer 1452 | dev: true 1453 | 1454 | /listr2/4.0.2: 1455 | resolution: {integrity: sha512-YcgwfCWpvPbj9FLUGqvdFvd3hrFWKpOeuXznRgfWEJ7RNr8b/IKKIKZABHx3aU+4CWN/iSAFFSReziQG6vTeIA==} 1456 | engines: {node: '>=12'} 1457 | peerDependencies: 1458 | enquirer: '>= 2.3.0 < 3' 1459 | peerDependenciesMeta: 1460 | enquirer: 1461 | optional: true 1462 | dependencies: 1463 | cli-truncate: 2.1.0 1464 | colorette: 2.0.16 1465 | log-update: 4.0.0 1466 | p-map: 4.0.0 1467 | rfdc: 1.3.0 1468 | rxjs: 7.5.2 1469 | through: 2.3.8 1470 | wrap-ansi: 7.0.0 1471 | dev: true 1472 | 1473 | /load-json-file/4.0.0: 1474 | resolution: {integrity: sha1-L19Fq5HjMhYjT9U62rZo607AmTs=} 1475 | engines: {node: '>=4'} 1476 | dependencies: 1477 | graceful-fs: 4.2.8 1478 | parse-json: 4.0.0 1479 | pify: 3.0.0 1480 | strip-bom: 3.0.0 1481 | dev: true 1482 | 1483 | /locate-path/2.0.0: 1484 | resolution: {integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=} 1485 | engines: {node: '>=4'} 1486 | dependencies: 1487 | p-locate: 2.0.0 1488 | path-exists: 3.0.0 1489 | dev: true 1490 | 1491 | /locate-path/5.0.0: 1492 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1493 | engines: {node: '>=8'} 1494 | dependencies: 1495 | p-locate: 4.1.0 1496 | dev: true 1497 | 1498 | /lodash.ismatch/4.4.0: 1499 | resolution: {integrity: sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=} 1500 | dev: true 1501 | 1502 | /lodash/4.17.21: 1503 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1504 | dev: true 1505 | 1506 | /log-update/4.0.0: 1507 | resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} 1508 | engines: {node: '>=10'} 1509 | dependencies: 1510 | ansi-escapes: 4.3.2 1511 | cli-cursor: 3.1.0 1512 | slice-ansi: 4.0.0 1513 | wrap-ansi: 6.2.0 1514 | dev: true 1515 | 1516 | /lru-cache/6.0.0: 1517 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1518 | engines: {node: '>=10'} 1519 | dependencies: 1520 | yallist: 4.0.0 1521 | dev: true 1522 | 1523 | /magic-string/0.25.7: 1524 | resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} 1525 | dependencies: 1526 | sourcemap-codec: 1.4.8 1527 | dev: true 1528 | 1529 | /magic-string/0.26.1: 1530 | resolution: {integrity: sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg==} 1531 | engines: {node: '>=12'} 1532 | dependencies: 1533 | sourcemap-codec: 1.4.8 1534 | dev: true 1535 | 1536 | /map-obj/1.0.1: 1537 | resolution: {integrity: sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=} 1538 | engines: {node: '>=0.10.0'} 1539 | dev: true 1540 | 1541 | /map-obj/4.3.0: 1542 | resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} 1543 | engines: {node: '>=8'} 1544 | dev: true 1545 | 1546 | /meow/8.1.2: 1547 | resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} 1548 | engines: {node: '>=10'} 1549 | dependencies: 1550 | '@types/minimist': 1.2.2 1551 | camelcase-keys: 6.2.2 1552 | decamelize-keys: 1.1.0 1553 | hard-rejection: 2.1.0 1554 | minimist-options: 4.1.0 1555 | normalize-package-data: 3.0.3 1556 | read-pkg-up: 7.0.1 1557 | redent: 3.0.0 1558 | trim-newlines: 3.0.1 1559 | type-fest: 0.18.1 1560 | yargs-parser: 20.2.9 1561 | dev: true 1562 | 1563 | /merge-stream/2.0.0: 1564 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1565 | dev: true 1566 | 1567 | /merge2/1.4.1: 1568 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1569 | engines: {node: '>= 8'} 1570 | dev: true 1571 | 1572 | /micromatch/4.0.4: 1573 | resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} 1574 | engines: {node: '>=8.6'} 1575 | dependencies: 1576 | braces: 3.0.2 1577 | picomatch: 2.3.0 1578 | dev: true 1579 | 1580 | /micromatch/4.0.5: 1581 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1582 | engines: {node: '>=8.6'} 1583 | dependencies: 1584 | braces: 3.0.2 1585 | picomatch: 2.3.1 1586 | dev: true 1587 | 1588 | /mimic-fn/2.1.0: 1589 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1590 | engines: {node: '>=6'} 1591 | dev: true 1592 | 1593 | /min-indent/1.0.1: 1594 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 1595 | engines: {node: '>=4'} 1596 | dev: true 1597 | 1598 | /minimist-options/4.1.0: 1599 | resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} 1600 | engines: {node: '>= 6'} 1601 | dependencies: 1602 | arrify: 1.0.1 1603 | is-plain-obj: 1.1.0 1604 | kind-of: 6.0.3 1605 | dev: true 1606 | 1607 | /minimist/1.2.5: 1608 | resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} 1609 | dev: true 1610 | 1611 | /modify-values/1.0.1: 1612 | resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} 1613 | engines: {node: '>=0.10.0'} 1614 | dev: true 1615 | 1616 | /mri/1.2.0: 1617 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1618 | engines: {node: '>=4'} 1619 | dev: true 1620 | 1621 | /ms/2.1.2: 1622 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1623 | dev: true 1624 | 1625 | /nanoid/3.3.4: 1626 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 1627 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1628 | hasBin: true 1629 | dev: true 1630 | 1631 | /neo-async/2.6.2: 1632 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 1633 | dev: true 1634 | 1635 | /normalize-package-data/2.5.0: 1636 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 1637 | dependencies: 1638 | hosted-git-info: 2.8.9 1639 | resolve: 1.22.0 1640 | semver: 5.7.1 1641 | validate-npm-package-license: 3.0.4 1642 | dev: true 1643 | 1644 | /normalize-package-data/3.0.3: 1645 | resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} 1646 | engines: {node: '>=10'} 1647 | dependencies: 1648 | hosted-git-info: 4.0.2 1649 | is-core-module: 2.8.1 1650 | semver: 7.3.7 1651 | validate-npm-package-license: 3.0.4 1652 | dev: true 1653 | 1654 | /normalize-path/3.0.0: 1655 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1656 | engines: {node: '>=0.10.0'} 1657 | dev: true 1658 | 1659 | /npm-run-path/4.0.1: 1660 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1661 | engines: {node: '>=8'} 1662 | dependencies: 1663 | path-key: 3.1.1 1664 | dev: true 1665 | 1666 | /object-inspect/1.12.0: 1667 | resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} 1668 | dev: true 1669 | 1670 | /onetime/5.1.2: 1671 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1672 | engines: {node: '>=6'} 1673 | dependencies: 1674 | mimic-fn: 2.1.0 1675 | dev: true 1676 | 1677 | /p-limit/1.3.0: 1678 | resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} 1679 | engines: {node: '>=4'} 1680 | dependencies: 1681 | p-try: 1.0.0 1682 | dev: true 1683 | 1684 | /p-limit/2.3.0: 1685 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1686 | engines: {node: '>=6'} 1687 | dependencies: 1688 | p-try: 2.2.0 1689 | dev: true 1690 | 1691 | /p-locate/2.0.0: 1692 | resolution: {integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=} 1693 | engines: {node: '>=4'} 1694 | dependencies: 1695 | p-limit: 1.3.0 1696 | dev: true 1697 | 1698 | /p-locate/4.1.0: 1699 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1700 | engines: {node: '>=8'} 1701 | dependencies: 1702 | p-limit: 2.3.0 1703 | dev: true 1704 | 1705 | /p-map/4.0.0: 1706 | resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} 1707 | engines: {node: '>=10'} 1708 | dependencies: 1709 | aggregate-error: 3.1.0 1710 | dev: true 1711 | 1712 | /p-try/1.0.0: 1713 | resolution: {integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=} 1714 | engines: {node: '>=4'} 1715 | dev: true 1716 | 1717 | /p-try/2.2.0: 1718 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1719 | engines: {node: '>=6'} 1720 | dev: true 1721 | 1722 | /parse-json/4.0.0: 1723 | resolution: {integrity: sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=} 1724 | engines: {node: '>=4'} 1725 | dependencies: 1726 | error-ex: 1.3.2 1727 | json-parse-better-errors: 1.0.2 1728 | dev: true 1729 | 1730 | /parse-json/5.2.0: 1731 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1732 | engines: {node: '>=8'} 1733 | dependencies: 1734 | '@babel/code-frame': 7.16.0 1735 | error-ex: 1.3.2 1736 | json-parse-even-better-errors: 2.3.1 1737 | lines-and-columns: 1.1.6 1738 | dev: true 1739 | 1740 | /path-exists/3.0.0: 1741 | resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} 1742 | engines: {node: '>=4'} 1743 | dev: true 1744 | 1745 | /path-exists/4.0.0: 1746 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1747 | engines: {node: '>=8'} 1748 | dev: true 1749 | 1750 | /path-key/3.1.1: 1751 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1752 | engines: {node: '>=8'} 1753 | dev: true 1754 | 1755 | /path-parse/1.0.7: 1756 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1757 | dev: true 1758 | 1759 | /path-type/3.0.0: 1760 | resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} 1761 | engines: {node: '>=4'} 1762 | dependencies: 1763 | pify: 3.0.0 1764 | dev: true 1765 | 1766 | /picocolors/1.0.0: 1767 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1768 | dev: true 1769 | 1770 | /picomatch/2.3.0: 1771 | resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} 1772 | engines: {node: '>=8.6'} 1773 | dev: true 1774 | 1775 | /picomatch/2.3.1: 1776 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1777 | engines: {node: '>=8.6'} 1778 | dev: true 1779 | 1780 | /pidtree/0.5.0: 1781 | resolution: {integrity: sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==} 1782 | engines: {node: '>=0.10'} 1783 | hasBin: true 1784 | dev: true 1785 | 1786 | /pify/2.3.0: 1787 | resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=} 1788 | engines: {node: '>=0.10.0'} 1789 | dev: true 1790 | 1791 | /pify/3.0.0: 1792 | resolution: {integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=} 1793 | engines: {node: '>=4'} 1794 | dev: true 1795 | 1796 | /playwright-chromium/1.22.2: 1797 | resolution: {integrity: sha512-msRcdCIJkdM2R6S+NMJZ02uyZHzJ7TIzkjzs3usDJ1Pwacp9HMhv9T/S4AxtpFXFmvMZq7UJYb0x+tCdHx9+0w==} 1798 | engines: {node: '>=14'} 1799 | hasBin: true 1800 | requiresBuild: true 1801 | dependencies: 1802 | playwright-core: 1.22.2 1803 | dev: true 1804 | 1805 | /playwright-core/1.22.2: 1806 | resolution: {integrity: sha512-w/hc/Ld0RM4pmsNeE6aL/fPNWw8BWit2tg+TfqJ3+p59c6s3B6C8mXvXrIPmfQEobkcFDc+4KirNzOQ+uBSP1Q==} 1807 | engines: {node: '>=14'} 1808 | hasBin: true 1809 | dev: true 1810 | 1811 | /postcss/8.4.13: 1812 | resolution: {integrity: sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA==} 1813 | engines: {node: ^10 || ^12 || >=14} 1814 | dependencies: 1815 | nanoid: 3.3.4 1816 | picocolors: 1.0.0 1817 | source-map-js: 1.0.2 1818 | dev: true 1819 | 1820 | /prettier/2.6.2: 1821 | resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==} 1822 | engines: {node: '>=10.13.0'} 1823 | hasBin: true 1824 | dev: true 1825 | 1826 | /process-nextick-args/2.0.1: 1827 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1828 | dev: true 1829 | 1830 | /prompts/2.4.2: 1831 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1832 | engines: {node: '>= 6'} 1833 | dependencies: 1834 | kleur: 3.0.3 1835 | sisteransi: 1.0.5 1836 | dev: true 1837 | 1838 | /q/1.5.1: 1839 | resolution: {integrity: sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=} 1840 | engines: {node: '>=0.6.0', teleport: '>=0.2.0'} 1841 | dev: true 1842 | 1843 | /queue-microtask/1.2.3: 1844 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1845 | dev: true 1846 | 1847 | /quick-lru/4.0.1: 1848 | resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} 1849 | engines: {node: '>=8'} 1850 | dev: true 1851 | 1852 | /read-pkg-up/3.0.0: 1853 | resolution: {integrity: sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=} 1854 | engines: {node: '>=4'} 1855 | dependencies: 1856 | find-up: 2.1.0 1857 | read-pkg: 3.0.0 1858 | dev: true 1859 | 1860 | /read-pkg-up/7.0.1: 1861 | resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} 1862 | engines: {node: '>=8'} 1863 | dependencies: 1864 | find-up: 4.1.0 1865 | read-pkg: 5.2.0 1866 | type-fest: 0.8.1 1867 | dev: true 1868 | 1869 | /read-pkg/3.0.0: 1870 | resolution: {integrity: sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=} 1871 | engines: {node: '>=4'} 1872 | dependencies: 1873 | load-json-file: 4.0.0 1874 | normalize-package-data: 2.5.0 1875 | path-type: 3.0.0 1876 | dev: true 1877 | 1878 | /read-pkg/5.2.0: 1879 | resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} 1880 | engines: {node: '>=8'} 1881 | dependencies: 1882 | '@types/normalize-package-data': 2.4.1 1883 | normalize-package-data: 2.5.0 1884 | parse-json: 5.2.0 1885 | type-fest: 0.6.0 1886 | dev: true 1887 | 1888 | /readable-stream/2.3.7: 1889 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 1890 | dependencies: 1891 | core-util-is: 1.0.3 1892 | inherits: 2.0.4 1893 | isarray: 1.0.0 1894 | process-nextick-args: 2.0.1 1895 | safe-buffer: 5.1.2 1896 | string_decoder: 1.1.1 1897 | util-deprecate: 1.0.2 1898 | dev: true 1899 | 1900 | /readable-stream/3.6.0: 1901 | resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} 1902 | engines: {node: '>= 6'} 1903 | dependencies: 1904 | inherits: 2.0.4 1905 | string_decoder: 1.3.0 1906 | util-deprecate: 1.0.2 1907 | dev: true 1908 | 1909 | /redent/3.0.0: 1910 | resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 1911 | engines: {node: '>=8'} 1912 | dependencies: 1913 | indent-string: 4.0.0 1914 | strip-indent: 3.0.0 1915 | dev: true 1916 | 1917 | /require-directory/2.1.1: 1918 | resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} 1919 | engines: {node: '>=0.10.0'} 1920 | dev: true 1921 | 1922 | /resolve/1.22.0: 1923 | resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} 1924 | hasBin: true 1925 | dependencies: 1926 | is-core-module: 2.8.1 1927 | path-parse: 1.0.7 1928 | supports-preserve-symlinks-flag: 1.0.0 1929 | dev: true 1930 | 1931 | /restore-cursor/3.1.0: 1932 | resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} 1933 | engines: {node: '>=8'} 1934 | dependencies: 1935 | onetime: 5.1.2 1936 | signal-exit: 3.0.5 1937 | dev: true 1938 | 1939 | /reusify/1.0.4: 1940 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1941 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1942 | dev: true 1943 | 1944 | /rfdc/1.3.0: 1945 | resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} 1946 | dev: true 1947 | 1948 | /rollup/2.60.0: 1949 | resolution: {integrity: sha512-cHdv9GWd58v58rdseC8e8XIaPUo8a9cgZpnCMMDGZFDZKEODOiPPEQFXLriWr/TjXzhPPmG5bkAztPsOARIcGQ==} 1950 | engines: {node: '>=10.0.0'} 1951 | hasBin: true 1952 | optionalDependencies: 1953 | fsevents: 2.3.2 1954 | dev: true 1955 | 1956 | /run-parallel/1.2.0: 1957 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1958 | dependencies: 1959 | queue-microtask: 1.2.3 1960 | dev: true 1961 | 1962 | /rxjs/7.5.2: 1963 | resolution: {integrity: sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w==} 1964 | dependencies: 1965 | tslib: 2.1.0 1966 | dev: true 1967 | 1968 | /sade/1.7.4: 1969 | resolution: {integrity: sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==} 1970 | engines: {node: '>= 6'} 1971 | dependencies: 1972 | mri: 1.2.0 1973 | dev: true 1974 | 1975 | /safe-buffer/5.1.2: 1976 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1977 | dev: true 1978 | 1979 | /safe-buffer/5.2.1: 1980 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1981 | dev: true 1982 | 1983 | /semver/5.7.1: 1984 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1985 | hasBin: true 1986 | dev: true 1987 | 1988 | /semver/6.3.0: 1989 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 1990 | hasBin: true 1991 | dev: true 1992 | 1993 | /semver/7.3.7: 1994 | resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} 1995 | engines: {node: '>=10'} 1996 | hasBin: true 1997 | dependencies: 1998 | lru-cache: 6.0.0 1999 | dev: true 2000 | 2001 | /shebang-command/2.0.0: 2002 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2003 | engines: {node: '>=8'} 2004 | dependencies: 2005 | shebang-regex: 3.0.0 2006 | dev: true 2007 | 2008 | /shebang-regex/3.0.0: 2009 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2010 | engines: {node: '>=8'} 2011 | dev: true 2012 | 2013 | /signal-exit/3.0.5: 2014 | resolution: {integrity: sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==} 2015 | dev: true 2016 | 2017 | /sisteransi/1.0.5: 2018 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 2019 | dev: true 2020 | 2021 | /slice-ansi/3.0.0: 2022 | resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} 2023 | engines: {node: '>=8'} 2024 | dependencies: 2025 | ansi-styles: 4.3.0 2026 | astral-regex: 2.0.0 2027 | is-fullwidth-code-point: 3.0.0 2028 | dev: true 2029 | 2030 | /slice-ansi/4.0.0: 2031 | resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} 2032 | engines: {node: '>=10'} 2033 | dependencies: 2034 | ansi-styles: 4.3.0 2035 | astral-regex: 2.0.0 2036 | is-fullwidth-code-point: 3.0.0 2037 | dev: true 2038 | 2039 | /slice-ansi/5.0.0: 2040 | resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} 2041 | engines: {node: '>=12'} 2042 | dependencies: 2043 | ansi-styles: 6.1.0 2044 | is-fullwidth-code-point: 4.0.0 2045 | dev: true 2046 | 2047 | /source-map-js/1.0.2: 2048 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2049 | engines: {node: '>=0.10.0'} 2050 | dev: true 2051 | 2052 | /source-map/0.6.1: 2053 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2054 | engines: {node: '>=0.10.0'} 2055 | dev: true 2056 | 2057 | /sourcemap-codec/1.4.8: 2058 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 2059 | dev: true 2060 | 2061 | /spdx-correct/3.1.1: 2062 | resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} 2063 | dependencies: 2064 | spdx-expression-parse: 3.0.1 2065 | spdx-license-ids: 3.0.11 2066 | dev: true 2067 | 2068 | /spdx-exceptions/2.3.0: 2069 | resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} 2070 | dev: true 2071 | 2072 | /spdx-expression-parse/3.0.1: 2073 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 2074 | dependencies: 2075 | spdx-exceptions: 2.3.0 2076 | spdx-license-ids: 3.0.11 2077 | dev: true 2078 | 2079 | /spdx-license-ids/3.0.11: 2080 | resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} 2081 | dev: true 2082 | 2083 | /split/1.0.1: 2084 | resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} 2085 | dependencies: 2086 | through: 2.3.8 2087 | dev: true 2088 | 2089 | /split2/3.2.2: 2090 | resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} 2091 | dependencies: 2092 | readable-stream: 3.6.0 2093 | dev: true 2094 | 2095 | /string-argv/0.3.1: 2096 | resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} 2097 | engines: {node: '>=0.6.19'} 2098 | dev: true 2099 | 2100 | /string-width/4.2.3: 2101 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2102 | engines: {node: '>=8'} 2103 | dependencies: 2104 | emoji-regex: 8.0.0 2105 | is-fullwidth-code-point: 3.0.0 2106 | strip-ansi: 6.0.1 2107 | dev: true 2108 | 2109 | /string-width/5.0.1: 2110 | resolution: {integrity: sha512-5ohWO/M4//8lErlUUtrFy3b11GtNOuMOU0ysKCDXFcfXuuvUXu95akgj/i8ofmaGdN0hCqyl6uu9i8dS/mQp5g==} 2111 | engines: {node: '>=12'} 2112 | dependencies: 2113 | emoji-regex: 9.2.2 2114 | is-fullwidth-code-point: 4.0.0 2115 | strip-ansi: 7.0.1 2116 | dev: true 2117 | 2118 | /string_decoder/1.1.1: 2119 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 2120 | dependencies: 2121 | safe-buffer: 5.1.2 2122 | dev: true 2123 | 2124 | /string_decoder/1.3.0: 2125 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 2126 | dependencies: 2127 | safe-buffer: 5.2.1 2128 | dev: true 2129 | 2130 | /strip-ansi/6.0.1: 2131 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2132 | engines: {node: '>=8'} 2133 | dependencies: 2134 | ansi-regex: 5.0.1 2135 | dev: true 2136 | 2137 | /strip-ansi/7.0.1: 2138 | resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} 2139 | engines: {node: '>=12'} 2140 | dependencies: 2141 | ansi-regex: 6.0.1 2142 | dev: true 2143 | 2144 | /strip-bom/3.0.0: 2145 | resolution: {integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=} 2146 | engines: {node: '>=4'} 2147 | dev: true 2148 | 2149 | /strip-final-newline/2.0.0: 2150 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 2151 | engines: {node: '>=6'} 2152 | dev: true 2153 | 2154 | /strip-indent/3.0.0: 2155 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 2156 | engines: {node: '>=8'} 2157 | dependencies: 2158 | min-indent: 1.0.1 2159 | dev: true 2160 | 2161 | /style-mod/4.0.0: 2162 | resolution: {integrity: sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==} 2163 | dev: true 2164 | 2165 | /supports-color/5.5.0: 2166 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2167 | engines: {node: '>=4'} 2168 | dependencies: 2169 | has-flag: 3.0.0 2170 | dev: true 2171 | 2172 | /supports-color/9.2.1: 2173 | resolution: {integrity: sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ==} 2174 | engines: {node: '>=12'} 2175 | dev: true 2176 | 2177 | /supports-preserve-symlinks-flag/1.0.0: 2178 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2179 | engines: {node: '>= 0.4'} 2180 | dev: true 2181 | 2182 | /temp-dir/2.0.0: 2183 | resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} 2184 | engines: {node: '>=8'} 2185 | dev: true 2186 | 2187 | /tempfile/3.0.0: 2188 | resolution: {integrity: sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==} 2189 | engines: {node: '>=8'} 2190 | dependencies: 2191 | temp-dir: 2.0.0 2192 | uuid: 3.4.0 2193 | dev: true 2194 | 2195 | /text-extensions/1.9.0: 2196 | resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} 2197 | engines: {node: '>=0.10'} 2198 | dev: true 2199 | 2200 | /through/2.3.8: 2201 | resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} 2202 | dev: true 2203 | 2204 | /through2/2.0.5: 2205 | resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} 2206 | dependencies: 2207 | readable-stream: 2.3.7 2208 | xtend: 4.0.2 2209 | dev: true 2210 | 2211 | /through2/4.0.2: 2212 | resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} 2213 | dependencies: 2214 | readable-stream: 3.6.0 2215 | dev: true 2216 | 2217 | /to-fast-properties/2.0.0: 2218 | resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} 2219 | engines: {node: '>=4'} 2220 | dev: true 2221 | 2222 | /to-regex-range/5.0.1: 2223 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2224 | engines: {node: '>=8.0'} 2225 | dependencies: 2226 | is-number: 7.0.0 2227 | dev: true 2228 | 2229 | /trim-newlines/3.0.1: 2230 | resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} 2231 | engines: {node: '>=8'} 2232 | dev: true 2233 | 2234 | /tslib/2.1.0: 2235 | resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} 2236 | dev: true 2237 | 2238 | /type-fest/0.18.1: 2239 | resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} 2240 | engines: {node: '>=10'} 2241 | dev: true 2242 | 2243 | /type-fest/0.21.3: 2244 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 2245 | engines: {node: '>=10'} 2246 | dev: true 2247 | 2248 | /type-fest/0.6.0: 2249 | resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} 2250 | engines: {node: '>=8'} 2251 | dev: true 2252 | 2253 | /type-fest/0.8.1: 2254 | resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} 2255 | engines: {node: '>=8'} 2256 | dev: true 2257 | 2258 | /uglify-js/3.14.5: 2259 | resolution: {integrity: sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==} 2260 | engines: {node: '>=0.8.0'} 2261 | hasBin: true 2262 | requiresBuild: true 2263 | dev: true 2264 | optional: true 2265 | 2266 | /util-deprecate/1.0.2: 2267 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 2268 | dev: true 2269 | 2270 | /uuid/3.4.0: 2271 | resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} 2272 | deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. 2273 | hasBin: true 2274 | dev: true 2275 | 2276 | /uvu/0.5.3: 2277 | resolution: {integrity: sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw==} 2278 | engines: {node: '>=8'} 2279 | hasBin: true 2280 | dependencies: 2281 | dequal: 2.0.2 2282 | diff: 5.0.0 2283 | kleur: 4.1.4 2284 | sade: 1.7.4 2285 | dev: true 2286 | 2287 | /validate-npm-package-license/3.0.4: 2288 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 2289 | dependencies: 2290 | spdx-correct: 3.1.1 2291 | spdx-expression-parse: 3.0.1 2292 | dev: true 2293 | 2294 | /vite-plugin-windicss/1.8.4_vite@2.9.9: 2295 | resolution: {integrity: sha512-LSZAO8BZn3x406GRbYX5t5ONXXJVdqiQtN1qrznLA/Dy5/NzZVhfcrL6N1qEYYO7HsCDT4pLAjTzObvDnM9Y8A==} 2296 | peerDependencies: 2297 | vite: ^2.0.1 2298 | dependencies: 2299 | '@windicss/plugin-utils': 1.8.4 2300 | debug: 4.3.4 2301 | kolorist: 1.5.1 2302 | vite: 2.9.9 2303 | windicss: 3.5.4 2304 | transitivePeerDependencies: 2305 | - supports-color 2306 | dev: true 2307 | 2308 | /vite/2.9.9: 2309 | resolution: {integrity: sha512-ffaam+NgHfbEmfw/Vuh6BHKKlI/XIAhxE5QSS7gFLIngxg171mg1P3a4LSRME0z2ZU1ScxoKzphkipcYwSD5Ew==} 2310 | engines: {node: '>=12.2.0'} 2311 | hasBin: true 2312 | peerDependencies: 2313 | less: '*' 2314 | sass: '*' 2315 | stylus: '*' 2316 | peerDependenciesMeta: 2317 | less: 2318 | optional: true 2319 | sass: 2320 | optional: true 2321 | stylus: 2322 | optional: true 2323 | dependencies: 2324 | esbuild: 0.14.38 2325 | postcss: 8.4.13 2326 | resolve: 1.22.0 2327 | rollup: 2.60.0 2328 | optionalDependencies: 2329 | fsevents: 2.3.2 2330 | dev: true 2331 | 2332 | /vue/3.2.36: 2333 | resolution: {integrity: sha512-5yTXmrE6gW8IQgttzHW5bfBiFA6mx35ZXHjGLDmKYzW6MMmYvCwuKybANRepwkMYeXw2v1buGg3/lPICY5YlZw==} 2334 | dependencies: 2335 | '@vue/compiler-dom': 3.2.36 2336 | '@vue/compiler-sfc': 3.2.36 2337 | '@vue/runtime-dom': 3.2.36 2338 | '@vue/server-renderer': 3.2.36_vue@3.2.36 2339 | '@vue/shared': 3.2.36 2340 | dev: true 2341 | 2342 | /w3c-keyname/2.2.4: 2343 | resolution: {integrity: sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==} 2344 | dev: true 2345 | 2346 | /which/2.0.2: 2347 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2348 | engines: {node: '>= 8'} 2349 | hasBin: true 2350 | dependencies: 2351 | isexe: 2.0.0 2352 | dev: true 2353 | 2354 | /windicss/3.5.4: 2355 | resolution: {integrity: sha512-x2Iu0a69dtNiKHMkR886lx0WKbZI5GqvXyvGBCJ2VA6rcjKYjnzCA/Ljd6hNQBfqlkSum8J+qAVcCfLzQFI4rQ==} 2356 | engines: {node: '>= 12'} 2357 | hasBin: true 2358 | dev: true 2359 | 2360 | /wordwrap/1.0.0: 2361 | resolution: {integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=} 2362 | dev: true 2363 | 2364 | /wrap-ansi/6.2.0: 2365 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 2366 | engines: {node: '>=8'} 2367 | dependencies: 2368 | ansi-styles: 4.3.0 2369 | string-width: 4.2.3 2370 | strip-ansi: 6.0.1 2371 | dev: true 2372 | 2373 | /wrap-ansi/7.0.0: 2374 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2375 | engines: {node: '>=10'} 2376 | dependencies: 2377 | ansi-styles: 4.3.0 2378 | string-width: 4.2.3 2379 | strip-ansi: 6.0.1 2380 | dev: true 2381 | 2382 | /xtend/4.0.2: 2383 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 2384 | engines: {node: '>=0.4'} 2385 | dev: true 2386 | 2387 | /y18n/5.0.8: 2388 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 2389 | engines: {node: '>=10'} 2390 | dev: true 2391 | 2392 | /yallist/4.0.0: 2393 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2394 | dev: true 2395 | 2396 | /yaml/1.10.2: 2397 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 2398 | engines: {node: '>= 6'} 2399 | dev: true 2400 | 2401 | /yargs-parser/20.2.9: 2402 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 2403 | engines: {node: '>=10'} 2404 | dev: true 2405 | 2406 | /yargs/16.2.0: 2407 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 2408 | engines: {node: '>=10'} 2409 | dependencies: 2410 | cliui: 7.0.4 2411 | escalade: 3.1.1 2412 | get-caller-file: 2.0.5 2413 | require-directory: 2.1.1 2414 | string-width: 4.2.3 2415 | y18n: 5.0.8 2416 | yargs-parser: 20.2.9 2417 | dev: true 2418 | --------------------------------------------------------------------------------