diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 3ab845f2d..000000000 --- a/.babelrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "env": { - "test": { - "presets": [ - "@babel/preset-env" - ] - } - } -} diff --git a/.editorconfig b/.editorconfig index 6537ca467..75084693c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,9 +7,27 @@ insert_final_newline = true indent_style = space indent_size = 4 trim_trailing_whitespace = true +max_line_length = 3000 +block_comment_start = /* +block_comment = * +block_comment_end = */ + +[{*.php,*.js,*.scss}] +max_line_length = 120 + +[*.blade.php] +max_line_length = 3000 [*.md] trim_trailing_whitespace = false -[*.{yml,yaml}] -indent_size = 2 +# Generated files +[yarn.lock] +indent_size = unset +max_line_length = unset +[public/build/**] +indent_size = unset +insert_final_newline = unset +max_line_length = unset +[.vscode/*.json] +indent_size = unset diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 860dcecb8..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,37 +0,0 @@ -module.exports = { - plugins: [ - "vue" - ], - extends: [ - "plugin:vue/base", - "plugin:vue/essential", - "plugin:vue/strongly-recommended", - "plugin:vue/recommended" - ], - "rules": { - "vue/html-indent": ["error", 4, { - "attribute": 1, - "baseIndent": 1, - "closeBracket": 0, - "alignAttributesVertically": true, - "ignores": [] - }], - "vue/html-self-closing": ["error", { - "html": { - "void": "any", - "normal": "any", - "component": "any" - }, - "svg": "any", - "math": "any" - }], - "vue/max-attributes-per-line": ["error", { - "singleline": { - "max": 5 - }, - "multiline": { - "max": 5 - } - }] - } -} diff --git a/.gitattributes b/.gitattributes index 2c01b56e1..1b44d6dc0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,6 +5,7 @@ /.github export-ignore /.gitignore export-ignore /.vscode export-ignore +/.stylelintrc.json export-ignore /.typos.toml export-ignore /composer.lock export-ignore linguist-generated /jest.config.js export-ignore diff --git a/.github/ISSUE_TEMPLATE/1_Bug_report.md b/.github/ISSUE_TEMPLATE/1_Bug_report.md index 4aba715ad..21d50836d 100644 --- a/.github/ISSUE_TEMPLATE/1_Bug_report.md +++ b/.github/ISSUE_TEMPLATE/1_Bug_report.md @@ -1,13 +1,38 @@ --- -name: Bug report -about: Create a report to help us improve ---- - -- Root Version: #.#.# -- Laravel Version: #.#.# -- PHP Version: #.#.# -- Database Driver & Version: # - -### Description: - -### Steps To Reproduce: +name: "Bug report" +description: "Create a report to help us improve" +body: +- + type: "input" + attributes: + label: "Root version" + placeholder: "#.#.#" + validations: + required: true +- + type: "input" + attributes: + label: "Laravel version" + placeholder: "#.#.#" +- + type: "input" + attributes: + label: "PHP version" + placeholder: "#.#.#" +- + type: "input" + attributes: + label: "Database engine & version" + placeholder: "#.#" +- + type: "markdown" + attributes: + label: "Description" + validations: + required: true +- + type: "markdown" + attributes: + label: "Steps To Reproduce" + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/2_Feature_request.md b/.github/ISSUE_TEMPLATE/2_Feature_request.md index 4c9fe7658..e04c35cbd 100644 --- a/.github/ISSUE_TEMPLATE/2_Feature_request.md +++ b/.github/ISSUE_TEMPLATE/2_Feature_request.md @@ -1,20 +1,49 @@ --- -name: Feature request -about: Suggest an idea for root ---- - -- Root version: #.#.# -- Laravel version: #.#.# -- PHP version: #.#.# -- Database engine & version: #.# - -### Is your feature request related to a problem? Please describe - - -### Describe the solution you'd like - - -### Why do you think this feature is something we should consider for Root? - - -### Additional context +name: "Feature request" +description: "Suggest an idea for root" +body: +- + type: "input" + attributes: + label: "Root version" + placeholder: "#.#.#" + validations: + required: true +- + type: "input" + attributes: + label: "Laravel version" + placeholder: "#.#.#" +- + type: "input" + attributes: + label: "PHP version" + placeholder: "#.#.#" +- + type: "input" + attributes: + label: "Database engine & version" + placeholder: "#.#" +- + type: "markdown" + attributes: + label: "Is your feature request related to a problem?" + description: "Please describe" + validations: + required: true +- + type: "markdown" + attributes: + label: "Describe the solution you'd like" + validations: + required: true +- + type: "markdown" + attributes: + label: "Why do you think this feature is something we should consider for Root?" + validations: + required: true +- + type: "markdown" + attributes: + label: "Additional context" diff --git a/.github/root-logo-dark.svg b/.github/root-logo-dark.svg index e61e9735d..51155ec69 100644 --- a/.github/root-logo-dark.svg +++ b/.github/root-logo-dark.svg @@ -1,6 +1,6 @@ - + @@ -43,10 +43,30 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/root-logo-light.svg b/.github/root-logo-light.svg index 4db939400..18321b271 100644 --- a/.github/root-logo-light.svg +++ b/.github/root-logo-light.svg @@ -1,6 +1,6 @@ - + @@ -43,10 +43,30 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/workflows/back-end.yml b/.github/workflows/back-end.yml index 7383907d5..320dbd920 100644 --- a/.github/workflows/back-end.yml +++ b/.github/workflows/back-end.yml @@ -1,59 +1,264 @@ -name: Back-end +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow + +name: "Back-end" on: - push: - branches: - - master - pull_request: null + pull_request: null + push: + branches: + - "master" +# Add [skip ci] to commit message to skip CI. + +permissions: + contents: "read" + +concurrency: + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true jobs: - unit_tests: - - strategy: - fail-fast: true - matrix: - os: ["ubuntu-22.04"] - php: ["8.1", "8.2"] - laravel: ["^10.0"] - dependency-version: ["highest"] - - name: "Unit - PHP ${{ matrix.php }} - L ${{ matrix.laravel }} - ${{ matrix.dependency-version }}" - - runs-on: "${{ matrix.os }}" - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php }} - extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, fileinfo, exif - tools: composer:v2 - coverage: xdebug3 - - - name: Check Composer configuration - run: composer validate --strict - - - name: Install dependencies - if: ${{ matrix.dependency-version == 'highest' }} - run: composer update --no-interaction --no-progress --prefer-dist --with="laravel/framework:${{ matrix.laravel }}" - - - name: Install locked dependencies - if: ${{ matrix.dependency-version == 'locked' }} - run: composer install --prefer-dist --no-interaction --no-progress - - - name: Check for PSR-4 mapping errors - run: composer dump-autoload --optimize --strict-psr - - - name: Execute tests - run: composer exec -- phpunit - - - name: Send coverage to Coveralls - if: ${{ matrix.os == 'ubuntu-22.04' && matrix.php == '8.1' && matrix.laravel == '^10.0' }} - env: - COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - wget "https://github.com/php-coveralls/php-coveralls/releases/download/v2.5.2/php-coveralls.phar" - php ./php-coveralls.phar -v + byte_level: + name: "0️⃣ Byte-level" + runs-on: "ubuntu-22.04" + timeout-minutes: 1 + steps: + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Check file permissions" + run: | + test "$(find ./ -type f -not -path './.git/*' -executable)" = "" + - + name: "Check for byte order mark (BOM)" + run: | + ! git grep --perl-regexp -I -e '^\xEF\xBB\xBF' + - + # https://html.spec.whatwg.org/multipage/named-characters.html + name: "Find non-printable ASCII characters" + run: | + ! LC_ALL=C.UTF-8 git grep --perl-regexp --line-number -e '[^ -~]' -- '*.php' + + syntax_errors: + name: "1️⃣ Syntax errors" + runs-on: "ubuntu-22.04" + timeout-minutes: 5 + steps: + - + name: "Set up PHP" + uses: "shivammathur/setup-php@v2" + with: + php-version: "8.1" + extensions: "dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, fileinfo, exif" + coverage: "none" + tools: "parallel-lint" + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Search for conflict markers 🐌" + run: | + ! git grep --line-number -e '^\(<<<<<<<\s\|=======\s\|=======$\|>>>>>>>\s\||||||||\s\)' + - + name: "Search for invalid complex curly syntax 🐌" + run: | + ! git grep -e '\${[A-Z_a-z]' -- '*.php' '*.scss' + - + name: "Check source code for syntax errors" + run: "composer exec --no-interaction -- parallel-lint src/" + # @TODO Check template files for syntax errors + + unit_tests: + name: "2️⃣ Unit and functional tests" + needs: + - "byte_level" + - "syntax_errors" + strategy: + fail-fast: false + matrix: + php-version: + - "8.1" + - "8.2" + dependencies: + - "lowest" + - "locked" + - "highest" + runs-on: "ubuntu-22.04" + timeout-minutes: 5 + steps: + - + name: "Set up PHP" + uses: "shivammathur/setup-php@v2" + with: + php-version: "${{ matrix.php-version }}" + extensions: "dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, fileinfo, exif" + - + name: "Setup problem matcher for PHPUnit" + run: | + echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Install dependencies" + uses: "ramsey/composer-install@v2" + with: + dependency-versions: "${{ matrix.dependencies }}" + - + name: "Execute unit tests" + run: "composer exec -- phpunit" + - + name: "Tests have failed: upload logs" + if: "${{ failure() }}" + uses: "actions/upload-artifact@v3" + with: + path: "storage/logs/" + name: "laravel-logs-${{ matrix.php-version }}-${{ matrix.dependencies }}" + - + name: "Send coverage to Coveralls" + env: + COVERALLS_REPO_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + if: "${{ env.COVERALLS_REPO_TOKEN && matrix.php-version == '8.2' && matrix.dependencies == 'locked' }}" + run: | + wget --no-verbose \ + "https://github.com/php-coveralls/php-coveralls/releases/download/v2.5.3/php-coveralls.phar" + php ./php-coveralls.phar --verbose + + static_analysis: + name: "3️⃣ Static Analysis" + needs: + - "byte_level" + - "syntax_errors" + runs-on: "ubuntu-22.04" + timeout-minutes: 5 + steps: + - + name: "Set up PHP" + uses: "shivammathur/setup-php@v2" + with: + php-version: "8.2" + extensions: "dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, fileinfo, exif" + coverage: "none" + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Check JSON files" + run: | + git ls-files --cached -z -- '*.json' \ + | xargs -t --null -L 1 -- \ + php -r 'json_decode(file_get_contents($argv[1]), null, 512, JSON_THROW_ON_ERROR);' + - + name: "Validate Composer configuration" + run: "composer validate --no-interaction --strict" + - + name: "Install dependencies" + uses: "ramsey/composer-install@v2" + with: + dependency-versions: "locked" + - + name: "Check PSR-4 mapping 🐌" + run: "composer dump-autoload --optimize --strict-psr" + - + # https://github.com/phpstan/phpstan/issues/9475 + name: "Search for $this->$this typo 🐌" + run: | + ! git grep --line-number -e '\$this\s*->\s*\$this' -- ':!:*/back-end\.yml' + - + name: "Perform static analysis" + run: "true TODO || composer exec -- phpstan analyze --level=5 src/" + + coding_standards: + name: "4️⃣ Coding Standards" + needs: + - "byte_level" + - "syntax_errors" + runs-on: "ubuntu-22.04" + timeout-minutes: 5 + steps: + - + name: "Set up PHP" + uses: "shivammathur/setup-php@v2" + with: + php-version: "8.2" + extensions: "dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, fileinfo, exif" + coverage: "none" + tools: "phpcs,cs2pr" + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Check EditorConfig configuration" + run: "test -f .editorconfig" + - + name: "Check adherence to EditorConfig" + uses: "greut/eclint-action@v0" + - + name: "Look for TAB characters in the middle of the line 🐌" + run: | + ! git grep --perl-regexp --line-number -I '^(?!//)[^\t]+\t' + - + name: "Install dependencies" + uses: "ramsey/composer-install@v2" + with: + dependency-versions: "locked" + #- + # name: "Detect coding standards violations" + # run: "composer exec -- phpcs -q --report=checkstyle --standard=PSR12 src/ | cs2pr" + - + name: "Detect coding standards violations" + id: "pint" + run: "composer exec -- pint --verbose --test" + - + name: "Annotate Pint results" + if: "${{ failure() && steps.pint.outcome == 'failure' }}" + run: "composer exec -- pint --test --format=checkstyle | cs2pr" + - + # Move TODO-s into GitHub issues! + name: "Search for TODO-s and FIXME-s 🐌" + run: | + ! git grep --extended-regexp --ignore-case '\b(TODO|FIXME)\b' -- ':!:*/back-end\.yml' + - + name: "Remove blank first lines and multiple blank lines 🐌" + run: | + git ls-files --cached -z -- ':(exclude,glob)**/yarn.lock' \ + | xargs --null -L 1 -- sed -i -e '/./,$!d' -e '/^$/N;/^\n$/D' + - + name: "Check differences to repository" + run: "git diff --exit-code" + + exported_files: + name: "5️⃣ Exported files" + needs: + - "byte_level" + - "syntax_errors" + runs-on: "ubuntu-22.04" + timeout-minutes: 1 + steps: + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Check for ignored files in the index 🐌" + run: | + IGNORED_FILES="$(git ls-files --cached --ignored --exclude-standard)" + test -z "${IGNORED_FILES}" + - + name: "Check exported files" + run: | + EXPECTED="LICENSE,README.md,composer.json,package.json" + CURRENT="$( + git archive HEAD \ + | tar --list --exclude="src" --exclude="src/*" \ + --exclude="config" --exclude="config/*" \ + --exclude="database" --exclude="database/*" \ + --exclude="public" --exclude="public/*" \ + --exclude="resources" --exclude="resources/*" \ + --exclude="routes" --exclude="routes/*" \ + --exclude="src" --exclude="src/*" \ + --exclude="stubs" --exclude="stubs/*" \ + | paste --serial --delimiters="," + )" + echo "CURRENT =${CURRENT}" + echo "EXPECTED=${EXPECTED}" + test "${CURRENT}" = "${EXPECTED}" diff --git a/.github/workflows/front-end.yml b/.github/workflows/front-end.yml new file mode 100644 index 000000000..2b3cdd2e7 --- /dev/null +++ b/.github/workflows/front-end.yml @@ -0,0 +1,122 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow + +name: "Front-end" + +# ECMAScript version: 2018 +# Node.js version: 18.12 +# Yarn version: 1 + +on: + pull_request: null + push: + branches: + - "master" +# Add [skip ci] to commit message to skip CI. + +permissions: + contents: "read" + +concurrency: + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true + +jobs: + js_syntax_errors: + name: "𝟏 JavaScript Syntax Errors" + runs-on: "ubuntu-22.04" + timeout-minutes: 5 + steps: + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Set up Node.js" + uses: "actions/setup-node@v3" + with: + node-version: "18" + check-latest: true + cache: "yarn" + - + name: "Configure yarn" + run: "yarn config set engine-strict true" + - + name: "Install all dependencies" + run: "yarn install --non-interactive --pure-lockfile" + - + name: "Check JavaScript files for syntax errors" + run: | + git ls-files --cached -z -- 'resources/js/*.js' \ + | xargs --null -- yarn run acorn --ecma2018 --module --silent + + scss_coding_standards: + name: "𝟐 Sassy CSS Coding Standards" + runs-on: "ubuntu-22.04" + timeout-minutes: 5 + steps: + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Set up Node.js" + uses: "actions/setup-node@v3" + with: + node-version: "18" + cache: "yarn" + - + name: "Configure yarn" + run: "yarn config set engine-strict true" + - + name: "Install all dependencies" + run: "yarn install --non-interactive --pure-lockfile" + - + name: "Detect coding standards violations" + run: "yarn run sass:lint --formatter github" + + build: + name: "𝟑 Build" + needs: + - "js_syntax_errors" + - "scss_coding_standards" + runs-on: "ubuntu-22.04" + timeout-minutes: 5 + steps: + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Set up Node.js" + uses: "actions/setup-node@v3" + with: + node-version: "18" + cache: "yarn" + - + name: "Configure yarn" + run: "yarn config set engine-strict true" + - + name: "Install production dependencies" + run: "yarn install --non-interactive --pure-lockfile" + - + name: "Build front-end" + run: "yarn run prod:build" + - + name: "Check differences to repository" + run: "git diff --exit-code" + + svg: + name: "𝟓 SVG files" + runs-on: "ubuntu-22.04" + timeout-minutes: 1 + steps: + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Validate SVG files" + uses: "szepeviktor/svg-validator@v1.0.0" + with: + svg_path: "public/**/*.svg" + - + name: "Validate GitHub files" + uses: "szepeviktor/svg-validator@v1.0.0" + with: + svg_path: ".github/**/*.svg" diff --git a/.github/workflows/install-laravel.yml b/.github/workflows/install-laravel.yml index 5d9b223d2..baa09558e 100644 --- a/.github/workflows/install-laravel.yml +++ b/.github/workflows/install-laravel.yml @@ -1,77 +1,90 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow + name: "Install in Laravel" on: - push: - branches: - - "master" - pull_request: - -jobs: - laravel_install: - - strategy: - fail-fast: true - matrix: - os: ["ubuntu-22.04"] - php: ["8.1", "8.2"] - stability: ["prefer-stable"] - laravel: ["10.x"] + pull_request: null + push: + branches: + - "master" +# Add [skip ci] to commit message to skip CI. - name: "${{ matrix.os }} - PHP ${{ matrix.php }} - ${{ matrix.stability }}" +permissions: + contents: "read" - runs-on: "${{ matrix.os }}" +concurrency: + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true - defaults: - run: - shell: "bash" - - steps: - - - name: "Setup PHP" - uses: "shivammathur/setup-php@v2" - with: - php-version: "${{ matrix.php }}" - extensions: "dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, fileinfo, exif" - tools: "composer:v2" - coverage: "none" - - - name: "Checkout code" - uses: "actions/checkout@v2" +jobs: + laravel_install: + name: "${{ matrix.os }} - PHP ${{ matrix.php }} - ${{ matrix.stability }}" - - name: "Install Root in Laravel" - run: | - git clone -b ${{ matrix.laravel }} https://github.com/laravel/laravel.git laravel - cd laravel/ - composer config repositories.0 '{ "type": "path", "url": "../", "options": { "symlink": false } }' - composer require --no-interaction --no-progress --dev --${{ matrix.stability }} --prefer-dist --update-with-dependencies "conedevelopment/root:dev-${{ github.sha }} || dev-${{ github.ref_name }}" - # APP_ENV is local - cp -v .env.example .env - sed -i -e 's#^DB_CONNECTION=.*$#DB_CONNECTION=sqlite#' .env - sed -i -e 's#^DB_DATABASE=.*$#DB_DATABASE=:memory:#' .env - php artisan key:generate - php artisan root:install --seed - php artisan root:publish --packages + strategy: + fail-fast: true + matrix: + os: + - "ubuntu-22.04" + php: + - "8.1" + - "8.2" + stability: + - "prefer-stable" + laravel: + - "10.x" - - name: "Check stubs" - run: | - cd laravel/ - composer require --no-interaction --dev --prefer-dist nunomaduro/larastan - php artisan root:action FooBar - php artisan root:extract FooBar - php artisan root:field FooBar - php artisan root:filter FooBar - php artisan root:resource FooBar - php artisan root:widget FooBar - vendor/bin/phpstan analyze -c vendor/nunomaduro/larastan/extension.neon -l 5 $(find app/Root/ -type f -name FooBar.php) + runs-on: "${{ matrix.os }}" - - name: "Install front-end dependencies" - run: | - cd laravel/ - # laravel-vite-plugin is a devDependency - #npm install --production - npm install + defaults: + run: + shell: "bash" - - name: "Build front-end" - run: | - cd laravel/ - npm run build + steps: + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Setup PHP" + uses: "shivammathur/setup-php@v2" + with: + php-version: "${{ matrix.php }}" + extensions: "dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, fileinfo, exif" + coverage: "none" + - + name: "Install Root in Laravel" + run: | + git clone -b ${{ matrix.laravel }} https://github.com/laravel/laravel.git laravel + cd laravel/ + composer config repositories.0 '{ "type": "path", "url": "../", "options": { "symlink": false } }' + composer require --no-interaction --no-progress --dev --${{ matrix.stability }} --prefer-dist --update-with-dependencies "conedevelopment/root:dev-${{ github.sha }} || dev-${{ github.ref_name }}" + # APP_ENV is local + cp -v .env.example .env + sed -i -e 's#^DB_CONNECTION=.*$#DB_CONNECTION=sqlite#' .env + sed -i -e 's#^DB_DATABASE=.*$#DB_DATABASE=:memory:#' .env + php artisan key:generate + php artisan root:install --seed + php artisan root:publish --packages + - + name: "Perform static analysis on stubs" + working-directory: "laravel" + run: | + composer require --no-interaction --dev --prefer-dist nunomaduro/larastan + php artisan root:action FooBar + php artisan root:extract FooBar + php artisan root:field FooBar + php artisan root:filter FooBar + php artisan root:resource FooBar + php artisan root:widget FooBar + vendor/bin/phpstan analyze -c vendor/nunomaduro/larastan/extension.neon -l 5 $(find app/Root/ -type f -name FooBar.php) + - + name: "Install front-end dependencies" + working-directory: "laravel" + run: | + # laravel-vite-plugin is a devDependency + #npm install --production + npm install + - + name: "Build front-end" + working-directory: "laravel" + run: | + npm run build diff --git a/.github/workflows/vuejs.yml b/.github/workflows/vuejs.yml deleted file mode 100644 index 71b1a3896..000000000 --- a/.github/workflows/vuejs.yml +++ /dev/null @@ -1,70 +0,0 @@ -name: "Vue.JS" - -on: - push: - branches: [ "master" ] - pull_request: null - -jobs: - tests: - name: "Tests" - strategy: - matrix: - node-version: - - "16" - runs-on: "ubuntu-20.04" - steps: - - name: "Checkout code" - uses: "actions/checkout@v2" - - - name: "Set up NodeJS" - uses: "actions/setup-node@v2" - with: - node-version: "${{ matrix.node-version }}" - - - name: "Configure yarn" - run: "yarn config set engine-strict true" - - - name: "Install dependencies" - run: "yarn install --non-interactive --pure-lockfile" - - - name: "Run linter" - run: "yarn run lint --format json --output-file /tmp/eslint_report.json" - continue-on-error: true - - - name: "Annotate Code Linting Results" - uses: "ataylorme/eslint-annotate-action@1.1.2" - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" - report-json: "/tmp/eslint_report.json" - - - name: "Run tests" - run: "yarn run test --color" - - # - name: "Run SASS linter" - # run: "yarn run lint-sass" - - build: - name: "Build" - strategy: - matrix: - node-version: - - "16" - runs-on: "ubuntu-20.04" - steps: - - name: "Checkout code" - uses: "actions/checkout@v2" - - - name: "Set up NodeJS" - uses: "actions/setup-node@v2" - with: - node-version: "${{ matrix.node-version }}" - - - name: "Configure yarn" - run: "yarn config set engine-strict true" - - - name: "Install dependencies" - run: "yarn install --non-interactive --pure-lockfile --production" - - - name: "Build front-end" - run: "yarn run build" diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 000000000..a0ea9fddd --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,10 @@ +{ + "extends": "stylelint-config-sass-guidelines", + "rules": { + "indentation": 4, + "max-nesting-depth": 6, + "selector-class-pattern": [ + "^[a-z0-9\\:-]+$" + ] + } +} diff --git a/.typos.toml b/.typos.toml index 36089e358..3953495c8 100644 --- a/.typos.toml +++ b/.typos.toml @@ -1,5 +1,9 @@ [files] -extend-exclude = ["public/build/assets/*"] +extend-exclude = [ + ".git", + "public/build/assets/*", + "resources/views/form/fields/editor.blade.php" +] +ignore-hidden = false [default.extend-words] -referer = "referer" responsable = "responsable" diff --git a/README.md b/README.md index 80d5e99de..724d9bd88 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@

- -
- - - - Root - -
-
+ +
+ + + + Root + +
+

**Root is an admin package for Laravel applications with extension support.** diff --git a/composer.json b/composer.json index e125cf268..49c8fd5cd 100644 --- a/composer.json +++ b/composer.json @@ -1,15 +1,35 @@ { "name": "conedevelopment/root", "description": "Root is an admin package for Laravel applications.", - "keywords": ["laravel", "admin", "dashboard"], - "type": "project", "license": "MIT", + "type": "project", + "keywords": [ + "laravel", + "admin", + "dashboard" + ], "authors": [ { "name": "Cone Development", "email": "hello@conedevelopment.com" } ], + "require": { + "php": "^8.1 || ^8.2", + "ext-exif": "*", + "ext-gd": "*", + "laravel/framework": "^10.17" + }, + "require-dev": { + "fakerphp/faker": "^1.9.1", + "laravel/laravel": "^10.16", + "laravel/pint": "^1.6", + "mockery/mockery": "^1.4.4", + "nunomaduro/larastan": "^2.1.6", + "phpunit/phpunit": "^10.2.5" + }, + "minimum-stability": "dev", + "prefer-stable": true, "autoload": { "psr-4": { "Cone\\Root\\": "src/", @@ -22,31 +42,14 @@ "Cone\\Root\\Tests\\": "tests/" } }, - "require": { - "ext-gd": "*", - "ext-exif": "*", - "php": "^8.1 || ^8.2", - "laravel/framework": "^10.0", - "inertiajs/inertia-laravel": "^0.6.2" - }, - "require-dev": { - "fakerphp/faker": "^1.9.1", - "laravel/laravel": "^10.0", - "mockery/mockery": "^1.4.4", - "phpunit/phpunit": "^10.0", - "nunomaduro/larastan": "^2.1.6", - "laravel/pint": "^1.6" - }, "extra": { + "branch-alias": { + "dev-master": "v2-dev" + }, "laravel": { "providers": [ "Cone\\Root\\RootServiceProvider" ] - }, - "branch-alias": { - "dev-master": "1.x-dev" } - }, - "minimum-stability": "dev", - "prefer-stable": true + } } diff --git a/composer.lock b/composer.lock index b8538f7d9..cbd4ba6aa 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a0d8b22daf26a563bab8d6c59f0bcc5f", + "content-hash": "5c89a03e8d0707e32c34fe9995d8dee9", "packages": [ { "name": "brick/math", @@ -138,28 +138,28 @@ }, { "name": "doctrine/inflector", - "version": "2.0.6", + "version": "2.0.8", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024" + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", - "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^10", + "doctrine/coding-standard": "^11.0", "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.1", "phpstan/phpstan-strict-rules": "^1.3", "phpunit/phpunit": "^8.5 || ^9.5", - "vimeo/psalm": "^4.25" + "vimeo/psalm": "^4.25 || ^5.4" }, "type": "library", "autoload": { @@ -209,7 +209,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.6" + "source": "https://github.com/doctrine/inflector/tree/2.0.8" }, "funding": [ { @@ -225,7 +225,7 @@ "type": "tidelift" } ], - "time": "2022-10-20T09:10:12+00:00" + "time": "2023-06-16T13:40:37+00:00" }, { "name": "doctrine/lexer", @@ -306,16 +306,16 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v3.3.2", + "version": "v3.3.3", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8" + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/782ca5968ab8b954773518e9e49a6f892a34b2a8", - "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", "shasum": "" }, "require": { @@ -355,7 +355,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.2" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" }, "funding": [ { @@ -363,7 +363,7 @@ "type": "github" } ], - "time": "2022-09-10T18:51:20+00:00" + "time": "2023-08-10T19:36:49+00:00" }, { "name": "egulias/email-validator", @@ -567,16 +567,16 @@ }, { "name": "guzzlehttp/uri-template", - "version": "v1.0.1", + "version": "v1.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/uri-template.git", - "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2" + "reference": "61bf437fc2197f587f6857d3ff903a24f1731b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/b945d74a55a25a949158444f09ec0d3c120d69e2", - "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/61bf437fc2197f587f6857d3ff903a24f1731b5d", + "reference": "61bf437fc2197f587f6857d3ff903a24f1731b5d", "shasum": "" }, "require": { @@ -584,15 +584,11 @@ "symfony/polyfill-php80": "^1.17" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", "phpunit/phpunit": "^8.5.19 || ^9.5.8", "uri-template/tests": "1.0.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, "autoload": { "psr-4": { "GuzzleHttp\\UriTemplate\\": "src" @@ -631,7 +627,7 @@ ], "support": { "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v1.0.1" + "source": "https://github.com/guzzle/uri-template/tree/v1.0.2" }, "funding": [ { @@ -647,92 +643,20 @@ "type": "tidelift" } ], - "time": "2021-10-07T12:57:01+00:00" - }, - { - "name": "inertiajs/inertia-laravel", - "version": "v0.6.9", - "source": { - "type": "git", - "url": "https://github.com/inertiajs/inertia-laravel.git", - "reference": "b983c6eb2fe7460df6170060cdd7b47b5ef6832a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/b983c6eb2fe7460df6170060cdd7b47b5ef6832a", - "reference": "b983c6eb2fe7460df6170060cdd7b47b5ef6832a", - "shasum": "" - }, - "require": { - "ext-json": "*", - "laravel/framework": "^6.0|^7.0|^8.74|^9.0|^10.0", - "php": "^7.2|~8.0.0|~8.1.0|~8.2.0" - }, - "require-dev": { - "mockery/mockery": "^1.3.3", - "orchestra/testbench": "^4.0|^5.0|^6.4|^7.0|^8.0", - "phpunit/phpunit": "^8.0|^9.5.8", - "roave/security-advisories": "dev-master" - }, - "suggest": { - "ext-pcntl": "Recommended when running the Inertia SSR server via the `inertia:start-ssr` artisan command." - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Inertia\\ServiceProvider" - ] - } - }, - "autoload": { - "files": [ - "./helpers.php" - ], - "psr-4": { - "Inertia\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Reinink", - "email": "jonathan@reinink.ca", - "homepage": "https://reinink.ca" - } - ], - "description": "The Laravel adapter for Inertia.js.", - "keywords": [ - "inertia", - "laravel" - ], - "support": { - "issues": "https://github.com/inertiajs/inertia-laravel/issues", - "source": "https://github.com/inertiajs/inertia-laravel/tree/v0.6.9" - }, - "funding": [ - { - "url": "https://github.com/reinink", - "type": "github" - } - ], - "time": "2023-01-17T01:02:51+00:00" + "time": "2023-08-27T10:19:19+00:00" }, { "name": "laravel/framework", - "version": "v10.9.0", + "version": "v10.24.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "35078125f61ef0b125edf524de934f108d4b47fd" + "reference": "bcebd0a4c015d5c38aeec299d355a42451dd3726" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/35078125f61ef0b125edf524de934f108d4b47fd", - "reference": "35078125f61ef0b125edf524de934f108d4b47fd", + "url": "https://api.github.com/repos/laravel/framework/zipball/bcebd0a4c015d5c38aeec299d355a42451dd3726", + "reference": "bcebd0a4c015d5c38aeec299d355a42451dd3726", "shasum": "" }, "require": { @@ -750,11 +674,12 @@ "ext-tokenizer": "*", "fruitcake/php-cors": "^1.2", "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1", "laravel/serializable-closure": "^1.3", "league/commonmark": "^2.2.1", "league/flysystem": "^3.8.0", "monolog/monolog": "^3.0", - "nesbot/carbon": "^2.62.1", + "nesbot/carbon": "^2.67", "nunomaduro/termwind": "^1.13", "php": "^8.1", "psr/container": "^1.1.1|^2.0.1", @@ -831,9 +756,8 @@ "league/flysystem-read-only": "^3.3", "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.5.1", - "orchestra/testbench-core": "^8.4", + "orchestra/testbench-core": "^8.10", "pda/pheanstalk": "^4.0", - "phpstan/phpdoc-parser": "^1.15", "phpstan/phpstan": "^1.4.7", "phpunit/phpunit": "^10.0.7", "predis/predis": "^2.0.2", @@ -919,20 +843,68 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-04-25T13:47:18+00:00" + "time": "2023-09-19T15:25:04+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.8", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "68dcc65babf92e1fb43cba0b3f78fc3d8002709c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/68dcc65babf92e1fb43cba0b3f78fc3d8002709c", + "reference": "68dcc65babf92e1fb43cba0b3f78fc3d8002709c", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.8" + }, + "time": "2023-09-19T15:33:56+00:00" }, { "name": "laravel/serializable-closure", - "version": "v1.3.0", + "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37" + "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", - "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/e5a3057a5591e1cfe8183034b0203921abe2c902", + "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902", "shasum": "" }, "require": { @@ -979,20 +951,20 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2023-01-30T18:31:20+00:00" + "time": "2023-07-14T13:56:28+00:00" }, { "name": "league/commonmark", - "version": "2.4.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048" + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d44a24690f16b8c1808bf13b1bd54ae4c63ea048", - "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/3669d6d5f7a47a93c08ddff335e6d945481a1dd5", + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5", "shasum": "" }, "require": { @@ -1085,7 +1057,7 @@ "type": "tidelift" } ], - "time": "2023-03-24T15:16:10+00:00" + "time": "2023-08-30T16:55:00+00:00" }, { "name": "league/config", @@ -1171,23 +1143,26 @@ }, { "name": "league/flysystem", - "version": "3.14.0", + "version": "3.16.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "e2a279d7f47d9098e479e8b21f7fb8b8de230158" + "reference": "4fdf372ca6b63c6e281b1c01a624349ccb757729" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e2a279d7f47d9098e479e8b21f7fb8b8de230158", - "reference": "e2a279d7f47d9098e479e8b21f7fb8b8de230158", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4fdf372ca6b63c6e281b1c01a624349ccb757729", + "reference": "4fdf372ca6b63c6e281b1c01a624349ccb757729", "shasum": "" }, "require": { + "league/flysystem-local": "^3.0.0", "league/mime-type-detection": "^1.0.0", "php": "^8.0.2" }, "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", "aws/aws-sdk-php": "3.209.31 || 3.210.0", "guzzlehttp/guzzle": "<7.0", "guzzlehttp/ringphp": "<1.1.1", @@ -1207,7 +1182,7 @@ "microsoft/azure-storage-blob": "^1.1", "phpseclib/phpseclib": "^3.0.14", "phpstan/phpstan": "^0.12.26", - "phpunit/phpunit": "^9.5.11", + "phpunit/phpunit": "^9.5.11|^10.0", "sabre/dav": "^4.3.1" }, "type": "library", @@ -1242,7 +1217,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.14.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.16.0" }, "funding": [ { @@ -1254,30 +1229,90 @@ "type": "github" } ], - "time": "2023-04-11T18:11:47+00:00" + "time": "2023-09-07T19:22:17+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "ec7383f25642e6fd4bb0c9554fc2311245391781" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/ec7383f25642e6fd4bb0c9554fc2311245391781", + "reference": "ec7383f25642e6fd4bb0c9554fc2311245391781", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem-local/issues", + "source": "https://github.com/thephpleague/flysystem-local/tree/3.16.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2023-08-30T10:23:59+00:00" }, { "name": "league/mime-type-detection", - "version": "1.11.0", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/a6dfb1194a2946fcdc1f38219445234f65b35c96", + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96", "shasum": "" }, "require": { "ext-fileinfo": "*", - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3" + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, "type": "library", "autoload": { @@ -1298,7 +1333,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.13.0" }, "funding": [ { @@ -1310,20 +1345,20 @@ "type": "tidelift" } ], - "time": "2022-04-17T13:12:02+00:00" + "time": "2023-08-05T12:09:49+00:00" }, { "name": "monolog/monolog", - "version": "3.3.1", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "9b5daeaffce5b926cac47923798bba91059e60e2" + "reference": "e2392369686d420ca32df3803de28b5d6f76867d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/9b5daeaffce5b926cac47923798bba91059e60e2", - "reference": "9b5daeaffce5b926cac47923798bba91059e60e2", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/e2392369686d420ca32df3803de28b5d6f76867d", + "reference": "e2392369686d420ca32df3803de28b5d6f76867d", "shasum": "" }, "require": { @@ -1338,7 +1373,7 @@ "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7 || ^8", "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "graylog2/gelf-php": "^1.4.2 || ^2.0", "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", @@ -1346,7 +1381,7 @@ "phpstan/phpstan": "^1.9", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^9.5.26", + "phpunit/phpunit": "^10.1", "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", "symfony/mailer": "^5.4 || ^6", @@ -1399,7 +1434,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.3.1" + "source": "https://github.com/Seldaek/monolog/tree/3.4.0" }, "funding": [ { @@ -1411,29 +1446,33 @@ "type": "tidelift" } ], - "time": "2023-02-06T13:46:10+00:00" + "time": "2023-06-21T08:46:11+00:00" }, { "name": "nesbot/carbon", - "version": "2.66.0", + "version": "2.70.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "496712849902241f04902033b0441b269effe001" + "reference": "d3298b38ea8612e5f77d38d1a99438e42f70341d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/496712849902241f04902033b0441b269effe001", - "reference": "496712849902241f04902033b0441b269effe001", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/d3298b38ea8612e5f77d38d1a99438e42f70341d", + "reference": "d3298b38ea8612e5f77d38d1a99438e42f70341d", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16", "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, + "provide": { + "psr/clock-implementation": "1.0" + }, "require-dev": { "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", @@ -1513,25 +1552,25 @@ "type": "tidelift" } ], - "time": "2023-01-29T18:53:47+00:00" + "time": "2023-09-07T16:43:50+00:00" }, { "name": "nette/schema", - "version": "v1.2.3", + "version": "v1.2.4", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f" + "reference": "c9ff517a53903b3d4e29ec547fb20feecb05b8ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", - "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "url": "https://api.github.com/repos/nette/schema/zipball/c9ff517a53903b3d4e29ec547fb20feecb05b8ab", + "reference": "c9ff517a53903b3d4e29ec547fb20feecb05b8ab", "shasum": "" }, "require": { "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", - "php": ">=7.1 <8.3" + "php": "7.1 - 8.3" }, "require-dev": { "nette/tester": "^2.3 || ^2.4", @@ -1573,26 +1612,26 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.3" + "source": "https://github.com/nette/schema/tree/v1.2.4" }, - "time": "2022-10-13T01:24:26+00:00" + "time": "2023-08-05T18:56:25+00:00" }, { "name": "nette/utils", - "version": "v4.0.0", + "version": "v4.0.2", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e" + "reference": "cead6637226456b35e1175cc53797dd585d85545" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/cacdbf5a91a657ede665c541eda28941d4b09c1e", - "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e", + "url": "https://api.github.com/repos/nette/utils/zipball/cead6637226456b35e1175cc53797dd585d85545", + "reference": "cead6637226456b35e1175cc53797dd585d85545", "shasum": "" }, "require": { - "php": ">=8.0 <8.3" + "php": ">=8.0 <8.4" }, "conflict": { "nette/finder": "<3", @@ -1600,7 +1639,7 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "dev-master", - "nette/tester": "^2.4", + "nette/tester": "^2.5", "phpstan/phpstan": "^1.0", "tracy/tracy": "^2.9" }, @@ -1610,8 +1649,7 @@ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", "ext-json": "to use Nette\\Utils\\Json", "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", - "ext-xml": "to use Strings::length() etc. when mbstring is not available" + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" }, "type": "library", "extra": { @@ -1660,9 +1698,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.0" + "source": "https://github.com/nette/utils/tree/v4.0.2" }, - "time": "2023-02-02T10:41:53+00:00" + "time": "2023-09-19T11:58:07+00:00" }, { "name": "nunomaduro/termwind", @@ -1825,6 +1863,54 @@ ], "time": "2023-02-25T19:38:58+00:00" }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, { "name": "psr/container", "version": "2.0.2", @@ -2212,23 +2298,23 @@ }, { "name": "symfony/console", - "version": "v6.2.10", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "12288d9f4500f84a4d02254d4aa968b15488476f" + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/12288d9f4500f84a4d02254d4aa968b15488476f", - "reference": "12288d9f4500f84a4d02254d4aa968b15488476f", + "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/string": "^5.4|^6.0" }, "conflict": { @@ -2250,12 +2336,6 @@ "symfony/process": "^5.4|^6.0", "symfony/var-dumper": "^5.4|^6.0" }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, "type": "library", "autoload": { "psr-4": { @@ -2288,7 +2368,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.2.10" + "source": "https://github.com/symfony/console/tree/v6.3.4" }, "funding": [ { @@ -2304,20 +2384,20 @@ "type": "tidelift" } ], - "time": "2023-04-28T13:37:43+00:00" + "time": "2023-08-16T10:10:12+00:00" }, { "name": "symfony/css-selector", - "version": "v6.2.7", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0" + "reference": "883d961421ab1709877c10ac99451632a3d6fa57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/aedf3cb0f5b929ec255d96bbb4909e9932c769e0", - "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", + "reference": "883d961421ab1709877c10ac99451632a3d6fa57", "shasum": "" }, "require": { @@ -2353,7 +2433,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.2.7" + "source": "https://github.com/symfony/css-selector/tree/v6.3.2" }, "funding": [ { @@ -2369,20 +2449,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-07-12T16:00:22+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { @@ -2391,7 +2471,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -2420,7 +2500,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { @@ -2436,20 +2516,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:25:55+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/error-handler", - "version": "v6.2.10", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8b7e9f124640cb0611624a9383176c3e5f7d8cfb" + "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8b7e9f124640cb0611624a9383176c3e5f7d8cfb", - "reference": "8b7e9f124640cb0611624a9383176c3e5f7d8cfb", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/85fd65ed295c4078367c784e8a5a6cee30348b7a", + "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a", "shasum": "" }, "require": { @@ -2457,8 +2537,11 @@ "psr/log": "^1|^2|^3", "symfony/var-dumper": "^5.4|^6.0" }, + "conflict": { + "symfony/deprecation-contracts": "<2.5" + }, "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^5.4|^6.0", "symfony/serializer": "^5.4|^6.0" }, @@ -2491,7 +2574,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.2.10" + "source": "https://github.com/symfony/error-handler/tree/v6.3.2" }, "funding": [ { @@ -2507,28 +2590,29 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2023-07-16T17:05:46+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.2.8", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339" + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/04046f35fd7d72f9646e721fc2ecb8f9c67d3339", - "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2|^3" + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -2541,13 +2625,9 @@ "symfony/error-handler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/stopwatch": "^5.4|^6.0" }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, "type": "library", "autoload": { "psr-4": { @@ -2574,7 +2654,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.8" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" }, "funding": [ { @@ -2590,33 +2670,30 @@ "type": "tidelift" } ], - "time": "2023-03-20T16:06:02+00:00" + "time": "2023-07-06T06:56:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd" + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", - "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", "shasum": "" }, "require": { "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -2653,7 +2730,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" }, "funding": [ { @@ -2669,20 +2746,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/finder", - "version": "v6.2.7", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb" + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/20808dc6631aecafbe67c186af5dcb370be3a0eb", - "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb", + "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", "shasum": "" }, "require": { @@ -2717,7 +2794,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.2.7" + "source": "https://github.com/symfony/finder/tree/v6.3.3" }, "funding": [ { @@ -2733,32 +2810,34 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:57:23+00:00" + "time": "2023-07-31T08:31:44+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.2.10", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "49adbb92bcb4e3c2943719d2756271e8b9602acc" + "reference": "cac1556fdfdf6719668181974104e6fcfa60e844" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/49adbb92bcb4e3c2943719d2756271e8b9602acc", - "reference": "49adbb92bcb4e3c2943719d2756271e8b9602acc", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cac1556fdfdf6719668181974104e6fcfa60e844", + "reference": "cac1556fdfdf6719668181974104e6fcfa60e844", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.1" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" }, "conflict": { "symfony/cache": "<6.2" }, "require-dev": { - "predis/predis": "~1.0", + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1|^2.0", "symfony/cache": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", @@ -2766,9 +2845,6 @@ "symfony/mime": "^5.4|^6.0", "symfony/rate-limiter": "^5.2|^6.0" }, - "suggest": { - "symfony/mime": "To use the file extension guesser" - }, "type": "library", "autoload": { "psr-4": { @@ -2795,7 +2871,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.2.10" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.4" }, "funding": [ { @@ -2811,29 +2887,29 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2023-08-22T08:20:46+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.2.10", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "81064a65a5496f17d2b6984f6519406f98864215" + "reference": "36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/81064a65a5496f17d2b6984f6519406f98864215", - "reference": "81064a65a5496f17d2b6984f6519406f98864215", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb", + "reference": "36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^6.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.3", "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-foundation": "^5.4.21|^6.2.7", + "symfony/http-foundation": "^6.3.4", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -2841,15 +2917,18 @@ "symfony/cache": "<5.4", "symfony/config": "<6.1", "symfony/console": "<5.4", - "symfony/dependency-injection": "<6.2", + "symfony/dependency-injection": "<6.3.4", "symfony/doctrine-bridge": "<5.4", "symfony/form": "<5.4", "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", "symfony/mailer": "<5.4", "symfony/messenger": "<5.4", "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", "symfony/twig-bridge": "<5.4", "symfony/validator": "<5.4", + "symfony/var-dumper": "<6.3", "twig/twig": "<2.13" }, "provide": { @@ -2858,28 +2937,27 @@ "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "symfony/browser-kit": "^5.4|^6.0", + "symfony/clock": "^6.2", "symfony/config": "^6.1", "symfony/console": "^5.4|^6.0", "symfony/css-selector": "^5.4|^6.0", - "symfony/dependency-injection": "^6.2", + "symfony/dependency-injection": "^6.3.4", "symfony/dom-crawler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", - "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/http-client-contracts": "^2.5|^3", "symfony/process": "^5.4|^6.0", + "symfony/property-access": "^5.4.5|^6.0.5", "symfony/routing": "^5.4|^6.0", + "symfony/serializer": "^6.3", "symfony/stopwatch": "^5.4|^6.0", "symfony/translation": "^5.4|^6.0", - "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/translation-contracts": "^2.5|^3", "symfony/uid": "^5.4|^6.0", + "symfony/validator": "^6.3", + "symfony/var-exporter": "^6.2", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, "type": "library", "autoload": { "psr-4": { @@ -2906,7 +2984,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.2.10" + "source": "https://github.com/symfony/http-kernel/tree/v6.3.4" }, "funding": [ { @@ -2922,20 +3000,20 @@ "type": "tidelift" } ], - "time": "2023-04-28T13:50:28+00:00" + "time": "2023-08-26T13:54:49+00:00" }, { "name": "symfony/mailer", - "version": "v6.2.8", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "bfcfa015c67e19c6fdb7ca6fe70700af1e740a17" + "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/bfcfa015c67e19c6fdb7ca6fe70700af1e740a17", - "reference": "bfcfa015c67e19c6fdb7ca6fe70700af1e740a17", + "url": "https://api.github.com/repos/symfony/mailer/zipball/7b03d9be1dea29bfec0a6c7b603f5072a4c97435", + "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435", "shasum": "" }, "require": { @@ -2945,9 +3023,10 @@ "psr/log": "^1|^2|^3", "symfony/event-dispatcher": "^5.4|^6.0", "symfony/mime": "^6.2", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "symfony/http-client-contracts": "<2.5", "symfony/http-kernel": "<5.4", "symfony/messenger": "<6.2", "symfony/mime": "<6.2", @@ -2985,7 +3064,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.2.8" + "source": "https://github.com/symfony/mailer/tree/v6.3.0" }, "funding": [ { @@ -3001,24 +3080,25 @@ "type": "tidelift" } ], - "time": "2023-03-14T15:00:05+00:00" + "time": "2023-05-29T12:49:39+00:00" }, { "name": "symfony/mime", - "version": "v6.2.10", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "b6c137fc53a9f7c4c951cd3f362b3734c7a97723" + "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/b6c137fc53a9f7c4c951cd3f362b3734c7a97723", - "reference": "b6c137fc53a9f7c4c951cd3f362b3734c7a97723", + "url": "https://api.github.com/repos/symfony/mime/zipball/9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", + "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -3027,7 +3107,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2" + "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -3036,7 +3116,7 @@ "symfony/dependency-injection": "^5.4|^6.0", "symfony/property-access": "^5.4|^6.0", "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "^6.2" + "symfony/serializer": "~6.2.13|^6.3.2" }, "type": "library", "autoload": { @@ -3068,7 +3148,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.2.10" + "source": "https://github.com/symfony/mime/tree/v6.3.3" }, "funding": [ { @@ -3084,20 +3164,20 @@ "type": "tidelift" } ], - "time": "2023-04-19T09:54:16+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -3112,7 +3192,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3150,7 +3230,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -3166,20 +3246,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -3191,7 +3271,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3231,7 +3311,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -3247,20 +3327,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", "shasum": "" }, "require": { @@ -3274,7 +3354,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3318,7 +3398,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" }, "funding": [ { @@ -3334,20 +3414,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:30:37+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -3359,7 +3439,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3402,7 +3482,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -3418,20 +3498,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -3446,7 +3526,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3485,7 +3565,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -3501,20 +3581,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", "shasum": "" }, "require": { @@ -3523,7 +3603,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3561,7 +3641,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" }, "funding": [ { @@ -3577,20 +3657,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -3599,7 +3679,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3644,7 +3724,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -3660,20 +3740,100 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-08-16T06:22:46+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" + "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", - "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9c44518a5aff8da565c8a55dbe85d2769e6f630e", + "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e", "shasum": "" }, "require": { @@ -3688,7 +3848,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3726,7 +3886,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.28.0" }, "funding": [ { @@ -3742,20 +3902,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/process", - "version": "v6.2.10", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e" + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e", - "reference": "b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", "shasum": "" }, "require": { @@ -3787,7 +3947,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.2.10" + "source": "https://github.com/symfony/process/tree/v6.3.4" }, "funding": [ { @@ -3803,24 +3963,25 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:56:57+00:00" + "time": "2023-08-07T10:39:22+00:00" }, { "name": "symfony/routing", - "version": "v6.2.8", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "69062e2823f03b82265d73a966999660f0e1e404" + "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/69062e2823f03b82265d73a966999660f0e1e404", - "reference": "69062e2823f03b82265d73a966999660f0e1e404", + "url": "https://api.github.com/repos/symfony/routing/zipball/e7243039ab663822ff134fbc46099b5fdfa16f6a", + "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "doctrine/annotations": "<1.12", @@ -3837,12 +3998,6 @@ "symfony/http-foundation": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" - }, "type": "library", "autoload": { "psr-4": { @@ -3875,7 +4030,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.2.8" + "source": "https://github.com/symfony/routing/tree/v6.3.3" }, "funding": [ { @@ -3891,20 +4046,20 @@ "type": "tidelift" } ], - "time": "2023-03-14T15:00:05+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a" + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { @@ -3914,13 +4069,10 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -3960,7 +4112,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -3976,20 +4128,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/string", - "version": "v6.2.8", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "193e83bbd6617d6b2151c37fff10fa7168ebddef" + "reference": "53d1a83225002635bca3482fcbf963001313fb68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/193e83bbd6617d6b2151c37fff10fa7168ebddef", - "reference": "193e83bbd6617d6b2151c37fff10fa7168ebddef", + "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", + "reference": "53d1a83225002635bca3482fcbf963001313fb68", "shasum": "" }, "require": { @@ -4000,13 +4152,13 @@ "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { "symfony/error-handler": "^5.4|^6.0", "symfony/http-client": "^5.4|^6.0", "symfony/intl": "^6.2", - "symfony/translation-contracts": "^2.0|^3.0", + "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", @@ -4046,7 +4198,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.2.8" + "source": "https://github.com/symfony/string/tree/v6.3.2" }, "funding": [ { @@ -4062,32 +4214,35 @@ "type": "tidelift" } ], - "time": "2023-03-20T16:06:02+00:00" + "time": "2023-07-05T08:41:27+00:00" }, { "name": "symfony/translation", - "version": "v6.2.8", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "817535dbb1721df8b3a8f2489dc7e50bcd6209b5" + "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/817535dbb1721df8b3a8f2489dc7e50bcd6209b5", - "reference": "817535dbb1721df8b3a8f2489dc7e50bcd6209b5", + "url": "https://api.github.com/repos/symfony/translation/zipball/3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", + "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.3|^3.0" + "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { "symfony/config": "<5.4", "symfony/console": "<5.4", "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", "symfony/twig-bundle": "<5.4", "symfony/yaml": "<5.4" }, @@ -4101,20 +4256,14 @@ "symfony/console": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", - "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-client-contracts": "^2.5|^3.0", "symfony/http-kernel": "^5.4|^6.0", "symfony/intl": "^5.4|^6.0", "symfony/polyfill-intl-icu": "^1.21", "symfony/routing": "^5.4|^6.0", - "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "nikic/php-parser": "To use PhpAstExtractor", - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" - }, "type": "library", "autoload": { "files": [ @@ -4144,7 +4293,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.2.8" + "source": "https://github.com/symfony/translation/tree/v6.3.3" }, "funding": [ { @@ -4160,32 +4309,29 @@ "type": "tidelift" } ], - "time": "2023-03-31T09:14:44+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "dfec258b9dd17a6b24420d464c43bffe347441c8" + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/dfec258b9dd17a6b24420d464c43bffe347441c8", - "reference": "dfec258b9dd17a6b24420d464c43bffe347441c8", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", "shasum": "" }, "require": { "php": ">=8.1" }, - "suggest": { - "symfony/translation-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4225,7 +4371,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.3.0" }, "funding": [ { @@ -4241,20 +4387,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-30T17:17:10+00:00" }, { "name": "symfony/uid", - "version": "v6.2.7", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "d30c72a63897cfa043e1de4d4dd2ffa9ecefcdc0" + "reference": "01b0f20b1351d997711c56f1638f7a8c3061e384" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/d30c72a63897cfa043e1de4d4dd2ffa9ecefcdc0", - "reference": "d30c72a63897cfa043e1de4d4dd2ffa9ecefcdc0", + "url": "https://api.github.com/repos/symfony/uid/zipball/01b0f20b1351d997711c56f1638f7a8c3061e384", + "reference": "01b0f20b1351d997711c56f1638f7a8c3061e384", "shasum": "" }, "require": { @@ -4299,7 +4445,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.2.7" + "source": "https://github.com/symfony/uid/tree/v6.3.0" }, "funding": [ { @@ -4315,42 +4461,38 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-04-08T07:25:02+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.2.10", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "41a750a23412ca76fdbbf5096943b4134272c1ab" + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41a750a23412ca76fdbbf5096943b4134272c1ab", - "reference": "41a750a23412ca76fdbbf5096943b4134272c1ab", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2027be14f8ae8eae999ceadebcda5b4909b81d45", + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", "symfony/process": "^5.4|^6.0", "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, "bin": [ "Resources/bin/var-dump-server" ], @@ -4387,7 +4529,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.2.10" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.4" }, "funding": [ { @@ -4403,7 +4545,7 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2023-08-24T14:51:05+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -4678,16 +4820,16 @@ "packages-dev": [ { "name": "fakerphp/faker", - "version": "v1.21.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d" + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/92efad6a967f0b79c499705c69b662f738cc9e4d", - "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", "shasum": "" }, "require": { @@ -4740,28 +4882,28 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.21.0" + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.0" }, - "time": "2022-12-13T13:54:32+00:00" + "time": "2023-06-12T08:44:38+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.5.1", + "version": "7.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9" + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b964ca597e86b752cd994f27293e9fa6b6a95ed9", - "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -4772,7 +4914,8 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.29 || ^9.5.23", "psr/log": "^1.1 || ^2.0 || ^3.0" }, @@ -4786,9 +4929,6 @@ "bamarni-bin": { "bin-links": true, "forward-command": false - }, - "branch-alias": { - "dev-master": "7.5-dev" } }, "autoload": { @@ -4854,7 +4994,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.5.1" + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" }, "funding": [ { @@ -4870,38 +5010,37 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:30:08+00:00" + "time": "2023-08-27T10:20:53+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.2", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "b94b2807d85443f9719887892882d0329d1e2598" + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", - "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -4938,7 +5077,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.2" + "source": "https://github.com/guzzle/promises/tree/2.0.1" }, "funding": [ { @@ -4954,20 +5093,20 @@ "type": "tidelift" } ], - "time": "2022-08-28T14:55:35+00:00" + "time": "2023-08-03T15:11:55+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.5.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "shasum": "" }, "require": { @@ -5054,7 +5193,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.5.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.1" }, "funding": [ { @@ -5070,7 +5209,7 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:11:26+00:00" + "time": "2023-08-27T10:13:57+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -5125,21 +5264,21 @@ }, { "name": "laravel/laravel", - "version": "v10.1.1", + "version": "10.x-dev", "source": { "type": "git", "url": "https://github.com/laravel/laravel.git", - "reference": "ec38e3bf7618cda1b44c79f907590d4f97749d96" + "reference": "8e5f0e5d00c2398da45404fdcd052c9518a4622f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/laravel/zipball/ec38e3bf7618cda1b44c79f907590d4f97749d96", - "reference": "ec38e3bf7618cda1b44c79f907590d4f97749d96", + "url": "https://api.github.com/repos/laravel/laravel/zipball/8e5f0e5d00c2398da45404fdcd052c9518a4622f", + "reference": "8e5f0e5d00c2398da45404fdcd052c9518a4622f", "shasum": "" }, "require": { "guzzlehttp/guzzle": "^7.2", - "laravel/framework": "^10.8", + "laravel/framework": "^10.10", "laravel/sanctum": "^3.2", "laravel/tinker": "^2.8", "php": "^8.1" @@ -5153,6 +5292,7 @@ "phpunit/phpunit": "^10.1", "spatie/laravel-ignition": "^2.0" }, + "default-branch": true, "type": "project", "extra": { "laravel": { @@ -5170,28 +5310,28 @@ "license": [ "MIT" ], - "description": "The Laravel Framework.", + "description": "The skeleton application for the Laravel framework.", "keywords": [ "framework", "laravel" ], "support": { - "source": "https://github.com/laravel/laravel/tree/v10.1.1" + "source": "https://github.com/laravel/laravel/tree/10.x" }, - "time": "2023-04-18T16:21:20+00:00" + "time": "2023-09-22T18:03:48+00:00" }, { "name": "laravel/pint", - "version": "v1.10.0", + "version": "v1.13.2", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "c7a01fa9bdd79819e7a2f1ba63ac1b02e6692dbc" + "reference": "bbb13460d7f8c5c0cd9a58109beedd79cd7331ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/c7a01fa9bdd79819e7a2f1ba63ac1b02e6692dbc", - "reference": "c7a01fa9bdd79819e7a2f1ba63ac1b02e6692dbc", + "url": "https://api.github.com/repos/laravel/pint/zipball/bbb13460d7f8c5c0cd9a58109beedd79cd7331ff", + "reference": "bbb13460d7f8c5c0cd9a58109beedd79cd7331ff", "shasum": "" }, "require": { @@ -5202,13 +5342,13 @@ "php": "^8.1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.16.0", - "illuminate/view": "^10.5.1", - "laravel-zero/framework": "^10.0.2", - "mockery/mockery": "^1.5.1", - "nunomaduro/larastan": "^2.5.1", + "friendsofphp/php-cs-fixer": "^3.26.1", + "illuminate/view": "^10.23.1", + "laravel-zero/framework": "^10.1.2", + "mockery/mockery": "^1.6.6", + "nunomaduro/larastan": "^2.6.4", "nunomaduro/termwind": "^1.15.1", - "pestphp/pest": "^2.4.0" + "pestphp/pest": "^2.18.2" }, "bin": [ "builds/pint" @@ -5244,20 +5384,20 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2023-04-25T14:52:30+00:00" + "time": "2023-09-19T15:55:02+00:00" }, { "name": "laravel/sanctum", - "version": "v3.2.5", + "version": "v3.3.1", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "8ebda85d59d3c414863a7f4d816ef8302faad876" + "reference": "338f633e6487e76b255470d3373fbc29228aa971" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/8ebda85d59d3c414863a7f4d816ef8302faad876", - "reference": "8ebda85d59d3c414863a7f4d816ef8302faad876", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/338f633e6487e76b255470d3373fbc29228aa971", + "reference": "338f633e6487e76b255470d3373fbc29228aa971", "shasum": "" }, "require": { @@ -5270,9 +5410,9 @@ }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^7.0|^8.0", + "orchestra/testbench": "^7.28.2|^8.8.3", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.6" }, "type": "library", "extra": { @@ -5310,20 +5450,20 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2023-05-01T19:39:51+00:00" + "time": "2023-09-07T15:46:33+00:00" }, { "name": "laravel/tinker", - "version": "v2.8.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10" + "reference": "b936d415b252b499e8c3b1f795cd4fc20f57e1f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/04a2d3bd0d650c0764f70bf49d1ee39393e4eb10", - "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10", + "url": "https://api.github.com/repos/laravel/tinker/zipball/b936d415b252b499e8c3b1f795cd4fc20f57e1f3", + "reference": "b936d415b252b499e8c3b1f795cd4fc20f57e1f3", "shasum": "" }, "require": { @@ -5336,6 +5476,7 @@ }, "require-dev": { "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^8.5.8|^9.3.3" }, "suggest": { @@ -5376,44 +5517,46 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.8.1" + "source": "https://github.com/laravel/tinker/tree/v2.8.2" }, - "time": "2023-02-15T16:40:09+00:00" + "time": "2023-08-15T14:27:00+00:00" }, { "name": "mockery/mockery", - "version": "1.5.1", + "version": "1.6.6", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e" + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/e92dcc83d5a51851baf5f5591d32cb2b16e3684e", - "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e", + "url": "https://api.github.com/repos/mockery/mockery/zipball/b8e0bb7d8c604046539c1115994632c74dcb361e", + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e", "shasum": "" }, "require": { "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", - "php": "^7.3 || ^8.0" + "php": ">=7.3" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.3" + "phpunit/phpunit": "^8.5 || ^9.6.10", + "psalm/plugin-phpunit": "^0.18.4", + "symplify/easy-coding-standard": "^11.5.0", + "vimeo/psalm": "^4.30" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, "autoload": { - "psr-0": { - "Mockery": "library/" + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" } }, "notification-url": "https://packagist.org/downloads/", @@ -5424,12 +5567,20 @@ { "name": "Pádraic Brady", "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" + "homepage": "https://github.com/padraic", + "role": "Author" }, { "name": "Dave Marshall", "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" } ], "description": "Mockery is a simple yet flexible PHP mock object framework", @@ -5447,10 +5598,13 @@ "testing" ], "support": { + "docs": "https://docs.mockery.io/", "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.5.1" + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" }, - "time": "2022-09-07T15:32:08+00:00" + "time": "2023-08-09T00:03:52+00:00" }, { "name": "myclabs/deep-copy", @@ -5513,16 +5667,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.4", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -5563,22 +5717,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2023-03-05T19:49:14+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "nunomaduro/larastan", - "version": "v2.6.0", + "version": "v2.6.4", "source": { "type": "git", "url": "https://github.com/nunomaduro/larastan.git", - "reference": "ccac5b25949576807862cf32ba1fce1769c06c42" + "reference": "6c5e8820f3db6397546f3ce48520af9d312aed27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/ccac5b25949576807862cf32ba1fce1769c06c42", - "reference": "ccac5b25949576807862cf32ba1fce1769c06c42", + "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/6c5e8820f3db6397546f3ce48520af9d312aed27", + "reference": "6c5e8820f3db6397546f3ce48520af9d312aed27", "shasum": "" }, "require": { @@ -5641,7 +5795,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/larastan/issues", - "source": "https://github.com/nunomaduro/larastan/tree/v2.6.0" + "source": "https://github.com/nunomaduro/larastan/tree/v2.6.4" }, "funding": [ { @@ -5661,7 +5815,7 @@ "type": "patreon" } ], - "time": "2023-04-20T12:40:01+00:00" + "time": "2023-07-29T12:13:13+00:00" }, { "name": "phar-io/manifest", @@ -5776,16 +5930,16 @@ }, { "name": "phpmyadmin/sql-parser", - "version": "5.7.0", + "version": "5.8.2", "source": { "type": "git", "url": "https://github.com/phpmyadmin/sql-parser.git", - "reference": "0f5895aab2b6002d00b6831b60983523dea30bff" + "reference": "f1720ae19abe6294cb5599594a8a57bc3c8cc287" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/0f5895aab2b6002d00b6831b60983523dea30bff", - "reference": "0f5895aab2b6002d00b6831b60983523dea30bff", + "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/f1720ae19abe6294cb5599594a8a57bc3c8cc287", + "reference": "f1720ae19abe6294cb5599594a8a57bc3c8cc287", "shasum": "" }, "require": { @@ -5807,7 +5961,7 @@ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "psalm/plugin-phpunit": "^0.16.1", "vimeo/psalm": "^4.11", - "zumba/json-serializer": "^3.0" + "zumba/json-serializer": "~3.0.2" }, "suggest": { "ext-mbstring": "For best performance", @@ -5859,20 +6013,20 @@ "type": "other" } ], - "time": "2023-01-25T10:43:40+00:00" + "time": "2023-09-19T12:34:29+00:00" }, { "name": "phpstan/phpstan", - "version": "1.10.14", + "version": "1.10.35", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "d232901b09e67538e5c86a724be841bea5768a7c" + "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d232901b09e67538e5c86a724be841bea5768a7c", - "reference": "d232901b09e67538e5c86a724be841bea5768a7c", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e730e5facb75ffe09dfb229795e8c01a459f26c3", + "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3", "shasum": "" }, "require": { @@ -5921,20 +6075,20 @@ "type": "tidelift" } ], - "time": "2023-04-19T13:47:27+00:00" + "time": "2023-09-19T15:27:56+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.1", + "version": "10.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "884a0da7f9f46f28b2cb69134217fd810b793974" + "reference": "56f33548fe522c8d82da7ff3824b42829d324364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/884a0da7f9f46f28b2cb69134217fd810b793974", - "reference": "884a0da7f9f46f28b2cb69134217fd810b793974", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/56f33548fe522c8d82da7ff3824b42829d324364", + "reference": "56f33548fe522c8d82da7ff3824b42829d324364", "shasum": "" }, "require": { @@ -5991,7 +6145,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.1" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.6" }, "funding": [ { @@ -5999,20 +6153,20 @@ "type": "github" } ], - "time": "2023-04-17T12:15:40+00:00" + "time": "2023-09-19T04:59:03+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "4.0.1", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "fd9329ab3368f59fe1fe808a189c51086bd4b6bd" + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/fd9329ab3368f59fe1fe808a189c51086bd4b6bd", - "reference": "fd9329ab3368f59fe1fe808a189c51086bd4b6bd", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "shasum": "" }, "require": { @@ -6051,7 +6205,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.1" + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" }, "funding": [ { @@ -6059,7 +6214,7 @@ "type": "github" } ], - "time": "2023-02-10T16:53:14+00:00" + "time": "2023-08-31T06:24:48+00:00" }, { "name": "phpunit/php-invoker", @@ -6126,16 +6281,16 @@ }, { "name": "phpunit/php-text-template", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d" + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d", - "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "shasum": "" }, "require": { @@ -6173,7 +6328,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" }, "funding": [ { @@ -6181,7 +6337,7 @@ "type": "github" } ], - "time": "2023-02-03T06:56:46+00:00" + "time": "2023-08-31T14:07:24+00:00" }, { "name": "phpunit/php-timer", @@ -6244,16 +6400,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.1.2", + "version": "10.3.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "6f0cd95be71add539f8fd2be25b2a4a29789000b" + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6f0cd95be71add539f8fd2be25b2a4a29789000b", - "reference": "6f0cd95be71add539f8fd2be25b2a4a29789000b", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/747c3b2038f1139e3dcd9886a3f5a948648b7503", + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503", "shasum": "" }, "require": { @@ -6267,7 +6423,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.1", + "phpunit/php-code-coverage": "^10.1.5", "phpunit/php-file-iterator": "^4.0", "phpunit/php-invoker": "^4.0", "phpunit/php-text-template": "^3.0", @@ -6277,8 +6433,8 @@ "sebastian/comparator": "^5.0", "sebastian/diff": "^5.0", "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.0", - "sebastian/global-state": "^6.0", + "sebastian/exporter": "^5.1", + "sebastian/global-state": "^6.0.1", "sebastian/object-enumerator": "^5.0", "sebastian/recursion-context": "^5.0", "sebastian/type": "^4.0", @@ -6293,7 +6449,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "10.3-dev" } }, "autoload": { @@ -6325,7 +6481,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.1.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.5" }, "funding": [ { @@ -6341,20 +6497,20 @@ "type": "tidelift" } ], - "time": "2023-04-22T07:38:19+00:00" + "time": "2023-09-19T05:42:37+00:00" }, { "name": "psr/http-client", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { @@ -6391,9 +6547,9 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/1.0.2" + "source": "https://github.com/php-fig/http-client" }, - "time": "2023-04-10T20:12:12+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", @@ -6505,16 +6661,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.16", + "version": "v0.11.21", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "151b145906804eea8e5d71fea23bfb470c904bfb" + "reference": "bcb22101107f3bf770523b65630c9d547f60c540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/151b145906804eea8e5d71fea23bfb470c904bfb", - "reference": "151b145906804eea8e5d71fea23bfb470c904bfb", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/bcb22101107f3bf770523b65630c9d547f60c540", + "reference": "bcb22101107f3bf770523b65630c9d547f60c540", "shasum": "" }, "require": { @@ -6544,6 +6700,10 @@ "extra": { "branch-alias": { "dev-main": "0.11.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false } }, "autoload": { @@ -6575,9 +6735,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.16" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.21" }, - "time": "2023-04-26T12:53:57+00:00" + "time": "2023-09-17T21:15:54+00:00" }, { "name": "ralouphie/getallheaders", @@ -6792,16 +6952,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c" + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c", - "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", "shasum": "" }, "require": { @@ -6812,7 +6972,7 @@ "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^10.3" }, "type": "library", "extra": { @@ -6856,7 +7016,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" }, "funding": [ { @@ -6864,20 +7025,20 @@ "type": "github" } ], - "time": "2023-02-03T07:07:16+00:00" + "time": "2023-08-14T13:18:12+00:00" }, { "name": "sebastian/complexity", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6" + "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6", - "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c70b73893e10757af9c6a48929fa6a333b56a97a", + "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a", "shasum": "" }, "require": { @@ -6913,7 +7074,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.1" }, "funding": [ { @@ -6921,7 +7083,7 @@ "type": "github" } ], - "time": "2023-02-03T06:59:47+00:00" + "time": "2023-08-31T09:55:53+00:00" }, { "name": "sebastian/diff", @@ -7056,16 +7218,16 @@ }, { "name": "sebastian/exporter", - "version": "5.0.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0" + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", "shasum": "" }, "require": { @@ -7079,7 +7241,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -7121,7 +7283,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" }, "funding": [ { @@ -7129,20 +7292,20 @@ "type": "github" } ], - "time": "2023-02-03T07:06:49+00:00" + "time": "2023-09-24T13:22:09+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "aab257c712de87b90194febd52e4d184551c2d44" + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/aab257c712de87b90194febd52e4d184551c2d44", - "reference": "aab257c712de87b90194febd52e4d184551c2d44", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", "shasum": "" }, "require": { @@ -7182,7 +7345,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.0" + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" }, "funding": [ { @@ -7190,20 +7354,20 @@ "type": "github" } ], - "time": "2023-02-03T07:07:38+00:00" + "time": "2023-07-19T07:19:23+00:00" }, { "name": "sebastian/lines-of-code", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130" + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130", - "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", "shasum": "" }, "require": { @@ -7239,7 +7403,8 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" }, "funding": [ { @@ -7247,7 +7412,7 @@ "type": "github" } ], - "time": "2023-02-03T07:08:02+00:00" + "time": "2023-08-31T09:25:50+00:00" }, { "name": "sebastian/object-enumerator", @@ -7590,9 +7755,9 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "ext-gd": "*", + "php": "^8.1 || ^8.2", "ext-exif": "*", - "php": "^8.1 || ^8.2" + "ext-gd": "*" }, "platform-dev": [], "plugin-api-version": "2.3.0" diff --git a/config/root.php b/config/root.php index 54b5799a4..7d038adae 100644 --- a/config/root.php +++ b/config/root.php @@ -1,5 +1,6 @@ [ 'web', - 'auth', + Authenticate::class, 'verified', 'can:viewRoot', HandleRootRequests::class, @@ -78,6 +79,8 @@ 'media' => [ 'disk' => 'public', 'chunk_expiration' => 1440, + 'chunk_size' => 2 * 1024 * 1024, + 'tmp_dir' => storage_path('app/root-tmp'), 'conversion' => [ 'default' => 'gd', 'drivers' => [ diff --git a/database/factories/NotificationFactory.php b/database/factories/NotificationFactory.php index 7f8760751..b48cc4028 100644 --- a/database/factories/NotificationFactory.php +++ b/database/factories/NotificationFactory.php @@ -21,25 +21,22 @@ class NotificationFactory extends Factory public function definition(): array { return [ - 'type' => 'App\\Notifications\\TestNotification', + 'type' => 'App\\Notifications\\CustomNotification', 'data' => [ - 'content' => $this->faker->text(), - 'title' => $this->faker->words(5, true), + 'subject' => $this->faker->jobTitle(), + 'content' => $this->faker->paragraph(), ], + 'read_at' => Date::now(), ]; } /** - * Define the model's unread state. - * - * @return \Cone\Root\Database\Factories\NotificationFactory + * Indicate that the model should be unread. */ - public function read(): static + public function unread(): static { - return $this->state(function (array $attributes): array { - return [ - 'read_at' => Date::now(), - ]; - }); + return $this->state(fn (array $attributes): array => [ + 'read_at' => null, + ]); } } diff --git a/database/factories/RecordFactory.php b/database/factories/RecordFactory.php deleted file mode 100644 index b4ce870de..000000000 --- a/database/factories/RecordFactory.php +++ /dev/null @@ -1,27 +0,0 @@ - $this->faker->company(), - 'description' => null, - ]; - } -} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php deleted file mode 100644 index 0501fa55b..000000000 --- a/database/factories/UserFactory.php +++ /dev/null @@ -1,46 +0,0 @@ - $this->faker->name(), - 'email' => $this->faker->unique()->safeEmail(), - 'email_verified_at' => Date::now(), - 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', - 'remember_token' => Str::random(10), - ]; - } - - /** - * Indicate that the model's email address should be unverified. - * - * @return \Illuminate\Database\Eloquent\Factories\Factory - */ - public function unverified(): static - { - return $this->state(function (array $attributes): array { - return [ - 'email_verified_at' => null, - ]; - }); - } -} diff --git a/database/migrations/2020_01_01_000000_alter_users_table.php b/database/migrations/2020_01_01_000000_alter_users_table.php deleted file mode 100644 index 4e3e8fc68..000000000 --- a/database/migrations/2020_01_01_000000_alter_users_table.php +++ /dev/null @@ -1,28 +0,0 @@ -softDeletes(); - } - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - // - } -}; diff --git a/database/migrations/2020_01_01_000100_create_root_media_table.php b/database/migrations/2020_01_01_000100_create_root_media_table.php index 466d25622..9832145fc 100644 --- a/database/migrations/2020_01_01_000100_create_root_media_table.php +++ b/database/migrations/2020_01_01_000100_create_root_media_table.php @@ -12,7 +12,8 @@ public function up(): void { Schema::create('root_media', static function (Blueprint $table): void { - $table->uuid('id')->primary(); + $table->id(); + $table->uuid(); $table->foreignId('user_id')->nullable()->constrained()->nullOnDelete(); $table->string('name')->index(); $table->string('file_name'); @@ -27,8 +28,11 @@ public function up(): void Schema::create('root_mediables', static function (Blueprint $table): void { $table->id(); - $table->foreignUuid('medium_id')->constrained('root_media')->cascadeOnDelete(); - $table->morphs('mediable'); + $table->foreignId('medium_id')->constrained('root_media')->cascadeOnDelete(); + $table->uuidMorphs('mediable'); + $table->string('collection')->nullable(); + $table->json('meta')->nullable(); + $table->timestamps(); }); } diff --git a/database/migrations/2020_01_01_000200_create_root_records_table.php b/database/migrations/2023_08_15_101934_create_root_notifications_table.php similarity index 52% rename from database/migrations/2020_01_01_000200_create_root_records_table.php rename to database/migrations/2023_08_15_101934_create_root_notifications_table.php index 330f9694b..16b28dc4d 100644 --- a/database/migrations/2020_01_01_000200_create_root_records_table.php +++ b/database/migrations/2023_08_15_101934_create_root_notifications_table.php @@ -11,13 +11,12 @@ */ public function up(): void { - Schema::create('root_records', static function (Blueprint $table): void { + Schema::create('root_notifications', static function (Blueprint $table): void { $table->uuid('id')->primary(); - $table->foreignId('user_id')->nullable()->constrained()->nullOnDelete(); - $table->nullableUuidMorphs('target'); - $table->string('event'); - $table->text('description')->nullable(); - $table->json('properties')->nullable(); + $table->string('type'); + $table->morphs('notifiable'); + $table->json('data'); + $table->timestamp('read_at')->nullable(); $table->timestamps(); }); } @@ -27,6 +26,6 @@ public function up(): void */ public function down(): void { - Schema::dropIfExists('root_records'); + Schema::dropIfExists('root_notifications'); } }; diff --git a/database/seeders/RootTestDataSeeder.php b/database/seeders/RootTestDataSeeder.php index 96124ce35..4c7af20d4 100644 --- a/database/seeders/RootTestDataSeeder.php +++ b/database/seeders/RootTestDataSeeder.php @@ -2,8 +2,9 @@ namespace Cone\Root\Database\Seeders; -use Cone\Root\Models\User; +use Cone\Root\Interfaces\Models\User; use Illuminate\Database\Seeder; +use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Hash; class RootTestDataSeeder extends Seeder @@ -21,7 +22,7 @@ public function run(): void */ protected function seedUsers(): void { - User::factory()->create([ + App::make(User::class)::factory()->create([ 'name' => 'Root Admin', 'email' => 'admin@root.local', 'password' => Hash::make('password'), diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 4157ebc35..000000000 --- a/jest.config.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - roots: ['/js-tests'], - moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], - testRegex: 'js-tests/.*.spec.js$', - transform: { - '^.+\\.js$': '/node_modules/babel-jest', - '.*\\.(vue)$': '/node_modules/vue-jest', - }, - setupFiles: ['/js-tests/config.js'], - globals: { - __PATH_PREFIX__: '', - 'ts-jest': { - diagnostics: false, - }, - }, -} diff --git a/js-tests/Unit/Dispatcher.spec.js b/js-tests/Unit/Dispatcher.spec.js deleted file mode 100644 index c3ee82f14..000000000 --- a/js-tests/Unit/Dispatcher.spec.js +++ /dev/null @@ -1,38 +0,0 @@ -import Dispatcher from '../../resources/js/Support/Dispatcher.js'; - -const dispatcher = new Dispatcher(); - -test('it listens to events', () => { - let event = null; - - dispatcher.addEventListener('test', () => event = 'called'); - - expect(event).toBeNull(); - dispatcher.dispatchEvent('test'); - expect(event).toBe('called'); -}); - -test('it listens to events once', () => { - let event = 0; - - dispatcher.addEventListener('test', () => event++, { once: true }); - - expect(event).toBe(0); - dispatcher.dispatchEvent('test'); - expect(event).toBe(1); - dispatcher.dispatchEvent('test'); - expect(event).toBe(1); -}); - -test('it removes event listeners', () => { - let event = 0; - const fn = () => event++; - - dispatcher.addEventListener('test', fn); - expect(event).toBe(0); - dispatcher.dispatchEvent('test'); - expect(event).toBe(1); - dispatcher.removeEventListener('test', fn); - dispatcher.dispatchEvent('test'); - expect(event).toBe(1); -}); diff --git a/js-tests/config.js b/js-tests/config.js deleted file mode 100644 index 8659d7504..000000000 --- a/js-tests/config.js +++ /dev/null @@ -1,25 +0,0 @@ -import { config } from '@vue/test-utils'; - -config.global.mocks = { - __: () => jest.fn(), - - $dispatcher: { - on: () => jest.fn(), - once: () => jest.fn(), - off: () => jest.fn(), - emit: () => jest.fn(), - }, - - $http: { - get: () => jest.fn(), - post: () => jest.fn(), - put: () => jest.fn(), - patch: () => jest.fn(), - delete: () => jest.fn(), - head: () => jest.fn(), - }, - - $inertia: { - // - }, -}; diff --git a/package.json b/package.json index 28529bbbe..2d34a56aa 100644 --- a/package.json +++ b/package.json @@ -3,23 +3,24 @@ "scripts": { "dev": "vite", "build": "vite build", - "test": "jest", - "lint": "eslint resources/js/", - "lint:sass": "stylelint resources/sass/" + "prod:build": "vite build", + "sass:lint": "stylelint resources/sass/" }, "dependencies": { - "@inertiajs/vue3": "^1.0.0", - "@tiptap/extension-highlight": "^2.0.0-beta.209", - "@tiptap/extension-history": "^2.0.0-beta.209", - "@tiptap/extension-image": "^2.0.0-beta.209", - "@tiptap/extension-link": "^2.0.0-beta.209", + "@alpinejs/focus": "^3.12.3", + "@tiptap/extension-highlight": "^2.0.3", + "@tiptap/extension-history": "^2.0.3", + "@tiptap/extension-image": "^2.0.3", + "@tiptap/extension-link": "^2.0.3", "@tiptap/extension-text-align": "^2.0.3", - "@tiptap/pm": "^2.0.0-beta.220", - "@tiptap/starter-kit": "^2.0.0-beta.207", - "@tiptap/vue-3": "^2.0.0-beta.96", - "@vitejs/plugin-vue": "^4.0.0", - "@vue/compiler-sfc": "^3.0.5", - "laravel-vite-plugin": "^0.7.3", + "@tiptap/extension-underline": "^2.0.4", + "@tiptap/pm": "^2.0.3", + "@tiptap/starter-kit": "^2.0.3", + "acorn": "^8.10.0", + "alpinejs": "^3.12.3", + "apexcharts": "^3.42.0", + "axios": "^1.4.0", + "laravel-vite-plugin": "^0.7.8", "postcss": "^8.2.4", "prosemirror-commands": "^1.5.0", "prosemirror-dropcursor": "^1.6.1", @@ -30,20 +31,15 @@ "resolve-url-loader": "^3.1.2", "sass": "^1.32.4", "sass-loader": "^8.0.0", - "sprucecss": "^1.2.0", - "vite": "^4.3.0", - "vue": "^3.2.39", - "vue-loader": "^16.1.0" + "sprucecss": "^2.2.1", + "tiptap": "^1.32.2", + "vite": "^4.3.0" }, "devDependencies": { - "@babel/preset-env": "^7.18.10", - "@vue/test-utils": "^2.0.0-rc.1", - "eslint": "^7.20.0", - "eslint-plugin-vue": "^7.6.0", - "jest": "^26.6.3", "stylelint": "^14.2.0", - "typescript": "^4.1.5", - "vue-jest": "^5.0.0-alpha.7" + "stylelint-config-sass-guidelines": "^10.0.0" }, - "version": "0.0.0" + "engines": { + "node": "^18.0 || ^19.0 || ^20.0" + } } diff --git a/phpunit.xml.dist b/phpunit.xml.dist index c4b1be35a..caf151847 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,16 +1,6 @@ - + - - ./src - - - ./src/Interfaces - @@ -31,4 +21,12 @@ + + + ./src + + + ./src/Interfaces + + diff --git a/public/build/assets/app-1374d9a4.js b/public/build/assets/app-1374d9a4.js new file mode 100644 index 000000000..48356d4eb --- /dev/null +++ b/public/build/assets/app-1374d9a4.js @@ -0,0 +1 @@ +import{a as f}from"./app-99dd4812.js";export{f as default}; diff --git a/public/build/assets/app-55953ca5.js b/public/build/assets/app-55953ca5.js deleted file mode 100644 index 4e7870a61..000000000 --- a/public/build/assets/app-55953ca5.js +++ /dev/null @@ -1,177 +0,0 @@ -function Wc(t,e){const n=Object.create(null),r=t.split(",");for(let i=0;i!!n[i.toLowerCase()]:i=>!!n[i]}const $1="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt",L1=Wc($1);function gt(t){if(de(t)){const e={};for(let n=0;n{if(n){const r=n.split(F1);r.length>1&&(e[r[0].trim()]=r[1].trim())}}),e}function se(t){let e="";if(nt(t))e=t;else if(de(t))for(let n=0;nmi(n,e))}const q=t=>nt(t)?t:t==null?"":de(t)||Ye(t)&&(t.toString===rb||!we(t.toString))?JSON.stringify(t,nb,2):String(t),nb=(t,e)=>e&&e.__v_isRef?nb(t,e.value):Ks(e)?{[`Map(${e.size})`]:[...e.entries()].reduce((n,[r,i])=>(n[`${r} =>`]=i,n),{})}:vs(e)?{[`Set(${e.size})`]:[...e.values()]}:Ye(e)&&!de(e)&&!ib(e)?String(e):e,Ue={},Ws=[],zn=()=>{},W1=()=>!1,K1=/^on[^a-z]/,zl=t=>K1.test(t),Tp=t=>t.startsWith("onUpdate:"),at=Object.assign,Cp=(t,e)=>{const n=t.indexOf(e);n>-1&&t.splice(n,1)},J1=Object.prototype.hasOwnProperty,Fe=(t,e)=>J1.call(t,e),de=Array.isArray,Ks=t=>Eo(t)==="[object Map]",vs=t=>Eo(t)==="[object Set]",Qh=t=>Eo(t)==="[object Date]",G1=t=>Eo(t)==="[object RegExp]",we=t=>typeof t=="function",nt=t=>typeof t=="string",Ol=t=>typeof t=="symbol",Ye=t=>t!==null&&typeof t=="object",Mp=t=>Ye(t)&&we(t.then)&&we(t.catch),rb=Object.prototype.toString,Eo=t=>rb.call(t),Y1=t=>Eo(t).slice(8,-1),ib=t=>Eo(t)==="[object Object]",Np=t=>nt(t)&&t!=="NaN"&&t[0]!=="-"&&""+parseInt(t,10)===t,rl=Wc(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Jc=t=>{const e=Object.create(null);return n=>e[n]||(e[n]=t(n))},X1=/-(\w)/g,sn=Jc(t=>t.replace(X1,(e,n)=>n?n.toUpperCase():"")),Q1=/\B([A-Z])/g,An=Jc(t=>t.replace(Q1,"-$1").toLowerCase()),ql=Jc(t=>t.charAt(0).toUpperCase()+t.slice(1)),il=Jc(t=>t?`on${ql(t)}`:""),io=(t,e)=>!Object.is(t,e),Js=(t,e)=>{for(let n=0;n{Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:n})},Za=t=>{const e=parseFloat(t);return isNaN(e)?t:e},ec=t=>{const e=nt(t)?Number(t):NaN;return isNaN(e)?t:e};let Zh;const Z1=()=>Zh||(Zh=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let mn;class Pp{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this.parent=mn,!e&&mn&&(this.index=(mn.scopes||(mn.scopes=[])).push(this)-1)}get active(){return this._active}run(e){if(this._active){const n=mn;try{return mn=this,e()}finally{mn=n}}}on(){mn=this}off(){mn=this.parent}stop(e){if(this._active){let n,r;for(n=0,r=this.effects.length;n{const e=new Set(t);return e.w=0,e.n=0,e},lb=t=>(t.w&gi)>0,ab=t=>(t.n&gi)>0,nS=({deps:t})=>{if(t.length)for(let e=0;e{const{deps:e}=t;if(e.length){let n=0;for(let r=0;r{(u==="length"||u>=a)&&l.push(c)})}else switch(n!==void 0&&l.push(o.get(n)),e){case"add":de(t)?Np(n)&&l.push(o.get("length")):(l.push(o.get(Yi)),Ks(t)&&l.push(o.get(vd)));break;case"delete":de(t)||(l.push(o.get(Yi)),Ks(t)&&l.push(o.get(vd)));break;case"set":Ks(t)&&l.push(o.get(Yi));break}if(l.length===1)l[0]&&_d(l[0]);else{const a=[];for(const c of l)c&&a.push(...c);_d(Rp(a))}}function _d(t,e){const n=de(t)?t:[...t];for(const r of n)r.computed&&tm(r);for(const r of n)r.computed||tm(r)}function tm(t,e){(t!==Bn||t.allowRecurse)&&(t.scheduler?t.scheduler():t.run())}function oS(t,e){var n;return(n=tc.get(t))===null||n===void 0?void 0:n.get(e)}const lS=Wc("__proto__,__v_isRef,__isVue"),fb=new Set(Object.getOwnPropertyNames(Symbol).filter(t=>t!=="arguments"&&t!=="caller").map(t=>Symbol[t]).filter(Ol)),aS=Gc(),cS=Gc(!1,!0),uS=Gc(!0),fS=Gc(!0,!0),nm=dS();function dS(){const t={};return["includes","indexOf","lastIndexOf"].forEach(e=>{t[e]=function(...n){const r=Le(this);for(let s=0,o=this.length;s{t[e]=function(...n){To();const r=Le(this)[e].apply(this,n);return Co(),r}}),t}function pS(t){const e=Le(this);return cn(e,"has",t),e.hasOwnProperty(t)}function Gc(t=!1,e=!1){return function(r,i,s){if(i==="__v_isReactive")return!t;if(i==="__v_isReadonly")return t;if(i==="__v_isShallow")return e;if(i==="__v_raw"&&s===(t?e?bb:yb:e?gb:mb).get(r))return r;const o=de(r);if(!t){if(o&&Fe(nm,i))return Reflect.get(nm,i,s);if(i==="hasOwnProperty")return pS}const l=Reflect.get(r,i,s);return(Ol(i)?fb.has(i):lS(i))||(t||cn(r,"get",i),e)?l:St(l)?o&&Np(i)?l:l.value:Ye(l)?t?Dp(l):Mo(l):l}}const hS=db(),mS=db(!0);function db(t=!1){return function(n,r,i,s){let o=n[r];if(cs(o)&&St(o)&&!St(i))return!1;if(!t&&(!xl(i)&&!cs(i)&&(o=Le(o),i=Le(i)),!de(n)&&St(o)&&!St(i)))return o.value=i,!0;const l=de(n)&&Np(r)?Number(r)t,Yc=t=>Reflect.getPrototypeOf(t);function ha(t,e,n=!1,r=!1){t=t.__v_raw;const i=Le(t),s=Le(e);n||(e!==s&&cn(i,"get",e),cn(i,"get",s));const{has:o}=Yc(i),l=r?Ip:n?Lp:Al;if(o.call(i,e))return l(t.get(e));if(o.call(i,s))return l(t.get(s));t!==i&&t.get(e)}function ma(t,e=!1){const n=this.__v_raw,r=Le(n),i=Le(t);return e||(t!==i&&cn(r,"has",t),cn(r,"has",i)),t===i?n.has(t):n.has(t)||n.has(i)}function ga(t,e=!1){return t=t.__v_raw,!e&&cn(Le(t),"iterate",Yi),Reflect.get(t,"size",t)}function rm(t){t=Le(t);const e=Le(this);return Yc(e).has.call(e,t)||(e.add(t),Lr(e,"add",t,t)),this}function im(t,e){e=Le(e);const n=Le(this),{has:r,get:i}=Yc(n);let s=r.call(n,t);s||(t=Le(t),s=r.call(n,t));const o=i.call(n,t);return n.set(t,e),s?io(e,o)&&Lr(n,"set",t,e):Lr(n,"add",t,e),this}function sm(t){const e=Le(this),{has:n,get:r}=Yc(e);let i=n.call(e,t);i||(t=Le(t),i=n.call(e,t)),r&&r.call(e,t);const s=e.delete(t);return i&&Lr(e,"delete",t,void 0),s}function om(){const t=Le(this),e=t.size!==0,n=t.clear();return e&&Lr(t,"clear",void 0,void 0),n}function ya(t,e){return function(r,i){const s=this,o=s.__v_raw,l=Le(o),a=e?Ip:t?Lp:Al;return!t&&cn(l,"iterate",Yi),o.forEach((c,u)=>r.call(i,a(c),a(u),s))}}function ba(t,e,n){return function(...r){const i=this.__v_raw,s=Le(i),o=Ks(s),l=t==="entries"||t===Symbol.iterator&&o,a=t==="keys"&&o,c=i[t](...r),u=n?Ip:e?Lp:Al;return!e&&cn(s,"iterate",a?vd:Yi),{next(){const{value:f,done:d}=c.next();return d?{value:f,done:d}:{value:l?[u(f[0]),u(f[1])]:u(f),done:d}},[Symbol.iterator](){return this}}}}function Wr(t){return function(...e){return t==="delete"?!1:this}}function SS(){const t={get(s){return ha(this,s)},get size(){return ga(this)},has:ma,add:rm,set:im,delete:sm,clear:om,forEach:ya(!1,!1)},e={get(s){return ha(this,s,!1,!0)},get size(){return ga(this)},has:ma,add:rm,set:im,delete:sm,clear:om,forEach:ya(!1,!0)},n={get(s){return ha(this,s,!0)},get size(){return ga(this,!0)},has(s){return ma.call(this,s,!0)},add:Wr("add"),set:Wr("set"),delete:Wr("delete"),clear:Wr("clear"),forEach:ya(!0,!1)},r={get(s){return ha(this,s,!0,!0)},get size(){return ga(this,!0)},has(s){return ma.call(this,s,!0)},add:Wr("add"),set:Wr("set"),delete:Wr("delete"),clear:Wr("clear"),forEach:ya(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{t[s]=ba(s,!1,!1),n[s]=ba(s,!0,!1),e[s]=ba(s,!1,!0),r[s]=ba(s,!0,!0)}),[t,n,e,r]}const[wS,kS,OS,xS]=SS();function Xc(t,e){const n=e?t?xS:OS:t?kS:wS;return(r,i,s)=>i==="__v_isReactive"?!t:i==="__v_isReadonly"?t:i==="__v_raw"?r:Reflect.get(Fe(n,i)&&i in r?n:r,i,s)}const AS={get:Xc(!1,!1)},ES={get:Xc(!1,!0)},TS={get:Xc(!0,!1)},CS={get:Xc(!0,!0)},mb=new WeakMap,gb=new WeakMap,yb=new WeakMap,bb=new WeakMap;function MS(t){switch(t){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function NS(t){return t.__v_skip||!Object.isExtensible(t)?0:MS(Y1(t))}function Mo(t){return cs(t)?t:Qc(t,!1,pb,AS,mb)}function vb(t){return Qc(t,!1,vS,ES,gb)}function Dp(t){return Qc(t,!0,hb,TS,yb)}function PS(t){return Qc(t,!0,_S,CS,bb)}function Qc(t,e,n,r,i){if(!Ye(t)||t.__v_raw&&!(e&&t.__v_isReactive))return t;const s=i.get(t);if(s)return s;const o=NS(t);if(o===0)return t;const l=new Proxy(t,o===2?r:n);return i.set(t,l),l}function Xi(t){return cs(t)?Xi(t.__v_raw):!!(t&&t.__v_isReactive)}function cs(t){return!!(t&&t.__v_isReadonly)}function xl(t){return!!(t&&t.__v_isShallow)}function $p(t){return Xi(t)||cs(t)}function Le(t){const e=t&&t.__v_raw;return e?Le(e):t}function so(t){return Qa(t,"__v_skip",!0),t}const Al=t=>Ye(t)?Mo(t):t,Lp=t=>Ye(t)?Dp(t):t;function Bp(t){ui&&Bn&&(t=Le(t),ub(t.dep||(t.dep=Rp())))}function Zc(t,e){t=Le(t);const n=t.dep;n&&_d(n)}function St(t){return!!(t&&t.__v_isRef===!0)}function pr(t){return Sb(t,!1)}function _b(t){return Sb(t,!0)}function Sb(t,e){return St(t)?t:new RS(t,e)}class RS{constructor(e,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?e:Le(e),this._value=n?e:Al(e)}get value(){return Bp(this),this._value}set value(e){const n=this.__v_isShallow||xl(e)||cs(e);e=n?e:Le(e),io(e,this._rawValue)&&(this._rawValue=e,this._value=n?e:Al(e),Zc(this))}}function IS(t){Zc(t)}function Fp(t){return St(t)?t.value:t}const DS={get:(t,e,n)=>Fp(Reflect.get(t,e,n)),set:(t,e,n,r)=>{const i=t[e];return St(i)&&!St(n)?(i.value=n,!0):Reflect.set(t,e,n,r)}};function Hp(t){return Xi(t)?t:new Proxy(t,DS)}class $S{constructor(e){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=e(()=>Bp(this),()=>Zc(this));this._get=n,this._set=r}get value(){return this._get()}set value(e){this._set(e)}}function wb(t){return new $S(t)}function LS(t){const e=de(t)?new Array(t.length):{};for(const n in t)e[n]=kb(t,n);return e}class BS{constructor(e,n,r){this._object=e,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const e=this._object[this._key];return e===void 0?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return oS(Le(this._object),this._key)}}function kb(t,e,n){const r=t[e];return St(r)?r:new BS(t,e,n)}var Ob;class FS{constructor(e,n,r,i){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this[Ob]=!1,this._dirty=!0,this.effect=new Ul(e,()=>{this._dirty||(this._dirty=!0,Zc(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!i,this.__v_isReadonly=r}get value(){const e=Le(this);return Bp(e),(e._dirty||!e._cacheable)&&(e._dirty=!1,e._value=e.effect.run()),e._value}set value(e){this._setter(e)}}Ob="__v_isReadonly";function HS(t,e,n=!1){let r,i;const s=we(t);return s?(r=t,i=zn):(r=t.get,i=t.set),new FS(r,i,s||!i,n)}function jS(t,...e){}function VS(t,e){}function Ir(t,e,n,r){let i;try{i=r?t(...r):t()}catch(s){_s(s,e,n)}return i}function bn(t,e,n,r){if(we(t)){const s=Ir(t,e,n,r);return s&&Mp(s)&&s.catch(o=>{_s(o,e,n)}),s}const i=[];for(let s=0;s>>1;Tl(Vt[r])lr&&Vt.splice(e,1)}function Vp(t){de(t)?Gs.push(...t):(!Er||!Er.includes(t,t.allowRecurse?Hi+1:Hi))&&Gs.push(t),Ab()}function lm(t,e=El?lr+1:0){for(;eTl(n)-Tl(r)),Hi=0;Hit.id==null?1/0:t.id,WS=(t,e)=>{const n=Tl(t)-Tl(e);if(n===0){if(t.pre&&!e.pre)return-1;if(e.pre&&!t.pre)return 1}return n};function Eb(t){Sd=!1,El=!0,Vt.sort(WS);const e=zn;try{for(lr=0;lrRs.emit(i,...s)),va=[]):typeof window<"u"&&window.HTMLElement&&!(!((r=(n=window.navigator)===null||n===void 0?void 0:n.userAgent)===null||r===void 0)&&r.includes("jsdom"))?((e.__VUE_DEVTOOLS_HOOK_REPLAY__=e.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{Tb(s,e)}),setTimeout(()=>{Rs||(e.__VUE_DEVTOOLS_HOOK_REPLAY__=null,va=[])},3e3)):va=[]}function KS(t,e,...n){if(t.isUnmounted)return;const r=t.vnode.props||Ue;let i=n;const s=e.startsWith("update:"),o=s&&e.slice(7);if(o&&o in r){const u=`${o==="modelValue"?"model":o}Modifiers`,{number:f,trim:d}=r[u]||Ue;d&&(i=n.map(m=>nt(m)?m.trim():m)),f&&(i=n.map(Za))}let l,a=r[l=il(e)]||r[l=il(sn(e))];!a&&s&&(a=r[l=il(An(e))]),a&&bn(a,t,6,i);const c=r[l+"Once"];if(c){if(!t.emitted)t.emitted={};else if(t.emitted[l])return;t.emitted[l]=!0,bn(c,t,6,i)}}function Cb(t,e,n=!1){const r=e.emitsCache,i=r.get(t);if(i!==void 0)return i;const s=t.emits;let o={},l=!1;if(!we(t)){const a=c=>{const u=Cb(c,e,!0);u&&(l=!0,at(o,u))};!n&&e.mixins.length&&e.mixins.forEach(a),t.extends&&a(t.extends),t.mixins&&t.mixins.forEach(a)}return!s&&!l?(Ye(t)&&r.set(t,null),null):(de(s)?s.forEach(a=>o[a]=null):at(o,s),Ye(t)&&r.set(t,o),o)}function nu(t,e){return!t||!zl(e)?!1:(e=e.slice(2).replace(/Once$/,""),Fe(t,e[0].toLowerCase()+e.slice(1))||Fe(t,An(e))||Fe(t,e))}let Mt=null,ru=null;function Cl(t){const e=Mt;return Mt=t,ru=t&&t.type.__scopeId||null,e}function JS(t){ru=t}function GS(){ru=null}const YS=t=>Je;function Je(t,e=Mt,n){if(!e||t._n)return t;const r=(...i)=>{r._d&&Td(-1);const s=Cl(e);let o;try{o=t(...i)}finally{Cl(s),r._d&&Td(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function Fa(t){const{type:e,vnode:n,proxy:r,withProxy:i,props:s,propsOptions:[o],slots:l,attrs:a,emit:c,render:u,renderCache:f,data:d,setupState:m,ctx:h,inheritAttrs:g}=t;let S,_;const v=Cl(t);try{if(n.shapeFlag&4){const b=i||r;S=gn(u.call(b,b,f,s,m,d,h)),_=a}else{const b=e;S=gn(b.length>1?b(s,{attrs:a,slots:l,emit:c}):b(s,null)),_=e.props?a:QS(a)}}catch(b){al.length=0,_s(b,t,1),S=V(zt)}let k=S;if(_&&g!==!1){const b=Object.keys(_),{shapeFlag:N}=k;b.length&&N&7&&(o&&b.some(Tp)&&(_=ZS(_,o)),k=mr(k,_))}return n.dirs&&(k=mr(k),k.dirs=k.dirs?k.dirs.concat(n.dirs):n.dirs),n.transition&&(k.transition=n.transition),S=k,Cl(v),S}function XS(t){let e;for(let n=0;n{let e;for(const n in t)(n==="class"||n==="style"||zl(n))&&((e||(e={}))[n]=t[n]);return e},ZS=(t,e)=>{const n={};for(const r in t)(!Tp(r)||!(r.slice(9)in e))&&(n[r]=t[r]);return n};function ew(t,e,n){const{props:r,children:i,component:s}=t,{props:o,children:l,patchFlag:a}=e,c=s.emitsOptions;if(e.dirs||e.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return r?am(r,o,c):!!o;if(a&8){const u=e.dynamicProps;for(let f=0;ft.__isSuspense,tw={name:"Suspense",__isSuspense:!0,process(t,e,n,r,i,s,o,l,a,c){t==null?rw(e,n,r,i,s,o,l,a,c):iw(t,e,n,r,i,o,l,a,c)},hydrate:sw,create:qp,normalize:ow},nw=tw;function Ml(t,e){const n=t.props&&t.props[e];we(n)&&n()}function rw(t,e,n,r,i,s,o,l,a){const{p:c,o:{createElement:u}}=a,f=u("div"),d=t.suspense=qp(t,i,r,e,f,n,s,o,l,a);c(null,d.pendingBranch=t.ssContent,f,null,r,d,s,o),d.deps>0?(Ml(t,"onPending"),Ml(t,"onFallback"),c(null,t.ssFallback,e,n,r,null,s,o),Ys(d,t.ssFallback)):d.resolve()}function iw(t,e,n,r,i,s,o,l,{p:a,um:c,o:{createElement:u}}){const f=e.suspense=t.suspense;f.vnode=e,e.el=t.el;const d=e.ssContent,m=e.ssFallback,{activeBranch:h,pendingBranch:g,isInFallback:S,isHydrating:_}=f;if(g)f.pendingBranch=d,Fn(d,g)?(a(g,d,f.hiddenContainer,null,i,f,s,o,l),f.deps<=0?f.resolve():S&&(a(h,m,n,r,i,null,s,o,l),Ys(f,m))):(f.pendingId++,_?(f.isHydrating=!1,f.activeBranch=g):c(g,i,f),f.deps=0,f.effects.length=0,f.hiddenContainer=u("div"),S?(a(null,d,f.hiddenContainer,null,i,f,s,o,l),f.deps<=0?f.resolve():(a(h,m,n,r,i,null,s,o,l),Ys(f,m))):h&&Fn(d,h)?(a(h,d,n,r,i,f,s,o,l),f.resolve(!0)):(a(null,d,f.hiddenContainer,null,i,f,s,o,l),f.deps<=0&&f.resolve()));else if(h&&Fn(d,h))a(h,d,n,r,i,f,s,o,l),Ys(f,d);else if(Ml(e,"onPending"),f.pendingBranch=d,f.pendingId++,a(null,d,f.hiddenContainer,null,i,f,s,o,l),f.deps<=0)f.resolve();else{const{timeout:v,pendingId:k}=f;v>0?setTimeout(()=>{f.pendingId===k&&f.fallback(m)},v):v===0&&f.fallback(m)}}function qp(t,e,n,r,i,s,o,l,a,c,u=!1){const{p:f,m:d,um:m,n:h,o:{parentNode:g,remove:S}}=c,_=t.props?ec(t.props.timeout):void 0,v={vnode:t,parent:e,parentComponent:n,isSVG:o,container:r,hiddenContainer:i,anchor:s,deps:0,pendingId:0,timeout:typeof _=="number"?_:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:u,isUnmounted:!1,effects:[],resolve(k=!1){const{vnode:b,activeBranch:N,pendingBranch:E,pendingId:P,effects:T,parentComponent:j,container:z}=v;if(v.isHydrating)v.isHydrating=!1;else if(!k){const Z=N&&E.transition&&E.transition.mode==="out-in";Z&&(N.transition.afterLeave=()=>{P===v.pendingId&&d(E,z,X,0)});let{anchor:X}=v;N&&(X=h(N),m(N,j,v,!0)),Z||d(E,z,X,0)}Ys(v,E),v.pendingBranch=null,v.isInFallback=!1;let J=v.parent,B=!1;for(;J;){if(J.pendingBranch){J.effects.push(...T),B=!0;break}J=J.parent}B||Vp(T),v.effects=[],Ml(b,"onResolve")},fallback(k){if(!v.pendingBranch)return;const{vnode:b,activeBranch:N,parentComponent:E,container:P,isSVG:T}=v;Ml(b,"onFallback");const j=h(N),z=()=>{v.isInFallback&&(f(null,k,P,j,E,null,T,l,a),Ys(v,k))},J=k.transition&&k.transition.mode==="out-in";J&&(N.transition.afterLeave=z),v.isInFallback=!0,m(N,E,null,!0),J||z()},move(k,b,N){v.activeBranch&&d(v.activeBranch,k,b,N),v.container=k},next(){return v.activeBranch&&h(v.activeBranch)},registerDep(k,b){const N=!!v.pendingBranch;N&&v.deps++;const E=k.vnode.el;k.asyncDep.catch(P=>{_s(P,k,0)}).then(P=>{if(k.isUnmounted||v.isUnmounted||v.pendingId!==k.suspenseId)return;k.asyncResolved=!0;const{vnode:T}=k;Cd(k,P,!1),E&&(T.el=E);const j=!E&&k.subTree.el;b(k,T,g(E||k.subTree.el),E?null:h(k.subTree),v,o,a),j&&S(j),zp(k,T.el),N&&--v.deps===0&&v.resolve()})},unmount(k,b){v.isUnmounted=!0,v.activeBranch&&m(v.activeBranch,n,k,b),v.pendingBranch&&m(v.pendingBranch,n,k,b)}};return v}function sw(t,e,n,r,i,s,o,l,a){const c=e.suspense=qp(e,r,n,t.parentNode,document.createElement("div"),null,i,s,o,l,!0),u=a(t,c.pendingBranch=e.ssContent,n,c,s,o);return c.deps===0&&c.resolve(),u}function ow(t){const{shapeFlag:e,children:n}=t,r=e&32;t.ssContent=cm(r?n.default:n),t.ssFallback=r?cm(n.fallback):V(zt)}function cm(t){let e;if(we(t)){const n=ds&&t._c;n&&(t._d=!1,x()),t=t(),n&&(t._d=!0,e=rn,lv())}return de(t)&&(t=XS(t)),t=gn(t),e&&!t.dynamicChildren&&(t.dynamicChildren=e.filter(n=>n!==t)),t}function Nb(t,e){e&&e.pendingBranch?de(t)?e.effects.push(...t):e.effects.push(t):Vp(t)}function Ys(t,e){t.activeBranch=e;const{vnode:n,parentComponent:r}=t,i=n.el=e.el;r&&r.subTree===n&&(r.vnode.el=i,zp(r,i))}function Pb(t,e){if(lt){let n=lt.provides;const r=lt.parent&<.parent.provides;r===n&&(n=lt.provides=Object.create(r)),n[t]=e}}function sl(t,e,n=!1){const r=lt||Mt;if(r){const i=r.parent==null?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(i&&t in i)return i[t];if(arguments.length>1)return n&&we(e)?e.call(r.proxy):e}}function Rb(t,e){return Wl(t,null,e)}function Ib(t,e){return Wl(t,null,{flush:"post"})}function lw(t,e){return Wl(t,null,{flush:"sync"})}const _a={};function Xs(t,e,n){return Wl(t,e,n)}function Wl(t,e,{immediate:n,deep:r,flush:i,onTrack:s,onTrigger:o}=Ue){const l=ob()===(lt==null?void 0:lt.scope)?lt:null;let a,c=!1,u=!1;if(St(t)?(a=()=>t.value,c=xl(t)):Xi(t)?(a=()=>t,r=!0):de(t)?(u=!0,c=t.some(k=>Xi(k)||xl(k)),a=()=>t.map(k=>{if(St(k))return k.value;if(Xi(k))return Ki(k);if(we(k))return Ir(k,l,2)})):we(t)?e?a=()=>Ir(t,l,2):a=()=>{if(!(l&&l.isUnmounted))return f&&f(),bn(t,l,3,[d])}:a=zn,e&&r){const k=a;a=()=>Ki(k())}let f,d=k=>{f=_.onStop=()=>{Ir(k,l,4)}},m;if(lo)if(d=zn,e?n&&bn(e,l,3,[a(),u?[]:void 0,d]):a(),i==="sync"){const k=vv();m=k.__watcherHandles||(k.__watcherHandles=[])}else return zn;let h=u?new Array(t.length).fill(_a):_a;const g=()=>{if(_.active)if(e){const k=_.run();(r||c||(u?k.some((b,N)=>io(b,h[N])):io(k,h)))&&(f&&f(),bn(e,l,3,[k,h===_a?void 0:u&&h[0]===_a?[]:h,d]),h=k)}else _.run()};g.allowRecurse=!!e;let S;i==="sync"?S=g:i==="post"?S=()=>Tt(g,l&&l.suspense):(g.pre=!0,l&&(g.id=l.uid),S=()=>tu(g));const _=new Ul(a,S);e?n?g():h=_.run():i==="post"?Tt(_.run.bind(_),l&&l.suspense):_.run();const v=()=>{_.stop(),l&&l.scope&&Cp(l.scope.effects,_)};return m&&m.push(v),v}function aw(t,e,n){const r=this.proxy,i=nt(t)?t.includes(".")?Db(r,t):()=>r[t]:t.bind(r,r);let s;we(e)?s=e:(s=e.handler,n=e);const o=lt;vi(this);const l=Wl(i,s.bind(r),n);return o?vi(o):fi(),l}function Db(t,e){const n=e.split(".");return()=>{let r=t;for(let i=0;i{Ki(n,e)});else if(ib(t))for(const n in t)Ki(t[n],e);return t}function Up(){const t={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ss(()=>{t.isMounted=!0}),ws(()=>{t.isUnmounting=!0}),t}const kn=[Function,Array],cw={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:kn,onEnter:kn,onAfterEnter:kn,onEnterCancelled:kn,onBeforeLeave:kn,onLeave:kn,onAfterLeave:kn,onLeaveCancelled:kn,onBeforeAppear:kn,onAppear:kn,onAfterAppear:kn,onAppearCancelled:kn},setup(t,{slots:e}){const n=jr(),r=Up();let i;return()=>{const s=e.default&&iu(e.default(),!0);if(!s||!s.length)return;let o=s[0];if(s.length>1){for(const g of s)if(g.type!==zt){o=g;break}}const l=Le(t),{mode:a}=l;if(r.isLeaving)return mf(o);const c=um(o);if(!c)return mf(o);const u=oo(c,l,r,n);us(c,u);const f=n.subTree,d=f&&um(f);let m=!1;const{getTransitionKey:h}=c.type;if(h){const g=h();i===void 0?i=g:g!==i&&(i=g,m=!0)}if(d&&d.type!==zt&&(!Fn(c,d)||m)){const g=oo(d,l,r,n);if(us(d,g),a==="out-in")return r.isLeaving=!0,g.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&n.update()},mf(o);a==="in-out"&&c.type!==zt&&(g.delayLeave=(S,_,v)=>{const k=$b(r,d);k[String(d.key)]=d,S._leaveCb=()=>{_(),S._leaveCb=void 0,delete u.delayedLeave},u.delayedLeave=v})}return o}}},Wp=cw;function $b(t,e){const{leavingVNodes:n}=t;let r=n.get(e.type);return r||(r=Object.create(null),n.set(e.type,r)),r}function oo(t,e,n,r){const{appear:i,mode:s,persisted:o=!1,onBeforeEnter:l,onEnter:a,onAfterEnter:c,onEnterCancelled:u,onBeforeLeave:f,onLeave:d,onAfterLeave:m,onLeaveCancelled:h,onBeforeAppear:g,onAppear:S,onAfterAppear:_,onAppearCancelled:v}=e,k=String(t.key),b=$b(n,t),N=(T,j)=>{T&&bn(T,r,9,j)},E=(T,j)=>{const z=j[1];N(T,j),de(T)?T.every(J=>J.length<=1)&&z():T.length<=1&&z()},P={mode:s,persisted:o,beforeEnter(T){let j=l;if(!n.isMounted)if(i)j=g||l;else return;T._leaveCb&&T._leaveCb(!0);const z=b[k];z&&Fn(t,z)&&z.el._leaveCb&&z.el._leaveCb(),N(j,[T])},enter(T){let j=a,z=c,J=u;if(!n.isMounted)if(i)j=S||a,z=_||c,J=v||u;else return;let B=!1;const Z=T._enterCb=X=>{B||(B=!0,X?N(J,[T]):N(z,[T]),P.delayedLeave&&P.delayedLeave(),T._enterCb=void 0)};j?E(j,[T,Z]):Z()},leave(T,j){const z=String(t.key);if(T._enterCb&&T._enterCb(!0),n.isUnmounting)return j();N(f,[T]);let J=!1;const B=T._leaveCb=Z=>{J||(J=!0,j(),Z?N(h,[T]):N(m,[T]),T._leaveCb=void 0,b[z]===t&&delete b[z])};b[z]=t,d?E(d,[T,B]):B()},clone(T){return oo(T,e,n,r)}};return P}function mf(t){if(Kl(t))return t=mr(t),t.children=null,t}function um(t){return Kl(t)?t.children?t.children[0]:void 0:t}function us(t,e){t.shapeFlag&6&&t.component?us(t.component.subTree,e):t.shapeFlag&128?(t.ssContent.transition=e.clone(t.ssContent),t.ssFallback.transition=e.clone(t.ssFallback)):t.transition=e}function iu(t,e=!1,n){let r=[],i=0;for(let s=0;s1)for(let s=0;s!!t.type.__asyncLoader;function uw(t){we(t)&&(t={loader:t});const{loader:e,loadingComponent:n,errorComponent:r,delay:i=200,timeout:s,suspensible:o=!0,onError:l}=t;let a=null,c,u=0;const f=()=>(u++,a=null,d()),d=()=>{let m;return a||(m=a=e().catch(h=>{if(h=h instanceof Error?h:new Error(String(h)),l)return new Promise((g,S)=>{l(h,()=>g(f()),()=>S(h),u+1)});throw h}).then(h=>m!==a&&a?a:(h&&(h.__esModule||h[Symbol.toStringTag]==="Module")&&(h=h.default),c=h,h)))};return Kn({name:"AsyncComponentWrapper",__asyncLoader:d,get __asyncResolved(){return c},setup(){const m=lt;if(c)return()=>gf(c,m);const h=v=>{a=null,_s(v,m,13,!r)};if(o&&m.suspense||lo)return d().then(v=>()=>gf(v,m)).catch(v=>(h(v),()=>r?V(r,{error:v}):null));const g=pr(!1),S=pr(),_=pr(!!i);return i&&setTimeout(()=>{_.value=!1},i),s!=null&&setTimeout(()=>{if(!g.value&&!S.value){const v=new Error(`Async component timed out after ${s}ms.`);h(v),S.value=v}},s),d().then(()=>{g.value=!0,m.parent&&Kl(m.parent.vnode)&&tu(m.parent.update)}).catch(v=>{h(v),S.value=v}),()=>{if(g.value&&c)return gf(c,m);if(S.value&&r)return V(r,{error:S.value});if(n&&!_.value)return V(n)}}})}function gf(t,e){const{ref:n,props:r,children:i,ce:s}=e.vnode,o=V(t,r,i);return o.ref=n,o.ce=s,delete e.vnode.ce,o}const Kl=t=>t.type.__isKeepAlive,fw={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(t,{slots:e}){const n=jr(),r=n.ctx;if(!r.renderer)return()=>{const v=e.default&&e.default();return v&&v.length===1?v[0]:v};const i=new Map,s=new Set;let o=null;const l=n.suspense,{renderer:{p:a,m:c,um:u,o:{createElement:f}}}=r,d=f("div");r.activate=(v,k,b,N,E)=>{const P=v.component;c(v,k,b,0,l),a(P.vnode,v,k,b,P,l,N,v.slotScopeIds,E),Tt(()=>{P.isDeactivated=!1,P.a&&Js(P.a);const T=v.props&&v.props.onVnodeMounted;T&&tn(T,P.parent,v)},l)},r.deactivate=v=>{const k=v.component;c(v,d,null,1,l),Tt(()=>{k.da&&Js(k.da);const b=v.props&&v.props.onVnodeUnmounted;b&&tn(b,k.parent,v),k.isDeactivated=!0},l)};function m(v){yf(v),u(v,n,l,!0)}function h(v){i.forEach((k,b)=>{const N=Nd(k.type);N&&(!v||!v(N))&&g(b)})}function g(v){const k=i.get(v);!o||!Fn(k,o)?m(k):o&&yf(o),i.delete(v),s.delete(v)}Xs(()=>[t.include,t.exclude],([v,k])=>{v&&h(b=>Qo(v,b)),k&&h(b=>!Qo(k,b))},{flush:"post",deep:!0});let S=null;const _=()=>{S!=null&&i.set(S,bf(n.subTree))};return Ss(_),ou(_),ws(()=>{i.forEach(v=>{const{subTree:k,suspense:b}=n,N=bf(k);if(v.type===N.type&&v.key===N.key){yf(N);const E=N.component.da;E&&Tt(E,b);return}m(v)})}),()=>{if(S=null,!e.default)return null;const v=e.default(),k=v[0];if(v.length>1)return o=null,v;if(!bi(k)||!(k.shapeFlag&4)&&!(k.shapeFlag&128))return o=null,k;let b=bf(k);const N=b.type,E=Nd(Qi(b)?b.type.__asyncResolved||{}:N),{include:P,exclude:T,max:j}=t;if(P&&(!E||!Qo(P,E))||T&&E&&Qo(T,E))return o=b,k;const z=b.key==null?N:b.key,J=i.get(z);return b.el&&(b=mr(b),k.shapeFlag&128&&(k.ssContent=b)),S=z,J?(b.el=J.el,b.component=J.component,b.transition&&us(b,b.transition),b.shapeFlag|=512,s.delete(z),s.add(z)):(s.add(z),j&&s.size>parseInt(j,10)&&g(s.values().next().value)),b.shapeFlag|=256,o=b,Mb(k.type)?k:b}}},dw=fw;function Qo(t,e){return de(t)?t.some(n=>Qo(n,e)):nt(t)?t.split(",").includes(e):G1(t)?t.test(e):!1}function Lb(t,e){Fb(t,"a",e)}function Bb(t,e){Fb(t,"da",e)}function Fb(t,e,n=lt){const r=t.__wdc||(t.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return t()});if(su(e,r,n),n){let i=n.parent;for(;i&&i.parent;)Kl(i.parent.vnode)&&pw(r,e,n,i),i=i.parent}}function pw(t,e,n,r){const i=su(e,t,r,!0);lu(()=>{Cp(r[e],i)},n)}function yf(t){t.shapeFlag&=-257,t.shapeFlag&=-513}function bf(t){return t.shapeFlag&128?t.ssContent:t}function su(t,e,n=lt,r=!1){if(n){const i=n[t]||(n[t]=[]),s=e.__weh||(e.__weh=(...o)=>{if(n.isUnmounted)return;To(),vi(n);const l=bn(e,n,t,o);return fi(),Co(),l});return r?i.unshift(s):i.push(s),s}}const Hr=t=>(e,n=lt)=>(!lo||t==="sp")&&su(t,(...r)=>e(...r),n),Hb=Hr("bm"),Ss=Hr("m"),jb=Hr("bu"),ou=Hr("u"),ws=Hr("bum"),lu=Hr("um"),Vb=Hr("sp"),zb=Hr("rtg"),qb=Hr("rtc");function Ub(t,e=lt){su("ec",t,e)}function it(t,e){const n=Mt;if(n===null)return t;const r=cu(n)||n.proxy,i=t.dirs||(t.dirs=[]);for(let s=0;se(o,l,void 0,s&&s[l]));else{const o=Object.keys(t);i=new Array(o.length);for(let l=0,a=o.length;l{const s=r.fn(...i);return s&&(s.key=r.key),s}:r.fn)}return t}function yi(t,e,n={},r,i){if(Mt.isCE||Mt.parent&&Qi(Mt.parent)&&Mt.parent.isCE)return e!=="default"&&(n.name=e),V("slot",n,r&&r());let s=t[e];s&&s._c&&(s._d=!1),x();const o=s&&Jb(s(n)),l=Re(ye,{key:n.key||o&&o.key||`_${e}`},o||(r?r():[]),o&&t._===1?64:-2);return!i&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),s&&s._c&&(s._d=!0),l}function Jb(t){return t.some(e=>bi(e)?!(e.type===zt||e.type===ye&&!Jb(e.children)):!0)?t:null}function yw(t,e){const n={};for(const r in t)n[e&&/[A-Z]/.test(r)?`on:${r}`:il(r)]=t[r];return n}const wd=t=>t?dv(t)?cu(t)||t.proxy:wd(t.parent):null,ol=at(Object.create(null),{$:t=>t,$el:t=>t.vnode.el,$data:t=>t.data,$props:t=>t.props,$attrs:t=>t.attrs,$slots:t=>t.slots,$refs:t=>t.refs,$parent:t=>wd(t.parent),$root:t=>wd(t.root),$emit:t=>t.emit,$options:t=>Gp(t),$forceUpdate:t=>t.f||(t.f=()=>tu(t.update)),$nextTick:t=>t.n||(t.n=eu.bind(t.proxy)),$watch:t=>aw.bind(t)}),vf=(t,e)=>t!==Ue&&!t.__isScriptSetup&&Fe(t,e),kd={get({_:t},e){const{ctx:n,setupState:r,data:i,props:s,accessCache:o,type:l,appContext:a}=t;let c;if(e[0]!=="$"){const m=o[e];if(m!==void 0)switch(m){case 1:return r[e];case 2:return i[e];case 4:return n[e];case 3:return s[e]}else{if(vf(r,e))return o[e]=1,r[e];if(i!==Ue&&Fe(i,e))return o[e]=2,i[e];if((c=t.propsOptions[0])&&Fe(c,e))return o[e]=3,s[e];if(n!==Ue&&Fe(n,e))return o[e]=4,n[e];Od&&(o[e]=0)}}const u=ol[e];let f,d;if(u)return e==="$attrs"&&cn(t,"get",e),u(t);if((f=l.__cssModules)&&(f=f[e]))return f;if(n!==Ue&&Fe(n,e))return o[e]=4,n[e];if(d=a.config.globalProperties,Fe(d,e))return d[e]},set({_:t},e,n){const{data:r,setupState:i,ctx:s}=t;return vf(i,e)?(i[e]=n,!0):r!==Ue&&Fe(r,e)?(r[e]=n,!0):Fe(t.props,e)||e[0]==="$"&&e.slice(1)in t?!1:(s[e]=n,!0)},has({_:{data:t,setupState:e,accessCache:n,ctx:r,appContext:i,propsOptions:s}},o){let l;return!!n[o]||t!==Ue&&Fe(t,o)||vf(e,o)||(l=s[0])&&Fe(l,o)||Fe(r,o)||Fe(ol,o)||Fe(i.config.globalProperties,o)},defineProperty(t,e,n){return n.get!=null?t._.accessCache[e]=0:Fe(n,"value")&&this.set(t,e,n.value,null),Reflect.defineProperty(t,e,n)}},bw=at({},kd,{get(t,e){if(e!==Symbol.unscopables)return kd.get(t,e,t)},has(t,e){return e[0]!=="_"&&!L1(e)}});let Od=!0;function vw(t){const e=Gp(t),n=t.proxy,r=t.ctx;Od=!1,e.beforeCreate&&dm(e.beforeCreate,t,"bc");const{data:i,computed:s,methods:o,watch:l,provide:a,inject:c,created:u,beforeMount:f,mounted:d,beforeUpdate:m,updated:h,activated:g,deactivated:S,beforeDestroy:_,beforeUnmount:v,destroyed:k,unmounted:b,render:N,renderTracked:E,renderTriggered:P,errorCaptured:T,serverPrefetch:j,expose:z,inheritAttrs:J,components:B,directives:Z,filters:X}=e;if(c&&_w(c,r,null,t.appContext.config.unwrapInjectedRef),o)for(const be in o){const he=o[be];we(he)&&(r[be]=he.bind(n))}if(i){const be=i.call(n,n);Ye(be)&&(t.data=Mo(be))}if(Od=!0,s)for(const be in s){const he=s[be],ze=we(he)?he.bind(n,n):we(he.get)?he.get.bind(n,n):zn,_e=!we(he)&&we(he.set)?he.set.bind(n):zn,Qe=gv({get:ze,set:_e});Object.defineProperty(r,be,{enumerable:!0,configurable:!0,get:()=>Qe.value,set:je=>Qe.value=je})}if(l)for(const be in l)Gb(l[be],r,n,be);if(a){const be=we(a)?a.call(n):a;Reflect.ownKeys(be).forEach(he=>{Pb(he,be[he])})}u&&dm(u,t,"c");function ae(be,he){de(he)?he.forEach(ze=>be(ze.bind(n))):he&&be(he.bind(n))}if(ae(Hb,f),ae(Ss,d),ae(jb,m),ae(ou,h),ae(Lb,g),ae(Bb,S),ae(Ub,T),ae(qb,E),ae(zb,P),ae(ws,v),ae(lu,b),ae(Vb,j),de(z))if(z.length){const be=t.exposed||(t.exposed={});z.forEach(he=>{Object.defineProperty(be,he,{get:()=>n[he],set:ze=>n[he]=ze})})}else t.exposed||(t.exposed={});N&&t.render===zn&&(t.render=N),J!=null&&(t.inheritAttrs=J),B&&(t.components=B),Z&&(t.directives=Z)}function _w(t,e,n=zn,r=!1){de(t)&&(t=xd(t));for(const i in t){const s=t[i];let o;Ye(s)?"default"in s?o=sl(s.from||i,s.default,!0):o=sl(s.from||i):o=sl(s),St(o)&&r?Object.defineProperty(e,i,{enumerable:!0,configurable:!0,get:()=>o.value,set:l=>o.value=l}):e[i]=o}}function dm(t,e,n){bn(de(t)?t.map(r=>r.bind(e.proxy)):t.bind(e.proxy),e,n)}function Gb(t,e,n,r){const i=r.includes(".")?Db(n,r):()=>n[r];if(nt(t)){const s=e[t];we(s)&&Xs(i,s)}else if(we(t))Xs(i,t.bind(n));else if(Ye(t))if(de(t))t.forEach(s=>Gb(s,e,n,r));else{const s=we(t.handler)?t.handler.bind(n):e[t.handler];we(s)&&Xs(i,s,t)}}function Gp(t){const e=t.type,{mixins:n,extends:r}=e,{mixins:i,optionsCache:s,config:{optionMergeStrategies:o}}=t.appContext,l=s.get(e);let a;return l?a=l:!i.length&&!n&&!r?a=e:(a={},i.length&&i.forEach(c=>rc(a,c,o,!0)),rc(a,e,o)),Ye(e)&&s.set(e,a),a}function rc(t,e,n,r=!1){const{mixins:i,extends:s}=e;s&&rc(t,s,n,!0),i&&i.forEach(o=>rc(t,o,n,!0));for(const o in e)if(!(r&&o==="expose")){const l=Sw[o]||n&&n[o];t[o]=l?l(t[o],e[o]):e[o]}return t}const Sw={data:pm,props:Bi,emits:Bi,methods:Bi,computed:Bi,beforeCreate:Jt,created:Jt,beforeMount:Jt,mounted:Jt,beforeUpdate:Jt,updated:Jt,beforeDestroy:Jt,beforeUnmount:Jt,destroyed:Jt,unmounted:Jt,activated:Jt,deactivated:Jt,errorCaptured:Jt,serverPrefetch:Jt,components:Bi,directives:Bi,watch:kw,provide:pm,inject:ww};function pm(t,e){return e?t?function(){return at(we(t)?t.call(this,this):t,we(e)?e.call(this,this):e)}:e:t}function ww(t,e){return Bi(xd(t),xd(e))}function xd(t){if(de(t)){const e={};for(let n=0;n0)&&!(o&16)){if(o&8){const u=t.vnode.dynamicProps;for(let f=0;f{a=!0;const[d,m]=Xb(f,e,!0);at(o,d),m&&l.push(...m)};!n&&e.mixins.length&&e.mixins.forEach(u),t.extends&&u(t.extends),t.mixins&&t.mixins.forEach(u)}if(!s&&!a)return Ye(t)&&r.set(t,Ws),Ws;if(de(s))for(let u=0;u-1,m[1]=g<0||h-1||Fe(m,"default"))&&l.push(f)}}}const c=[o,l];return Ye(t)&&r.set(t,c),c}function hm(t){return t[0]!=="$"}function mm(t){const e=t&&t.toString().match(/^\s*(function|class) (\w+)/);return e?e[2]:t===null?"null":""}function gm(t,e){return mm(t)===mm(e)}function ym(t,e){return de(e)?e.findIndex(n=>gm(n,t)):we(e)&&gm(e,t)?0:-1}const Qb=t=>t[0]==="_"||t==="$stable",Yp=t=>de(t)?t.map(gn):[gn(t)],Aw=(t,e,n)=>{if(e._n)return e;const r=Je((...i)=>Yp(e(...i)),n);return r._c=!1,r},Zb=(t,e,n)=>{const r=t._ctx;for(const i in t){if(Qb(i))continue;const s=t[i];if(we(s))e[i]=Aw(i,s,r);else if(s!=null){const o=Yp(s);e[i]=()=>o}}},ev=(t,e)=>{const n=Yp(e);t.slots.default=()=>n},Ew=(t,e)=>{if(t.vnode.shapeFlag&32){const n=e._;n?(t.slots=Le(e),Qa(e,"_",n)):Zb(e,t.slots={})}else t.slots={},e&&ev(t,e);Qa(t.slots,au,1)},Tw=(t,e,n)=>{const{vnode:r,slots:i}=t;let s=!0,o=Ue;if(r.shapeFlag&32){const l=e._;l?n&&l===1?s=!1:(at(i,e),!n&&l===1&&delete i._):(s=!e.$stable,Zb(e,i)),o=e}else e&&(ev(t,e),o={default:1});if(s)for(const l in i)!Qb(l)&&!(l in o)&&delete i[l]};function tv(){return{app:null,config:{isNativeTag:W1,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Cw=0;function Mw(t,e){return function(r,i=null){we(r)||(r=Object.assign({},r)),i!=null&&!Ye(i)&&(i=null);const s=tv(),o=new Set;let l=!1;const a=s.app={_uid:Cw++,_component:r,_props:i,_container:null,_context:s,_instance:null,version:Sv,get config(){return s.config},set config(c){},use(c,...u){return o.has(c)||(c&&we(c.install)?(o.add(c),c.install(a,...u)):we(c)&&(o.add(c),c(a,...u))),a},mixin(c){return s.mixins.includes(c)||s.mixins.push(c),a},component(c,u){return u?(s.components[c]=u,a):s.components[c]},directive(c,u){return u?(s.directives[c]=u,a):s.directives[c]},mount(c,u,f){if(!l){const d=V(r,i);return d.appContext=s,u&&e?e(d,c):t(d,c,f),l=!0,a._container=c,c.__vue_app__=a,cu(d.component)||d.component.proxy}},unmount(){l&&(t(null,a._container),delete a._container.__vue_app__)},provide(c,u){return s.provides[c]=u,a}};return a}}function ic(t,e,n,r,i=!1){if(de(t)){t.forEach((d,m)=>ic(d,e&&(de(e)?e[m]:e),n,r,i));return}if(Qi(r)&&!i)return;const s=r.shapeFlag&4?cu(r.component)||r.component.proxy:r.el,o=i?null:s,{i:l,r:a}=t,c=e&&e.r,u=l.refs===Ue?l.refs={}:l.refs,f=l.setupState;if(c!=null&&c!==a&&(nt(c)?(u[c]=null,Fe(f,c)&&(f[c]=null)):St(c)&&(c.value=null)),we(a))Ir(a,l,12,[o,u]);else{const d=nt(a),m=St(a);if(d||m){const h=()=>{if(t.f){const g=d?Fe(f,a)?f[a]:u[a]:a.value;i?de(g)&&Cp(g,s):de(g)?g.includes(s)||g.push(s):d?(u[a]=[s],Fe(f,a)&&(f[a]=u[a])):(a.value=[s],t.k&&(u[t.k]=a.value))}else d?(u[a]=o,Fe(f,a)&&(f[a]=o)):m&&(a.value=o,t.k&&(u[t.k]=o))};o?(h.id=-1,Tt(h,n)):h()}}}let Kr=!1;const Sa=t=>/svg/.test(t.namespaceURI)&&t.tagName!=="foreignObject",wa=t=>t.nodeType===8;function Nw(t){const{mt:e,p:n,o:{patchProp:r,createText:i,nextSibling:s,parentNode:o,remove:l,insert:a,createComment:c}}=t,u=(_,v)=>{if(!v.hasChildNodes()){n(null,_,v),nc(),v._vnode=_;return}Kr=!1,f(v.firstChild,_,null,null,null),nc(),v._vnode=_,Kr&&console.error("Hydration completed but contains mismatches.")},f=(_,v,k,b,N,E=!1)=>{const P=wa(_)&&_.data==="[",T=()=>g(_,v,k,b,N,P),{type:j,ref:z,shapeFlag:J,patchFlag:B}=v;let Z=_.nodeType;v.el=_,B===-2&&(E=!1,v.dynamicChildren=null);let X=null;switch(j){case fs:Z!==3?v.children===""?(a(v.el=i(""),o(_),_),X=_):X=T():(_.data!==v.children&&(Kr=!0,_.data=v.children),X=s(_));break;case zt:Z!==8||P?X=T():X=s(_);break;case Zi:if(P&&(_=s(_),Z=_.nodeType),Z===1||Z===3){X=_;const ke=!v.children.length;for(let ae=0;ae{E=E||!!v.dynamicChildren;const{type:P,props:T,patchFlag:j,shapeFlag:z,dirs:J}=v,B=P==="input"&&J||P==="option";if(B||j!==-1){if(J&&rr(v,null,k,"created"),T)if(B||!E||j&48)for(const X in T)(B&&X.endsWith("value")||zl(X)&&!rl(X))&&r(_,X,null,T[X],!1,void 0,k);else T.onClick&&r(_,"onClick",null,T.onClick,!1,void 0,k);let Z;if((Z=T&&T.onVnodeBeforeMount)&&tn(Z,k,v),J&&rr(v,null,k,"beforeMount"),((Z=T&&T.onVnodeMounted)||J)&&Nb(()=>{Z&&tn(Z,k,v),J&&rr(v,null,k,"mounted")},b),z&16&&!(T&&(T.innerHTML||T.textContent))){let X=m(_.firstChild,v,_,k,b,N,E);for(;X;){Kr=!0;const ke=X;X=X.nextSibling,l(ke)}}else z&8&&_.textContent!==v.children&&(Kr=!0,_.textContent=v.children)}return _.nextSibling},m=(_,v,k,b,N,E,P)=>{P=P||!!v.dynamicChildren;const T=v.children,j=T.length;for(let z=0;z{const{slotScopeIds:P}=v;P&&(N=N?N.concat(P):P);const T=o(_),j=m(s(_),v,T,k,b,N,E);return j&&wa(j)&&j.data==="]"?s(v.anchor=j):(Kr=!0,a(v.anchor=c("]"),T,j),j)},g=(_,v,k,b,N,E)=>{if(Kr=!0,v.el=null,E){const j=S(_);for(;;){const z=s(_);if(z&&z!==j)l(z);else break}}const P=s(_),T=o(_);return l(_),n(null,v,T,P,k,b,Sa(T),N),P},S=_=>{let v=0;for(;_;)if(_=s(_),_&&wa(_)&&(_.data==="["&&v++,_.data==="]")){if(v===0)return s(_);v--}return _};return[u,f]}const Tt=Nb;function nv(t){return iv(t)}function rv(t){return iv(t,Nw)}function iv(t,e){const n=Z1();n.__VUE__=!0;const{insert:r,remove:i,patchProp:s,createElement:o,createText:l,createComment:a,setText:c,setElementText:u,parentNode:f,nextSibling:d,setScopeId:m=zn,insertStaticContent:h}=t,g=(O,C,R,F=null,L=null,G=null,te=!1,Y=null,K=!!C.dynamicChildren)=>{if(O===C)return;O&&!Fn(O,C)&&(F=Wt(O),je(O,L,G,!0),O=null),C.patchFlag===-2&&(K=!1,C.dynamicChildren=null);const{type:H,ref:ce,shapeFlag:ne}=C;switch(H){case fs:S(O,C,R,F);break;case zt:_(O,C,R,F);break;case Zi:O==null&&v(C,R,F,te);break;case ye:B(O,C,R,F,L,G,te,Y,K);break;default:ne&1?N(O,C,R,F,L,G,te,Y,K):ne&6?Z(O,C,R,F,L,G,te,Y,K):(ne&64||ne&128)&&H.process(O,C,R,F,L,G,te,Y,K,yt)}ce!=null&&L&&ic(ce,O&&O.ref,G,C||O,!C)},S=(O,C,R,F)=>{if(O==null)r(C.el=l(C.children),R,F);else{const L=C.el=O.el;C.children!==O.children&&c(L,C.children)}},_=(O,C,R,F)=>{O==null?r(C.el=a(C.children||""),R,F):C.el=O.el},v=(O,C,R,F)=>{[O.el,O.anchor]=h(O.children,C,R,F,O.el,O.anchor)},k=({el:O,anchor:C},R,F)=>{let L;for(;O&&O!==C;)L=d(O),r(O,R,F),O=L;r(C,R,F)},b=({el:O,anchor:C})=>{let R;for(;O&&O!==C;)R=d(O),i(O),O=R;i(C)},N=(O,C,R,F,L,G,te,Y,K)=>{te=te||C.type==="svg",O==null?E(C,R,F,L,G,te,Y,K):j(O,C,L,G,te,Y,K)},E=(O,C,R,F,L,G,te,Y)=>{let K,H;const{type:ce,props:ne,shapeFlag:re,transition:me,dirs:Se}=O;if(K=O.el=o(O.type,G,ne&&ne.is,ne),re&8?u(K,O.children):re&16&&T(O.children,K,null,F,L,G&&ce!=="foreignObject",te,Y),Se&&rr(O,null,F,"created"),P(K,O,O.scopeId,te,F),ne){for(const Ee in ne)Ee!=="value"&&!rl(Ee)&&s(K,Ee,null,ne[Ee],G,O.children,F,L,Ze);"value"in ne&&s(K,"value",null,ne.value),(H=ne.onVnodeBeforeMount)&&tn(H,F,O)}Se&&rr(O,null,F,"beforeMount");const Me=(!L||L&&!L.pendingBranch)&&me&&!me.persisted;Me&&me.beforeEnter(K),r(K,C,R),((H=ne&&ne.onVnodeMounted)||Me||Se)&&Tt(()=>{H&&tn(H,F,O),Me&&me.enter(K),Se&&rr(O,null,F,"mounted")},L)},P=(O,C,R,F,L)=>{if(R&&m(O,R),F)for(let G=0;G{for(let H=K;H{const Y=C.el=O.el;let{patchFlag:K,dynamicChildren:H,dirs:ce}=C;K|=O.patchFlag&16;const ne=O.props||Ue,re=C.props||Ue;let me;R&&Di(R,!1),(me=re.onVnodeBeforeUpdate)&&tn(me,R,C,O),ce&&rr(C,O,R,"beforeUpdate"),R&&Di(R,!0);const Se=L&&C.type!=="foreignObject";if(H?z(O.dynamicChildren,H,Y,R,F,Se,G):te||he(O,C,Y,null,R,F,Se,G,!1),K>0){if(K&16)J(Y,C,ne,re,R,F,L);else if(K&2&&ne.class!==re.class&&s(Y,"class",null,re.class,L),K&4&&s(Y,"style",ne.style,re.style,L),K&8){const Me=C.dynamicProps;for(let Ee=0;Ee{me&&tn(me,R,C,O),ce&&rr(C,O,R,"updated")},F)},z=(O,C,R,F,L,G,te)=>{for(let Y=0;Y{if(R!==F){if(R!==Ue)for(const Y in R)!rl(Y)&&!(Y in F)&&s(O,Y,R[Y],null,te,C.children,L,G,Ze);for(const Y in F){if(rl(Y))continue;const K=F[Y],H=R[Y];K!==H&&Y!=="value"&&s(O,Y,H,K,te,C.children,L,G,Ze)}"value"in F&&s(O,"value",R.value,F.value)}},B=(O,C,R,F,L,G,te,Y,K)=>{const H=C.el=O?O.el:l(""),ce=C.anchor=O?O.anchor:l("");let{patchFlag:ne,dynamicChildren:re,slotScopeIds:me}=C;me&&(Y=Y?Y.concat(me):me),O==null?(r(H,R,F),r(ce,R,F),T(C.children,R,ce,L,G,te,Y,K)):ne>0&&ne&64&&re&&O.dynamicChildren?(z(O.dynamicChildren,re,R,L,G,te,Y),(C.key!=null||L&&C===L.subTree)&&Xp(O,C,!0)):he(O,C,R,ce,L,G,te,Y,K)},Z=(O,C,R,F,L,G,te,Y,K)=>{C.slotScopeIds=Y,O==null?C.shapeFlag&512?L.ctx.activate(C,R,F,te,K):X(C,R,F,L,G,te,K):ke(O,C,K)},X=(O,C,R,F,L,G,te)=>{const Y=O.component=fv(O,F,L);if(Kl(O)&&(Y.ctx.renderer=yt),pv(Y),Y.asyncDep){if(L&&L.registerDep(Y,ae),!O.el){const K=Y.subTree=V(zt);_(null,K,C,R)}return}ae(Y,O,C,R,L,G,te)},ke=(O,C,R)=>{const F=C.component=O.component;if(ew(O,C,R))if(F.asyncDep&&!F.asyncResolved){be(F,C,R);return}else F.next=C,US(F.update),F.update();else C.el=O.el,F.vnode=C},ae=(O,C,R,F,L,G,te)=>{const Y=()=>{if(O.isMounted){let{next:ce,bu:ne,u:re,parent:me,vnode:Se}=O,Me=ce,Ee;Di(O,!1),ce?(ce.el=Se.el,be(O,ce,te)):ce=Se,ne&&Js(ne),(Ee=ce.props&&ce.props.onVnodeBeforeUpdate)&&tn(Ee,me,ce,Se),Di(O,!0);const qe=Fa(O),Xe=O.subTree;O.subTree=qe,g(Xe,qe,f(Xe.el),Wt(Xe),O,L,G),ce.el=qe.el,Me===null&&zp(O,qe.el),re&&Tt(re,L),(Ee=ce.props&&ce.props.onVnodeUpdated)&&Tt(()=>tn(Ee,me,ce,Se),L)}else{let ce;const{el:ne,props:re}=C,{bm:me,m:Se,parent:Me}=O,Ee=Qi(C);if(Di(O,!1),me&&Js(me),!Ee&&(ce=re&&re.onVnodeBeforeMount)&&tn(ce,Me,C),Di(O,!0),ne&&Dt){const qe=()=>{O.subTree=Fa(O),Dt(ne,O.subTree,O,L,null)};Ee?C.type.__asyncLoader().then(()=>!O.isUnmounted&&qe()):qe()}else{const qe=O.subTree=Fa(O);g(null,qe,R,F,O,L,G),C.el=qe.el}if(Se&&Tt(Se,L),!Ee&&(ce=re&&re.onVnodeMounted)){const qe=C;Tt(()=>tn(ce,Me,qe),L)}(C.shapeFlag&256||Me&&Qi(Me.vnode)&&Me.vnode.shapeFlag&256)&&O.a&&Tt(O.a,L),O.isMounted=!0,C=R=F=null}},K=O.effect=new Ul(Y,()=>tu(H),O.scope),H=O.update=()=>K.run();H.id=O.uid,Di(O,!0),H()},be=(O,C,R)=>{C.component=O;const F=O.vnode.props;O.vnode=C,O.next=null,xw(O,C.props,F,R),Tw(O,C.children,R),To(),lm(),Co()},he=(O,C,R,F,L,G,te,Y,K=!1)=>{const H=O&&O.children,ce=O?O.shapeFlag:0,ne=C.children,{patchFlag:re,shapeFlag:me}=C;if(re>0){if(re&128){_e(H,ne,R,F,L,G,te,Y,K);return}else if(re&256){ze(H,ne,R,F,L,G,te,Y,K);return}}me&8?(ce&16&&Ze(H,L,G),ne!==H&&u(R,ne)):ce&16?me&16?_e(H,ne,R,F,L,G,te,Y,K):Ze(H,L,G,!0):(ce&8&&u(R,""),me&16&&T(ne,R,F,L,G,te,Y,K))},ze=(O,C,R,F,L,G,te,Y,K)=>{O=O||Ws,C=C||Ws;const H=O.length,ce=C.length,ne=Math.min(H,ce);let re;for(re=0;rece?Ze(O,L,G,!0,!1,ne):T(C,R,F,L,G,te,Y,K,ne)},_e=(O,C,R,F,L,G,te,Y,K)=>{let H=0;const ce=C.length;let ne=O.length-1,re=ce-1;for(;H<=ne&&H<=re;){const me=O[H],Se=C[H]=K?ei(C[H]):gn(C[H]);if(Fn(me,Se))g(me,Se,R,null,L,G,te,Y,K);else break;H++}for(;H<=ne&&H<=re;){const me=O[ne],Se=C[re]=K?ei(C[re]):gn(C[re]);if(Fn(me,Se))g(me,Se,R,null,L,G,te,Y,K);else break;ne--,re--}if(H>ne){if(H<=re){const me=re+1,Se=mere)for(;H<=ne;)je(O[H],L,G,!0),H++;else{const me=H,Se=H,Me=new Map;for(H=Se;H<=re;H++){const ee=C[H]=K?ei(C[H]):gn(C[H]);ee.key!=null&&Me.set(ee.key,H)}let Ee,qe=0;const Xe=re-Se+1;let dn=!1,vr=0;const In=new Array(Xe);for(H=0;H=Xe){je(ee,L,G,!0);continue}let fe;if(ee.key!=null)fe=Me.get(ee.key);else for(Ee=Se;Ee<=re;Ee++)if(In[Ee-Se]===0&&Fn(ee,C[Ee])){fe=Ee;break}fe===void 0?je(ee,L,G,!0):(In[fe-Se]=H+1,fe>=vr?vr=fe:dn=!0,g(ee,C[fe],R,null,L,G,te,Y,K),qe++)}const I=dn?Pw(In):Ws;for(Ee=I.length-1,H=Xe-1;H>=0;H--){const ee=Se+H,fe=C[ee],Ne=ee+1{const{el:G,type:te,transition:Y,children:K,shapeFlag:H}=O;if(H&6){Qe(O.component.subTree,C,R,F);return}if(H&128){O.suspense.move(C,R,F);return}if(H&64){te.move(O,C,R,yt);return}if(te===ye){r(G,C,R);for(let ne=0;neY.enter(G),L);else{const{leave:ne,delayLeave:re,afterLeave:me}=Y,Se=()=>r(G,C,R),Me=()=>{ne(G,()=>{Se(),me&&me()})};re?re(G,Se,Me):Me()}else r(G,C,R)},je=(O,C,R,F=!1,L=!1)=>{const{type:G,props:te,ref:Y,children:K,dynamicChildren:H,shapeFlag:ce,patchFlag:ne,dirs:re}=O;if(Y!=null&&ic(Y,null,R,O,!0),ce&256){C.ctx.deactivate(O);return}const me=ce&1&&re,Se=!Qi(O);let Me;if(Se&&(Me=te&&te.onVnodeBeforeUnmount)&&tn(Me,C,O),ce&6)xe(O.component,R,F);else{if(ce&128){O.suspense.unmount(R,F);return}me&&rr(O,null,C,"beforeUnmount"),ce&64?O.type.remove(O,C,R,L,yt,F):H&&(G!==ye||ne>0&&ne&64)?Ze(H,C,R,!1,!0):(G===ye&&ne&384||!L&&ce&16)&&Ze(K,C,R),F&&st(O)}(Se&&(Me=te&&te.onVnodeUnmounted)||me)&&Tt(()=>{Me&&tn(Me,C,O),me&&rr(O,null,C,"unmounted")},R)},st=O=>{const{type:C,el:R,anchor:F,transition:L}=O;if(C===ye){It(R,F);return}if(C===Zi){b(O);return}const G=()=>{i(R),L&&!L.persisted&&L.afterLeave&&L.afterLeave()};if(O.shapeFlag&1&&L&&!L.persisted){const{leave:te,delayLeave:Y}=L,K=()=>te(R,G);Y?Y(O.el,G,K):K()}else G()},It=(O,C)=>{let R;for(;O!==C;)R=d(O),i(O),O=R;i(C)},xe=(O,C,R)=>{const{bum:F,scope:L,update:G,subTree:te,um:Y}=O;F&&Js(F),L.stop(),G&&(G.active=!1,je(te,O,C,R)),Y&&Tt(Y,C),Tt(()=>{O.isUnmounted=!0},C),C&&C.pendingBranch&&!C.isUnmounted&&O.asyncDep&&!O.asyncResolved&&O.suspenseId===C.pendingId&&(C.deps--,C.deps===0&&C.resolve())},Ze=(O,C,R,F=!1,L=!1,G=0)=>{for(let te=G;teO.shapeFlag&6?Wt(O.component.subTree):O.shapeFlag&128?O.suspense.next():d(O.anchor||O.el),et=(O,C,R)=>{O==null?C._vnode&&je(C._vnode,null,null,!0):g(C._vnode||null,O,C,null,null,null,R),lm(),nc(),C._vnode=O},yt={p:g,um:je,m:Qe,r:st,mt:X,mc:T,pc:he,pbc:z,n:Wt,o:t};let Ot,Dt;return e&&([Ot,Dt]=e(yt)),{render:et,hydrate:Ot,createApp:Mw(et,Ot)}}function Di({effect:t,update:e},n){t.allowRecurse=e.allowRecurse=n}function Xp(t,e,n=!1){const r=t.children,i=e.children;if(de(r)&&de(i))for(let s=0;s>1,t[n[l]]0&&(e[r]=n[s-1]),n[s]=r)}}for(s=n.length,o=n[s-1];s-- >0;)n[s]=o,o=e[o];return n}const Rw=t=>t.__isTeleport,ll=t=>t&&(t.disabled||t.disabled===""),bm=t=>typeof SVGElement<"u"&&t instanceof SVGElement,Ed=(t,e)=>{const n=t&&t.to;return nt(n)?e?e(n):null:n},Iw={__isTeleport:!0,process(t,e,n,r,i,s,o,l,a,c){const{mc:u,pc:f,pbc:d,o:{insert:m,querySelector:h,createText:g,createComment:S}}=c,_=ll(e.props);let{shapeFlag:v,children:k,dynamicChildren:b}=e;if(t==null){const N=e.el=g(""),E=e.anchor=g("");m(N,n,r),m(E,n,r);const P=e.target=Ed(e.props,h),T=e.targetAnchor=g("");P&&(m(T,P),o=o||bm(P));const j=(z,J)=>{v&16&&u(k,z,J,i,s,o,l,a)};_?j(n,E):P&&j(P,T)}else{e.el=t.el;const N=e.anchor=t.anchor,E=e.target=t.target,P=e.targetAnchor=t.targetAnchor,T=ll(t.props),j=T?n:E,z=T?N:P;if(o=o||bm(E),b?(d(t.dynamicChildren,b,j,i,s,o,l),Xp(t,e,!0)):a||f(t,e,j,z,i,s,o,l,!1),_)T||ka(e,n,N,c,1);else if((e.props&&e.props.to)!==(t.props&&t.props.to)){const J=e.target=Ed(e.props,h);J&&ka(e,J,null,c,0)}else T&&ka(e,E,P,c,1)}ov(e)},remove(t,e,n,r,{um:i,o:{remove:s}},o){const{shapeFlag:l,children:a,anchor:c,targetAnchor:u,target:f,props:d}=t;if(f&&s(u),(o||!ll(d))&&(s(c),l&16))for(let m=0;m0?rn||Ws:null,lv(),ds>0&&rn&&rn.push(t),t}function M(t,e,n,r,i,s){return av(w(t,e,n,r,i,s,!0))}function Re(t,e,n,r,i){return av(V(t,e,n,r,i,!0))}function bi(t){return t?t.__v_isVNode===!0:!1}function Fn(t,e){return t.type===e.type&&t.key===e.key}function $w(t){}const au="__vInternal",cv=({key:t})=>t??null,Ha=({ref:t,ref_key:e,ref_for:n})=>t!=null?nt(t)||St(t)||we(t)?{i:Mt,r:t,k:e,f:!!n}:t:null;function w(t,e=null,n=null,r=0,i=null,s=t===ye?0:1,o=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:t,props:e,key:e&&cv(e),ref:e&&Ha(e),scopeId:ru,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:Mt};return l?(Qp(a,n),s&128&&t.normalize(a)):n&&(a.shapeFlag|=nt(n)?8:16),ds>0&&!o&&rn&&(a.patchFlag>0||s&6)&&a.patchFlag!==32&&rn.push(a),a}const V=Lw;function Lw(t,e=null,n=null,r=0,i=null,s=!1){if((!t||t===Wb)&&(t=zt),bi(t)){const l=mr(t,e,!0);return n&&Qp(l,n),ds>0&&!s&&rn&&(l.shapeFlag&6?rn[rn.indexOf(t)]=l:rn.push(l)),l.patchFlag|=-2,l}if(Uw(t)&&(t=t.__vccOpts),e){e=uv(e);let{class:l,style:a}=e;l&&!nt(l)&&(e.class=se(l)),Ye(a)&&($p(a)&&!de(a)&&(a=at({},a)),e.style=gt(a))}const o=nt(t)?1:Mb(t)?128:Rw(t)?64:Ye(t)?4:we(t)?2:0;return w(t,e,n,r,i,o,s,!0)}function uv(t){return t?$p(t)||au in t?at({},t):t:null}function mr(t,e,n=!1){const{props:r,ref:i,patchFlag:s,children:o}=t,l=e?Ge(r||{},e):r;return{__v_isVNode:!0,__v_skip:!0,type:t.type,props:l,key:l&&cv(l),ref:e&&e.ref?n&&i?de(i)?i.concat(Ha(e)):[i,Ha(e)]:Ha(e):i,scopeId:t.scopeId,slotScopeIds:t.slotScopeIds,children:o,target:t.target,targetAnchor:t.targetAnchor,staticCount:t.staticCount,shapeFlag:t.shapeFlag,patchFlag:e&&t.type!==ye?s===-1?16:s|16:s,dynamicProps:t.dynamicProps,dynamicChildren:t.dynamicChildren,appContext:t.appContext,dirs:t.dirs,transition:t.transition,component:t.component,suspense:t.suspense,ssContent:t.ssContent&&mr(t.ssContent),ssFallback:t.ssFallback&&mr(t.ssFallback),el:t.el,anchor:t.anchor,ctx:t.ctx,ce:t.ce}}function tt(t=" ",e=0){return V(fs,null,t,e)}function Bw(t,e){const n=V(Zi,null,t);return n.staticCount=e,n}function oe(t="",e=!1){return e?(x(),Re(zt,null,t)):V(zt,null,t)}function gn(t){return t==null||typeof t=="boolean"?V(zt):de(t)?V(ye,null,t.slice()):typeof t=="object"?ei(t):V(fs,null,String(t))}function ei(t){return t.el===null&&t.patchFlag!==-1||t.memo?t:mr(t)}function Qp(t,e){let n=0;const{shapeFlag:r}=t;if(e==null)e=null;else if(de(e))n=16;else if(typeof e=="object")if(r&65){const i=e.default;i&&(i._c&&(i._d=!1),Qp(t,i()),i._c&&(i._d=!0));return}else{n=32;const i=e._;!i&&!(au in e)?e._ctx=Mt:i===3&&Mt&&(Mt.slots._===1?e._=1:(e._=2,t.patchFlag|=1024))}else we(e)?(e={default:e,_ctx:Mt},n=32):(e=String(e),r&64?(n=16,e=[tt(e)]):n=8);t.children=e,t.shapeFlag|=n}function Ge(...t){const e={};for(let n=0;nlt||Mt,vi=t=>{lt=t,t.scope.on()},fi=()=>{lt&<.scope.off(),lt=null};function dv(t){return t.vnode.shapeFlag&4}let lo=!1;function pv(t,e=!1){lo=e;const{props:n,children:r}=t.vnode,i=dv(t);Ow(t,n,i,e),Ew(t,r);const s=i?jw(t,e):void 0;return lo=!1,s}function jw(t,e){const n=t.type;t.accessCache=Object.create(null),t.proxy=so(new Proxy(t.ctx,kd));const{setup:r}=n;if(r){const i=t.setupContext=r.length>1?mv(t):null;vi(t),To();const s=Ir(r,t,0,[t.props,i]);if(Co(),fi(),Mp(s)){if(s.then(fi,fi),e)return s.then(o=>{Cd(t,o,e)}).catch(o=>{_s(o,t,0)});t.asyncDep=s}else Cd(t,s,e)}else hv(t,e)}function Cd(t,e,n){we(e)?t.type.__ssrInlineRender?t.ssrRender=e:t.render=e:Ye(e)&&(t.setupState=Hp(e)),hv(t,n)}let sc,Md;function Vw(t){sc=t,Md=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,bw))}}const zw=()=>!sc;function hv(t,e,n){const r=t.type;if(!t.render){if(!e&&sc&&!r.render){const i=r.template||Gp(t).template;if(i){const{isCustomElement:s,compilerOptions:o}=t.appContext.config,{delimiters:l,compilerOptions:a}=r,c=at(at({isCustomElement:s,delimiters:l},o),a);r.render=sc(i,c)}}t.render=r.render||zn,Md&&Md(t)}vi(t),To(),vw(t),Co(),fi()}function qw(t){return new Proxy(t.attrs,{get(e,n){return cn(t,"get","$attrs"),e[n]}})}function mv(t){const e=r=>{t.exposed=r||{}};let n;return{get attrs(){return n||(n=qw(t))},slots:t.slots,emit:t.emit,expose:e}}function cu(t){if(t.exposed)return t.exposeProxy||(t.exposeProxy=new Proxy(Hp(so(t.exposed)),{get(e,n){if(n in e)return e[n];if(n in ol)return ol[n](t)},has(e,n){return n in e||n in ol}}))}function Nd(t,e=!0){return we(t)?t.displayName||t.name:t.name||e&&t.__name}function Uw(t){return we(t)&&"__vccOpts"in t}const gv=(t,e)=>HS(t,e,lo);function Ww(){return null}function Kw(){return null}function Jw(t){}function Gw(t,e){return null}function Yw(){return yv().slots}function Xw(){return yv().attrs}function yv(){const t=jr();return t.setupContext||(t.setupContext=mv(t))}function Qw(t,e){const n=de(t)?t.reduce((r,i)=>(r[i]={},r),{}):t;for(const r in e){const i=n[r];i?de(i)||we(i)?n[r]={type:i,default:e[r]}:i.default=e[r]:i===null&&(n[r]={default:e[r]})}return n}function Zw(t,e){const n={};for(const r in t)e.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>t[r]});return n}function ek(t){const e=jr();let n=t();return fi(),Mp(n)&&(n=n.catch(r=>{throw vi(e),r})),[n,()=>vi(e)]}function Nt(t,e,n){const r=arguments.length;return r===2?Ye(e)&&!de(e)?bi(e)?V(t,null,[e]):V(t,e):V(t,null,e):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&bi(n)&&(n=[n]),V(t,e,n))}const bv=Symbol(""),vv=()=>sl(bv);function tk(){}function nk(t,e,n,r){const i=n[r];if(i&&_v(i,t))return i;const s=e();return s.memo=t.slice(),n[r]=s}function _v(t,e){const n=t.memo;if(n.length!=e.length)return!1;for(let r=0;r0&&rn&&rn.push(t),!0}const Sv="3.2.47",rk={createComponentInstance:fv,setupComponent:pv,renderComponentRoot:Fa,setCurrentRenderingInstance:Cl,isVNode:bi,normalizeVNode:gn},ik=rk,sk=null,ok=null,lk="http://www.w3.org/2000/svg",ji=typeof document<"u"?document:null,vm=ji&&ji.createElement("template"),ak={insert:(t,e,n)=>{e.insertBefore(t,n||null)},remove:t=>{const e=t.parentNode;e&&e.removeChild(t)},createElement:(t,e,n,r)=>{const i=e?ji.createElementNS(lk,t):ji.createElement(t,n?{is:n}:void 0);return t==="select"&&r&&r.multiple!=null&&i.setAttribute("multiple",r.multiple),i},createText:t=>ji.createTextNode(t),createComment:t=>ji.createComment(t),setText:(t,e)=>{t.nodeValue=e},setElementText:(t,e)=>{t.textContent=e},parentNode:t=>t.parentNode,nextSibling:t=>t.nextSibling,querySelector:t=>ji.querySelector(t),setScopeId(t,e){t.setAttribute(e,"")},insertStaticContent(t,e,n,r,i,s){const o=n?n.previousSibling:e.lastChild;if(i&&(i===s||i.nextSibling))for(;e.insertBefore(i.cloneNode(!0),n),!(i===s||!(i=i.nextSibling)););else{vm.innerHTML=r?`${t}`:t;const l=vm.content;if(r){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}e.insertBefore(l,n)}return[o?o.nextSibling:e.firstChild,n?n.previousSibling:e.lastChild]}};function ck(t,e,n){const r=t._vtc;r&&(e=(e?[e,...r]:[...r]).join(" ")),e==null?t.removeAttribute("class"):n?t.setAttribute("class",e):t.className=e}function uk(t,e,n){const r=t.style,i=nt(n);if(n&&!i){if(e&&!nt(e))for(const s in e)n[s]==null&&Pd(r,s,"");for(const s in n)Pd(r,s,n[s])}else{const s=r.display;i?e!==n&&(r.cssText=n):e&&t.removeAttribute("style"),"_vod"in t&&(r.display=s)}}const _m=/\s*!important$/;function Pd(t,e,n){if(de(n))n.forEach(r=>Pd(t,e,r));else if(n==null&&(n=""),e.startsWith("--"))t.setProperty(e,n);else{const r=fk(t,e);_m.test(n)?t.setProperty(An(r),n.replace(_m,""),"important"):t[r]=n}}const Sm=["Webkit","Moz","ms"],_f={};function fk(t,e){const n=_f[e];if(n)return n;let r=sn(e);if(r!=="filter"&&r in t)return _f[e]=r;r=ql(r);for(let i=0;iSf||(yk.then(()=>Sf=0),Sf=Date.now());function vk(t,e){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;bn(_k(r,n.value),e,5,[r])};return n.value=t,n.attached=bk(),n}function _k(t,e){if(de(e)){const n=t.stopImmediatePropagation;return t.stopImmediatePropagation=()=>{n.call(t),t._stopped=!0},e.map(r=>i=>!i._stopped&&r&&r(i))}else return e}const Om=/^on[a-z]/,Sk=(t,e,n,r,i=!1,s,o,l,a)=>{e==="class"?ck(t,r,i):e==="style"?uk(t,n,r):zl(e)?Tp(e)||mk(t,e,n,r,o):(e[0]==="."?(e=e.slice(1),!0):e[0]==="^"?(e=e.slice(1),!1):wk(t,e,r,i))?pk(t,e,r,s,o,l,a):(e==="true-value"?t._trueValue=r:e==="false-value"&&(t._falseValue=r),dk(t,e,r,i))};function wk(t,e,n,r){return r?!!(e==="innerHTML"||e==="textContent"||e in t&&Om.test(e)&&we(n)):e==="spellcheck"||e==="draggable"||e==="translate"||e==="form"||e==="list"&&t.tagName==="INPUT"||e==="type"&&t.tagName==="TEXTAREA"||Om.test(e)&&nt(n)?!1:e in t}function wv(t,e){const n=Kn(t);class r extends uu{constructor(s){super(n,s,e)}}return r.def=n,r}const kk=t=>wv(t,Dv),Ok=typeof HTMLElement<"u"?HTMLElement:class{};class uu extends Ok{constructor(e,n={},r){super(),this._def=e,this._props=n,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this.shadowRoot&&r?r(this._createVNode(),this.shadowRoot):(this.attachShadow({mode:"open"}),this._def.__asyncLoader||this._resolveProps(this._def))}connectedCallback(){this._connected=!0,this._instance||(this._resolved?this._update():this._resolveDef())}disconnectedCallback(){this._connected=!1,eu(()=>{this._connected||(Dd(null,this.shadowRoot),this._instance=null)})}_resolveDef(){this._resolved=!0;for(let r=0;r{for(const i of r)this._setAttr(i.attributeName)}).observe(this,{attributes:!0});const e=(r,i=!1)=>{const{props:s,styles:o}=r;let l;if(s&&!de(s))for(const a in s){const c=s[a];(c===Number||c&&c.type===Number)&&(a in this._props&&(this._props[a]=ec(this._props[a])),(l||(l=Object.create(null)))[sn(a)]=!0)}this._numberProps=l,i&&this._resolveProps(r),this._applyStyles(o),this._update()},n=this._def.__asyncLoader;n?n().then(r=>e(r,!0)):e(this._def)}_resolveProps(e){const{props:n}=e,r=de(n)?n:Object.keys(n||{});for(const i of Object.keys(this))i[0]!=="_"&&r.includes(i)&&this._setProp(i,this[i],!0,!1);for(const i of r.map(sn))Object.defineProperty(this,i,{get(){return this._getProp(i)},set(s){this._setProp(i,s)}})}_setAttr(e){let n=this.getAttribute(e);const r=sn(e);this._numberProps&&this._numberProps[r]&&(n=ec(n)),this._setProp(r,n,!1)}_getProp(e){return this._props[e]}_setProp(e,n,r=!0,i=!0){n!==this._props[e]&&(this._props[e]=n,i&&this._instance&&this._update(),r&&(n===!0?this.setAttribute(An(e),""):typeof n=="string"||typeof n=="number"?this.setAttribute(An(e),n+""):n||this.removeAttribute(An(e))))}_update(){Dd(this._createVNode(),this.shadowRoot)}_createVNode(){const e=V(this._def,at({},this._props));return this._instance||(e.ce=n=>{this._instance=n,n.isCE=!0;const r=(s,o)=>{this.dispatchEvent(new CustomEvent(s,{detail:o}))};n.emit=(s,...o)=>{r(s,o),An(s)!==s&&r(An(s),o)};let i=this;for(;i=i&&(i.parentNode||i.host);)if(i instanceof uu){n.parent=i._instance,n.provides=i._instance.provides;break}}),e}_applyStyles(e){e&&e.forEach(n=>{const r=document.createElement("style");r.textContent=n,this.shadowRoot.appendChild(r)})}}function xk(t="$style"){{const e=jr();if(!e)return Ue;const n=e.type.__cssModules;if(!n)return Ue;const r=n[t];return r||Ue}}function Ak(t){const e=jr();if(!e)return;const n=e.ut=(i=t(e.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${e.uid}"]`)).forEach(s=>Id(s,i))},r=()=>{const i=t(e.proxy);Rd(e.subTree,i),n(i)};Ib(r),Ss(()=>{const i=new MutationObserver(r);i.observe(e.subTree.el.parentNode,{childList:!0}),lu(()=>i.disconnect())})}function Rd(t,e){if(t.shapeFlag&128){const n=t.suspense;t=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Rd(n.activeBranch,e)})}for(;t.component;)t=t.component.subTree;if(t.shapeFlag&1&&t.el)Id(t.el,e);else if(t.type===ye)t.children.forEach(n=>Rd(n,e));else if(t.type===Zi){let{el:n,anchor:r}=t;for(;n&&(Id(n,e),n!==r);)n=n.nextSibling}}function Id(t,e){if(t.nodeType===1){const n=t.style;for(const r in e)n.setProperty(`--${r}`,e[r])}}const Jr="transition",Vo="animation",Zp=(t,{slots:e})=>Nt(Wp,Ov(t),e);Zp.displayName="Transition";const kv={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Ek=Zp.props=at({},Wp.props,kv),$i=(t,e=[])=>{de(t)?t.forEach(n=>n(...e)):t&&t(...e)},xm=t=>t?de(t)?t.some(e=>e.length>1):t.length>1:!1;function Ov(t){const e={};for(const B in t)B in kv||(e[B]=t[B]);if(t.css===!1)return e;const{name:n="v",type:r,duration:i,enterFromClass:s=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:c=o,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=t,h=Tk(i),g=h&&h[0],S=h&&h[1],{onBeforeEnter:_,onEnter:v,onEnterCancelled:k,onLeave:b,onLeaveCancelled:N,onBeforeAppear:E=_,onAppear:P=v,onAppearCancelled:T=k}=e,j=(B,Z,X)=>{Qr(B,Z?u:l),Qr(B,Z?c:o),X&&X()},z=(B,Z)=>{B._isLeaving=!1,Qr(B,f),Qr(B,m),Qr(B,d),Z&&Z()},J=B=>(Z,X)=>{const ke=B?P:v,ae=()=>j(Z,B,X);$i(ke,[Z,ae]),Am(()=>{Qr(Z,B?a:s),xr(Z,B?u:l),xm(ke)||Em(Z,r,g,ae)})};return at(e,{onBeforeEnter(B){$i(_,[B]),xr(B,s),xr(B,o)},onBeforeAppear(B){$i(E,[B]),xr(B,a),xr(B,c)},onEnter:J(!1),onAppear:J(!0),onLeave(B,Z){B._isLeaving=!0;const X=()=>z(B,Z);xr(B,f),Av(),xr(B,d),Am(()=>{B._isLeaving&&(Qr(B,f),xr(B,m),xm(b)||Em(B,r,S,X))}),$i(b,[B,X])},onEnterCancelled(B){j(B,!1),$i(k,[B])},onAppearCancelled(B){j(B,!0),$i(T,[B])},onLeaveCancelled(B){z(B),$i(N,[B])}})}function Tk(t){if(t==null)return null;if(Ye(t))return[wf(t.enter),wf(t.leave)];{const e=wf(t);return[e,e]}}function wf(t){return ec(t)}function xr(t,e){e.split(/\s+/).forEach(n=>n&&t.classList.add(n)),(t._vtc||(t._vtc=new Set)).add(e)}function Qr(t,e){e.split(/\s+/).forEach(r=>r&&t.classList.remove(r));const{_vtc:n}=t;n&&(n.delete(e),n.size||(t._vtc=void 0))}function Am(t){requestAnimationFrame(()=>{requestAnimationFrame(t)})}let Ck=0;function Em(t,e,n,r){const i=t._endId=++Ck,s=()=>{i===t._endId&&r()};if(n)return setTimeout(s,n);const{type:o,timeout:l,propCount:a}=xv(t,e);if(!o)return r();const c=o+"end";let u=0;const f=()=>{t.removeEventListener(c,d),s()},d=m=>{m.target===t&&++u>=a&&f()};setTimeout(()=>{u(n[h]||"").split(", "),i=r(`${Jr}Delay`),s=r(`${Jr}Duration`),o=Tm(i,s),l=r(`${Vo}Delay`),a=r(`${Vo}Duration`),c=Tm(l,a);let u=null,f=0,d=0;e===Jr?o>0&&(u=Jr,f=o,d=s.length):e===Vo?c>0&&(u=Vo,f=c,d=a.length):(f=Math.max(o,c),u=f>0?o>c?Jr:Vo:null,d=u?u===Jr?s.length:a.length:0);const m=u===Jr&&/\b(transform|all)(,|$)/.test(r(`${Jr}Property`).toString());return{type:u,timeout:f,propCount:d,hasTransform:m}}function Tm(t,e){for(;t.lengthCm(n)+Cm(t[r])))}function Cm(t){return Number(t.slice(0,-1).replace(",","."))*1e3}function Av(){return document.body.offsetHeight}const Ev=new WeakMap,Tv=new WeakMap,Cv={name:"TransitionGroup",props:at({},Ek,{tag:String,moveClass:String}),setup(t,{slots:e}){const n=jr(),r=Up();let i,s;return ou(()=>{if(!i.length)return;const o=t.moveClass||`${t.name||"v"}-move`;if(!Dk(i[0].el,n.vnode.el,o))return;i.forEach(Pk),i.forEach(Rk);const l=i.filter(Ik);Av(),l.forEach(a=>{const c=a.el,u=c.style;xr(c,o),u.transform=u.webkitTransform=u.transitionDuration="";const f=c._moveCb=d=>{d&&d.target!==c||(!d||/transform$/.test(d.propertyName))&&(c.removeEventListener("transitionend",f),c._moveCb=null,Qr(c,o))};c.addEventListener("transitionend",f)})}),()=>{const o=Le(t),l=Ov(o);let a=o.tag||ye;i=s,s=e.default?iu(e.default()):[];for(let c=0;cdelete t.mode;Cv.props;const Nk=Cv;function Pk(t){const e=t.el;e._moveCb&&e._moveCb(),e._enterCb&&e._enterCb()}function Rk(t){Tv.set(t,t.el.getBoundingClientRect())}function Ik(t){const e=Ev.get(t),n=Tv.get(t),r=e.left-n.left,i=e.top-n.top;if(r||i){const s=t.el.style;return s.transform=s.webkitTransform=`translate(${r}px,${i}px)`,s.transitionDuration="0s",t}}function Dk(t,e,n){const r=t.cloneNode();t._vtc&&t._vtc.forEach(o=>{o.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(o=>o&&r.classList.add(o)),r.style.display="none";const i=e.nodeType===1?e:e.parentNode;i.appendChild(r);const{hasTransform:s}=xv(r);return i.removeChild(r),s}const _i=t=>{const e=t.props["onUpdate:modelValue"]||!1;return de(e)?n=>Js(e,n):e};function $k(t){t.target.composing=!0}function Mm(t){const e=t.target;e.composing&&(e.composing=!1,e.dispatchEvent(new Event("input")))}const Si={created(t,{modifiers:{lazy:e,trim:n,number:r}},i){t._assign=_i(i);const s=r||i.props&&i.props.type==="number";Nr(t,e?"change":"input",o=>{if(o.target.composing)return;let l=t.value;n&&(l=l.trim()),s&&(l=Za(l)),t._assign(l)}),n&&Nr(t,"change",()=>{t.value=t.value.trim()}),e||(Nr(t,"compositionstart",$k),Nr(t,"compositionend",Mm),Nr(t,"change",Mm))},mounted(t,{value:e}){t.value=e??""},beforeUpdate(t,{value:e,modifiers:{lazy:n,trim:r,number:i}},s){if(t._assign=_i(s),t.composing||document.activeElement===t&&t.type!=="range"&&(n||r&&t.value.trim()===e||(i||t.type==="number")&&Za(t.value)===e))return;const o=e??"";t.value!==o&&(t.value=o)}},ao={deep:!0,created(t,e,n){t._assign=_i(n),Nr(t,"change",()=>{const r=t._modelValue,i=co(t),s=t.checked,o=t._assign;if(de(r)){const l=Kc(r,i),a=l!==-1;if(s&&!a)o(r.concat(i));else if(!s&&a){const c=[...r];c.splice(l,1),o(c)}}else if(vs(r)){const l=new Set(r);s?l.add(i):l.delete(i),o(l)}else o(Mv(t,s))})},mounted:Nm,beforeUpdate(t,e,n){t._assign=_i(n),Nm(t,e,n)}};function Nm(t,{value:e,oldValue:n},r){t._modelValue=e,de(e)?t.checked=Kc(e,r.props.value)>-1:vs(e)?t.checked=e.has(r.props.value):e!==n&&(t.checked=mi(e,Mv(t,!0)))}const eh={created(t,{value:e},n){t.checked=mi(e,n.props.value),t._assign=_i(n),Nr(t,"change",()=>{t._assign(co(t))})},beforeUpdate(t,{value:e,oldValue:n},r){t._assign=_i(r),e!==n&&(t.checked=mi(e,r.props.value))}},Jl={deep:!0,created(t,{value:e,modifiers:{number:n}},r){const i=vs(e);Nr(t,"change",()=>{const s=Array.prototype.filter.call(t.options,o=>o.selected).map(o=>n?Za(co(o)):co(o));t._assign(t.multiple?i?new Set(s):s:s[0])}),t._assign=_i(r)},mounted(t,{value:e}){Pm(t,e)},beforeUpdate(t,e,n){t._assign=_i(n)},updated(t,{value:e}){Pm(t,e)}};function Pm(t,e){const n=t.multiple;if(!(n&&!de(e)&&!vs(e))){for(let r=0,i=t.options.length;r-1:s.selected=e.has(o);else if(mi(co(s),e)){t.selectedIndex!==r&&(t.selectedIndex=r);return}}!n&&t.selectedIndex!==-1&&(t.selectedIndex=-1)}}function co(t){return"_value"in t?t._value:t.value}function Mv(t,e){const n=e?"_trueValue":"_falseValue";return n in t?t[n]:e}const Br={created(t,e,n){Oa(t,e,n,null,"created")},mounted(t,e,n){Oa(t,e,n,null,"mounted")},beforeUpdate(t,e,n,r){Oa(t,e,n,r,"beforeUpdate")},updated(t,e,n,r){Oa(t,e,n,r,"updated")}};function Nv(t,e){switch(t){case"SELECT":return Jl;case"TEXTAREA":return Si;default:switch(e){case"checkbox":return ao;case"radio":return eh;default:return Si}}}function Oa(t,e,n,r,i){const o=Nv(t.tagName,n.props&&n.props.type)[i];o&&o(t,e,n,r)}function Lk(){Si.getSSRProps=({value:t})=>({value:t}),eh.getSSRProps=({value:t},e)=>{if(e.props&&mi(e.props.value,t))return{checked:!0}},ao.getSSRProps=({value:t},e)=>{if(de(t)){if(e.props&&Kc(t,e.props.value)>-1)return{checked:!0}}else if(vs(t)){if(e.props&&t.has(e.props.value))return{checked:!0}}else if(t)return{checked:!0}},Br.getSSRProps=(t,e)=>{if(typeof e.type!="string")return;const n=Nv(e.type.toUpperCase(),e.props&&e.props.type);if(n.getSSRProps)return n.getSSRProps(t,e)}}const Bk=["ctrl","shift","alt","meta"],Fk={stop:t=>t.stopPropagation(),prevent:t=>t.preventDefault(),self:t=>t.target!==t.currentTarget,ctrl:t=>!t.ctrlKey,shift:t=>!t.shiftKey,alt:t=>!t.altKey,meta:t=>!t.metaKey,left:t=>"button"in t&&t.button!==0,middle:t=>"button"in t&&t.button!==1,right:t=>"button"in t&&t.button!==2,exact:(t,e)=>Bk.some(n=>t[`${n}Key`]&&!e.includes(n))},_t=(t,e)=>(n,...r)=>{for(let i=0;in=>{if(!("key"in n))return;const r=An(n.key);if(e.some(i=>i===r||Hk[i]===r))return t(n)},ks={beforeMount(t,{value:e},{transition:n}){t._vod=t.style.display==="none"?"":t.style.display,n&&e?n.beforeEnter(t):zo(t,e)},mounted(t,{value:e},{transition:n}){n&&e&&n.enter(t)},updated(t,{value:e,oldValue:n},{transition:r}){!e!=!n&&(r?e?(r.beforeEnter(t),zo(t,!0),r.enter(t)):r.leave(t,()=>{zo(t,!1)}):zo(t,e))},beforeUnmount(t,{value:e}){zo(t,e)}};function zo(t,e){t.style.display=e?t._vod:"none"}function jk(){ks.getSSRProps=({value:t})=>{if(!t)return{style:{display:"none"}}}}const Pv=at({patchProp:Sk},ak);let cl,Rm=!1;function Rv(){return cl||(cl=nv(Pv))}function Iv(){return cl=Rm?cl:rv(Pv),Rm=!0,cl}const Dd=(...t)=>{Rv().render(...t)},Dv=(...t)=>{Iv().hydrate(...t)},$v=(...t)=>{const e=Rv().createApp(...t),{mount:n}=e;return e.mount=r=>{const i=Bv(r);if(!i)return;const s=e._component;!we(s)&&!s.render&&!s.template&&(s.template=i.innerHTML),i.innerHTML="";const o=n(i,!1,i instanceof SVGElement);return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),o},e},Lv=(...t)=>{const e=Iv().createApp(...t),{mount:n}=e;return e.mount=r=>{const i=Bv(r);if(i)return n(i,!0,i instanceof SVGElement)},e};function Bv(t){return nt(t)?document.querySelector(t):t}let Im=!1;const Vk=()=>{Im||(Im=!0,Lk(),jk())},zk=()=>{},qk=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:Wp,Comment:zt,EffectScope:Pp,Fragment:ye,KeepAlive:dw,ReactiveEffect:Ul,Static:Zi,Suspense:nw,Teleport:sv,Text:fs,Transition:Zp,TransitionGroup:Nk,VueElement:uu,assertNumber:VS,callWithAsyncErrorHandling:bn,callWithErrorHandling:Ir,camelize:sn,capitalize:ql,cloneVNode:mr,compatUtils:ok,compile:zk,computed:gv,createApp:$v,createBlock:Re,createCommentVNode:oe,createElementBlock:M,createElementVNode:w,createHydrationRenderer:rv,createPropsRestProxy:Zw,createRenderer:nv,createSSRApp:Lv,createSlots:gw,createStaticVNode:Bw,createTextVNode:tt,createVNode:V,customRef:wb,defineAsyncComponent:uw,defineComponent:Kn,defineCustomElement:wv,defineEmits:Kw,defineExpose:Jw,defineProps:Ww,defineSSRCustomElement:kk,get devtools(){return Rs},effect:iS,effectScope:eS,getCurrentInstance:jr,getCurrentScope:ob,getTransitionRawChildren:iu,guardReactiveProps:uv,h:Nt,handleError:_s,hydrate:Dv,initCustomFormatter:tk,initDirectivesForSSR:Vk,inject:sl,isMemoSame:_v,isProxy:$p,isReactive:Xi,isReadonly:cs,isRef:St,isRuntimeOnly:zw,isShallow:xl,isVNode:bi,markRaw:so,mergeDefaults:Qw,mergeProps:Ge,nextTick:eu,normalizeClass:se,normalizeProps:V1,normalizeStyle:gt,onActivated:Lb,onBeforeMount:Hb,onBeforeUnmount:ws,onBeforeUpdate:jb,onDeactivated:Bb,onErrorCaptured:Ub,onMounted:Ss,onRenderTracked:qb,onRenderTriggered:zb,onScopeDispose:tS,onServerPrefetch:Vb,onUnmounted:lu,onUpdated:ou,openBlock:x,popScopeId:GS,provide:Pb,proxyRefs:Hp,pushScopeId:JS,queuePostFlushCb:Vp,reactive:Mo,readonly:Dp,ref:pr,registerRuntimeCompiler:Vw,render:Dd,renderList:Ie,renderSlot:yi,resolveComponent:U,resolveDirective:Kb,resolveDynamicComponent:mw,resolveFilter:sk,resolveTransitionHooks:oo,setBlockTracking:Td,setDevtoolsHook:Tb,setTransitionHooks:us,shallowReactive:vb,shallowReadonly:PS,shallowRef:_b,ssrContextKey:bv,ssrUtils:ik,stop:sS,toDisplayString:q,toHandlerKey:il,toHandlers:yw,toRaw:Le,toRef:kb,toRefs:LS,transformVNodeArgs:$w,triggerRef:IS,unref:Fp,useAttrs:Xw,useCssModule:xk,useCssVars:Ak,useSSRContext:vv,useSlots:Yw,useTransitionState:Up,vModelCheckbox:ao,vModelDynamic:Br,vModelRadio:eh,vModelSelect:Jl,vModelText:Si,vShow:ks,version:Sv,warn:jS,watch:Xs,watchEffect:Rb,watchPostEffect:Ib,watchSyncEffect:lw,withAsyncContext:ek,withCtx:Je,withDefaults:Gw,withDirectives:it,withKeys:Qs,withMemo:nk,withModifiers:_t,withScopeId:YS},Symbol.toStringTag,{value:"Module"})),le=(t,e)=>{const n=t.__vccOpts||t;for(const[r,i]of e)n[r]=i;return n},Uk={props:{template:{type:String,default:null},async:{type:Boolean,default:!1},url:{type:String,default:null}},inheritAttrs:!1,mounted(){this.async&&this.fetch()},data(){return{content:this.template}},methods:{fetch(){this.$http.get(this.url).then(t=>{this.content=t.data})}}},Wk=["innerHTML"];function Kk(t,e,n,r,i,s){return x(),M("div",{innerHTML:i.content},null,8,Wk)}const Jk=le(Uk,[["render",Kk]]),Gl={name:"WidgetHandler",components:{Widget:Jk},props:{component:{type:String,default:"Widget"}},inheritAttrs:!1,render(){return Nt(U(this.component),this.$attrs,this.$slots)}},Gk={components:{Widget:Gl},props:{widgets:{type:Array,default:()=>[]}},layout:function(t,e){return t(this.resolveDefaultLayout(),()=>e)}},Yk={key:0,class:"app-widget"},Xk={class:"app-widget-row"};function Qk(t,e,n,r,i,s){const o=U("Widget");return n.widgets.length>0?(x(),M("div",Yk,[w("div",Xk,[(x(!0),M(ye,null,Ie(n.widgets,l=>(x(),Re(o,Ge({key:l.key},l),null,16))),128))])])):oe("",!0)}const Zk=le(Gk,[["render",Qk]]),eO=Object.freeze(Object.defineProperty({__proto__:null,default:Zk},Symbol.toStringTag,{value:"Module"})),tO={props:{status:{type:Number,required:!0}},computed:{title(){return{503:"503: Service Unavailable",500:"500: Server Error",404:"404: Page Not Found",403:"403: Forbidden"}[this.status]},description(){return{503:"Sorry, we are doing some maintenance. Please check back soon.",500:"Whoops, something went wrong on our servers.",404:"Sorry, the page you are looking for could not be found.",403:"Sorry, you are forbidden from accessing this page."}[this.status]}}};function nO(t,e,n,r,i,s){return x(),M("div",null,[w("h1",null,q(s.title),1),w("div",null,q(s.description),1)])}const rO=le(tO,[["render",nO]]),iO=Object.freeze(Object.defineProperty({__proto__:null,default:rO},Symbol.toStringTag,{value:"Module"})),sO={props:{action:{type:Object,required:!0},selection:{type:Array,required:!0},allMatching:{type:Boolean,required:!0}},emits:["success","error"],data(){return{form:this.$inertia.form(Object.assign({},this.action.data))}},methods:{open(){this.$refs.modal.open()},submit(){this.form.transform(t=>({...t,all:this.allMatching,models:this.selection})).post(this.action.url+window.location.search,{onBefore:()=>{if(this.action.confirmable)return window.confirm(this.__("Are you sure?"))},onSuccess:()=>{this.$emit("success"),this.$refs.modal.close(),this.form.reset()},onError:t=>{this.$emit("error")}},{errorBag:this.action.key})}}};function oO(t,e,n,r,i,s){const o=U("FormHandler"),l=U("Modal");return x(),M("form",{onSubmit:e[0]||(e[0]=_t((...a)=>s.submit&&s.submit(...a),["prevent"]))},[V(l,{ref:"modal",title:n.action.name},{footer:Je(()=>[w("button",{type:"submit",class:se(["btn",{"btn--delete":n.action.destructive,"btn--primary":!n.action.destructive}])},q(t.__("Run")),3)]),default:Je(()=>[(x(!0),M(ye,null,Ie(n.action.fields,a=>(x(),Re(o,Ge(a,{modelValue:i.form[a.name],"onUpdate:modelValue":c=>i.form[a.name]=c,form:i.form,key:a.name,name:a.name}),null,16,["modelValue","onUpdate:modelValue","form","name"]))),128))]),_:1},8,["title"])],32)}const lO=le(sO,[["render",oO]]),aO={components:{Action:lO},props:{actions:{type:Array,default:()=>[]},selection:{type:Array,default:()=>[]},allMatching:{type:Boolean,default:!1}},emits:["success","error"],data(){return{_action:null}},methods:{submit(){this.$refs.action[this._action].open()}}},cO={class:"form-group form-group--inline"},uO={class:"form-label",for:"actions-select"},fO={value:null},dO=["value"],pO=["disabled"];function hO(t,e,n,r,i,s){const o=U("Action");return x(),M("div",null,[w("form",{onSubmit:e[1]||(e[1]=_t((...l)=>s.submit&&s.submit(...l),["prevent"])),class:"form--inline"},[w("div",cO,[w("label",uO,q(t.__("Action")),1),it(w("select",{id:"actions-select",class:"form-control","onUpdate:modelValue":e[0]||(e[0]=l=>i._action=l)},[w("option",fO,q(t.__("Select :label",{label:t.__("Action")})),1),(x(!0),M(ye,null,Ie(n.actions,(l,a)=>(x(),M("option",{value:a,key:a},q(l.name),9,dO))),128))],512),[[Jl,i._action]])]),w("button",{type:"submit",class:"btn btn--primary",disabled:i._action===null||n.selection.length===0},q(t.__("Run")),9,pO)],32),w("div",null,[(x(!0),M(ye,null,Ie(n.actions,l=>(x(),Re(o,{ref_for:!0,ref:"action",action:l,"all-matching":n.allMatching,key:l.key,selection:n.selection,onError:a=>t.$emit("error",l),onSuccess:a=>t.$emit("success",l)},null,8,["action","all-matching","selection","onError","onSuccess"]))),128))])])}const Fv=le(aO,[["render",hO]]),br={data(){return{isOpen:!1}},methods:{open(){this.isOpen||(this.isOpen=!0,this.$dispatcher.emit("open"))},close(){this.isOpen&&(this.isOpen=!1,this.$dispatcher.emit("close"))},toggle(){this.isOpen?this.close():this.open()}}},mO={mixins:[br],props:{filters:{type:Array,default:()=>[]},query:{type:Object,required:!0}},emits:["update:query"],computed:{activeFilters(){return this.filters.filter(t=>t.active).length}},methods:{emit(){this.$emit("update:query")},reset(){this.$inertia.get(this.$parent.items.path)}}},gO={class:"app-operation__filter"},yO=["aria-label"],bO={key:0,class:"btn__counter"},vO={class:"app-drawer"},_O={class:"app-drawer__title"},SO={class:"app-drawer__inner"},wO={class:"form-group--reset"},kO=["aria-label"];function OO(t,e,n,r,i,s){const o=U("Icon"),l=U("FormHandler");return x(),M("div",gO,[w("button",{type:"button",class:"btn btn--secondary btn--icon btn--has-counter","aria-label":t.isOpen?t.__("Close filters"):t.__("Open filters"),onClick:e[0]||(e[0]=(...a)=>t.toggle&&t.toggle(...a))},[V(o,{class:"btn__icon btn__icon--start",name:t.isOpen?"filter-list-off":"filter-list"},null,8,["name"]),s.activeFilters>0?(x(),M("span",bO,q(s.activeFilters),1)):oe("",!0)],8,yO),it(w("div",vO,[w("h2",_O,[tt(q(t.__("Filters"))+" ",1),w("button",{type:"button",class:"btn btn--secondary btn--sm btn--icon",onClick:e[1]||(e[1]=(...a)=>t.close&&t.close(...a))},[V(o,{class:"btn__icon btn__icon--sm",name:"close"})])]),w("div",SO,[(x(!0),M(ye,null,Ie(n.filters,a=>(x(),Re(l,Ge(a,{modelValue:n.query[a.key],"onUpdate:modelValue":[c=>n.query[a.key]=c,s.emit],form:n.query,key:a.key,name:a.key,label:a.name}),null,16,["modelValue","onUpdate:modelValue","form","name","label"]))),128)),w("div",wO,[w("button",{type:"button",class:"btn btn--sm btn--icon btn--tertiary","aria-label":t.__("Reset"),onClick:e[2]||(e[2]=(...a)=>s.reset&&s.reset(...a))},q(t.__("Reset")),9,kO)])])],512),[[ks,t.isOpen]])])}const xO=le(mO,[["render",OO]]),AO={props:{items:{type:Array,required:!0},selection:{type:Array,required:!0},query:{type:Object,required:!0},columns:{type:Array,required:!0}},emits:["update:query"],watch:{indeterminate(t,e){this.$refs.input.indeterminate=t}},computed:{selected:{get(){return this.selection.length>0&&this.selection.length===this.items.length},set(t){t?this.$parent.selectAll():this.$parent.clearSelection()}},allMatching:{get(){return this.$parent.allMatching},set(t){t?this.$parent.selectAll(!0):this.$parent.clearSelection()}},indeterminate(){return this.selection.length>0&&this.selection.length0?(x(),M("th",EO,[w("div",TO,[w("label",CO,[it(w("input",{ref:"input",class:"form-check__control",type:"checkbox","onUpdate:modelValue":e[0]||(e[0]=a=>s.selected=a),style:{"margin-inline-end":"0"}},null,512),[[ao,s.selected]]),MO]),V(o,{id:"table-selection-control"},{default:Je(()=>[w("li",NO,q(t.__(":count items are selected",{count:s.totalItems})),1),PO,w("li",RO,[w("label",IO,[it(w("input",{class:"form-check__control",type:"checkbox","onUpdate:modelValue":e[1]||(e[1]=a=>s.allMatching=a)},null,512),[[ao,s.allMatching]]),w("span",DO,q(t.__("Select all matching (:count)",{count:t.$parent.items.total})),1)])])]),_:1})])])):oe("",!0),(x(!0),M(ye,null,Ie(n.columns,a=>(x(),M("th",{key:a.name,scope:"col"},[w("div",$O,[tt(q(a.label)+" ",1),a.sortable?(x(),M("button",{key:0,type:"button",onClick:c=>s.sort(a.name),class:"table-sort-btn"},[V(l,{name:s.icon(a.name)},null,8,["name"])],8,LO)):oe("",!0)])]))),128)),BO])])}const HO=le(AO,[["render",FO]]);function Hv(t,e){return function(){return t.apply(e,arguments)}}const{toString:jv}=Object.prototype,{getPrototypeOf:th}=Object,nh=(t=>e=>{const n=jv.call(e);return t[n]||(t[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Vr=t=>(t=t.toLowerCase(),e=>nh(e)===t),fu=t=>e=>typeof e===t,{isArray:No}=Array,Nl=fu("undefined");function jO(t){return t!==null&&!Nl(t)&&t.constructor!==null&&!Nl(t.constructor)&&wi(t.constructor.isBuffer)&&t.constructor.isBuffer(t)}const Vv=Vr("ArrayBuffer");function VO(t){let e;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?e=ArrayBuffer.isView(t):e=t&&t.buffer&&Vv(t.buffer),e}const zO=fu("string"),wi=fu("function"),zv=fu("number"),rh=t=>t!==null&&typeof t=="object",qO=t=>t===!0||t===!1,ja=t=>{if(nh(t)!=="object")return!1;const e=th(t);return(e===null||e===Object.prototype||Object.getPrototypeOf(e)===null)&&!(Symbol.toStringTag in t)&&!(Symbol.iterator in t)},UO=Vr("Date"),WO=Vr("File"),KO=Vr("Blob"),JO=Vr("FileList"),GO=t=>rh(t)&&wi(t.pipe),YO=t=>{const e="[object FormData]";return t&&(typeof FormData=="function"&&t instanceof FormData||jv.call(t)===e||wi(t.toString)&&t.toString()===e)},XO=Vr("URLSearchParams"),QO=t=>t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Yl(t,e,{allOwnKeys:n=!1}={}){if(t===null||typeof t>"u")return;let r,i;if(typeof t!="object"&&(t=[t]),No(t))for(r=0,i=t.length;r0;)if(i=n[r],e===i.toLowerCase())return i;return null}const Uv=(()=>typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global)(),Wv=t=>!Nl(t)&&t!==Uv;function $d(){const{caseless:t}=Wv(this)&&this||{},e={},n=(r,i)=>{const s=t&&qv(e,i)||i;ja(e[s])&&ja(r)?e[s]=$d(e[s],r):ja(r)?e[s]=$d({},r):No(r)?e[s]=r.slice():e[s]=r};for(let r=0,i=arguments.length;r(Yl(e,(i,s)=>{n&&wi(i)?t[s]=Hv(i,n):t[s]=i},{allOwnKeys:r}),t),ex=t=>(t.charCodeAt(0)===65279&&(t=t.slice(1)),t),tx=(t,e,n,r)=>{t.prototype=Object.create(e.prototype,r),t.prototype.constructor=t,Object.defineProperty(t,"super",{value:e.prototype}),n&&Object.assign(t.prototype,n)},nx=(t,e,n,r)=>{let i,s,o;const l={};if(e=e||{},t==null)return e;do{for(i=Object.getOwnPropertyNames(t),s=i.length;s-- >0;)o=i[s],(!r||r(o,t,e))&&!l[o]&&(e[o]=t[o],l[o]=!0);t=n!==!1&&th(t)}while(t&&(!n||n(t,e))&&t!==Object.prototype);return e},rx=(t,e,n)=>{t=String(t),(n===void 0||n>t.length)&&(n=t.length),n-=e.length;const r=t.indexOf(e,n);return r!==-1&&r===n},ix=t=>{if(!t)return null;if(No(t))return t;let e=t.length;if(!zv(e))return null;const n=new Array(e);for(;e-- >0;)n[e]=t[e];return n},sx=(t=>e=>t&&e instanceof t)(typeof Uint8Array<"u"&&th(Uint8Array)),ox=(t,e)=>{const r=(t&&t[Symbol.iterator]).call(t);let i;for(;(i=r.next())&&!i.done;){const s=i.value;e.call(t,s[0],s[1])}},lx=(t,e)=>{let n;const r=[];for(;(n=t.exec(e))!==null;)r.push(n);return r},ax=Vr("HTMLFormElement"),cx=t=>t.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,i){return r.toUpperCase()+i}),Dm=(({hasOwnProperty:t})=>(e,n)=>t.call(e,n))(Object.prototype),ux=Vr("RegExp"),Kv=(t,e)=>{const n=Object.getOwnPropertyDescriptors(t),r={};Yl(n,(i,s)=>{e(i,s,t)!==!1&&(r[s]=i)}),Object.defineProperties(t,r)},fx=t=>{Kv(t,(e,n)=>{if(wi(t)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=t[n];if(wi(r)){if(e.enumerable=!1,"writable"in e){e.writable=!1;return}e.set||(e.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},dx=(t,e)=>{const n={},r=i=>{i.forEach(s=>{n[s]=!0})};return No(t)?r(t):r(String(t).split(e)),n},px=()=>{},hx=(t,e)=>(t=+t,Number.isFinite(t)?t:e),kf="abcdefghijklmnopqrstuvwxyz",$m="0123456789",Jv={DIGIT:$m,ALPHA:kf,ALPHA_DIGIT:kf+kf.toUpperCase()+$m},mx=(t=16,e=Jv.ALPHA_DIGIT)=>{let n="";const{length:r}=e;for(;t--;)n+=e[Math.random()*r|0];return n};function gx(t){return!!(t&&wi(t.append)&&t[Symbol.toStringTag]==="FormData"&&t[Symbol.iterator])}const yx=t=>{const e=new Array(10),n=(r,i)=>{if(rh(r)){if(e.indexOf(r)>=0)return;if(!("toJSON"in r)){e[i]=r;const s=No(r)?[]:{};return Yl(r,(o,l)=>{const a=n(o,i+1);!Nl(a)&&(s[l]=a)}),e[i]=void 0,s}}return r};return n(t,0)},$={isArray:No,isArrayBuffer:Vv,isBuffer:jO,isFormData:YO,isArrayBufferView:VO,isString:zO,isNumber:zv,isBoolean:qO,isObject:rh,isPlainObject:ja,isUndefined:Nl,isDate:UO,isFile:WO,isBlob:KO,isRegExp:ux,isFunction:wi,isStream:GO,isURLSearchParams:XO,isTypedArray:sx,isFileList:JO,forEach:Yl,merge:$d,extend:ZO,trim:QO,stripBOM:ex,inherits:tx,toFlatObject:nx,kindOf:nh,kindOfTest:Vr,endsWith:rx,toArray:ix,forEachEntry:ox,matchAll:lx,isHTMLForm:ax,hasOwnProperty:Dm,hasOwnProp:Dm,reduceDescriptors:Kv,freezeMethods:fx,toObjectSet:dx,toCamelCase:cx,noop:px,toFiniteNumber:hx,findKey:qv,global:Uv,isContextDefined:Wv,ALPHABET:Jv,generateString:mx,isSpecCompliantForm:gx,toJSONObject:yx};function He(t,e,n,r,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=t,this.name="AxiosError",e&&(this.code=e),n&&(this.config=n),r&&(this.request=r),i&&(this.response=i)}$.inherits(He,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:$.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const Gv=He.prototype,Yv={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(t=>{Yv[t]={value:t}});Object.defineProperties(He,Yv);Object.defineProperty(Gv,"isAxiosError",{value:!0});He.from=(t,e,n,r,i,s)=>{const o=Object.create(Gv);return $.toFlatObject(t,o,function(a){return a!==Error.prototype},l=>l!=="isAxiosError"),He.call(o,t.message,e,n,r,i),o.cause=t,o.name=t.name,s&&Object.assign(o,s),o};const bx=null;function Ld(t){return $.isPlainObject(t)||$.isArray(t)}function Xv(t){return $.endsWith(t,"[]")?t.slice(0,-2):t}function Lm(t,e,n){return t?t.concat(e).map(function(i,s){return i=Xv(i),!n&&s?"["+i+"]":i}).join(n?".":""):e}function vx(t){return $.isArray(t)&&!t.some(Ld)}const _x=$.toFlatObject($,{},null,function(e){return/^is[A-Z]/.test(e)});function du(t,e,n){if(!$.isObject(t))throw new TypeError("target must be an object");e=e||new FormData,n=$.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(g,S){return!$.isUndefined(S[g])});const r=n.metaTokens,i=n.visitor||u,s=n.dots,o=n.indexes,a=(n.Blob||typeof Blob<"u"&&Blob)&&$.isSpecCompliantForm(e);if(!$.isFunction(i))throw new TypeError("visitor must be a function");function c(h){if(h===null)return"";if($.isDate(h))return h.toISOString();if(!a&&$.isBlob(h))throw new He("Blob is not supported. Use a Buffer instead.");return $.isArrayBuffer(h)||$.isTypedArray(h)?a&&typeof Blob=="function"?new Blob([h]):Buffer.from(h):h}function u(h,g,S){let _=h;if(h&&!S&&typeof h=="object"){if($.endsWith(g,"{}"))g=r?g:g.slice(0,-2),h=JSON.stringify(h);else if($.isArray(h)&&vx(h)||($.isFileList(h)||$.endsWith(g,"[]"))&&(_=$.toArray(h)))return g=Xv(g),_.forEach(function(k,b){!($.isUndefined(k)||k===null)&&e.append(o===!0?Lm([g],b,s):o===null?g:g+"[]",c(k))}),!1}return Ld(h)?!0:(e.append(Lm(S,g,s),c(h)),!1)}const f=[],d=Object.assign(_x,{defaultVisitor:u,convertValue:c,isVisitable:Ld});function m(h,g){if(!$.isUndefined(h)){if(f.indexOf(h)!==-1)throw Error("Circular reference detected in "+g.join("."));f.push(h),$.forEach(h,function(_,v){(!($.isUndefined(_)||_===null)&&i.call(e,_,$.isString(v)?v.trim():v,g,d))===!0&&m(_,g?g.concat(v):[v])}),f.pop()}}if(!$.isObject(t))throw new TypeError("data must be an object");return m(t),e}function Bm(t){const e={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(t).replace(/[!'()~]|%20|%00/g,function(r){return e[r]})}function ih(t,e){this._pairs=[],t&&du(t,this,e)}const Qv=ih.prototype;Qv.append=function(e,n){this._pairs.push([e,n])};Qv.toString=function(e){const n=e?function(r){return e.call(this,r,Bm)}:Bm;return this._pairs.map(function(i){return n(i[0])+"="+n(i[1])},"").join("&")};function Sx(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Zv(t,e,n){if(!e)return t;const r=n&&n.encode||Sx,i=n&&n.serialize;let s;if(i?s=i(e,n):s=$.isURLSearchParams(e)?e.toString():new ih(e,n).toString(r),s){const o=t.indexOf("#");o!==-1&&(t=t.slice(0,o)),t+=(t.indexOf("?")===-1?"?":"&")+s}return t}class wx{constructor(){this.handlers=[]}use(e,n,r){return this.handlers.push({fulfilled:e,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){$.forEach(this.handlers,function(r){r!==null&&e(r)})}}const Fm=wx,e_={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},kx=typeof URLSearchParams<"u"?URLSearchParams:ih,Ox=typeof FormData<"u"?FormData:null,xx=typeof Blob<"u"?Blob:null,Ax=(()=>{let t;return typeof navigator<"u"&&((t=navigator.product)==="ReactNative"||t==="NativeScript"||t==="NS")?!1:typeof window<"u"&&typeof document<"u"})(),Ex=(()=>typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function")(),ur={isBrowser:!0,classes:{URLSearchParams:kx,FormData:Ox,Blob:xx},isStandardBrowserEnv:Ax,isStandardBrowserWebWorkerEnv:Ex,protocols:["http","https","file","blob","url","data"]};function Tx(t,e){return du(t,new ur.classes.URLSearchParams,Object.assign({visitor:function(n,r,i,s){return ur.isNode&&$.isBuffer(n)?(this.append(r,n.toString("base64")),!1):s.defaultVisitor.apply(this,arguments)}},e))}function Cx(t){return $.matchAll(/\w+|\[(\w*)]/g,t).map(e=>e[0]==="[]"?"":e[1]||e[0])}function Mx(t){const e={},n=Object.keys(t);let r;const i=n.length;let s;for(r=0;r=n.length;return o=!o&&$.isArray(i)?i.length:o,a?($.hasOwnProp(i,o)?i[o]=[i[o],r]:i[o]=r,!l):((!i[o]||!$.isObject(i[o]))&&(i[o]=[]),e(n,r,i[o],s)&&$.isArray(i[o])&&(i[o]=Mx(i[o])),!l)}if($.isFormData(t)&&$.isFunction(t.entries)){const n={};return $.forEachEntry(t,(r,i)=>{e(Cx(r),i,n,0)}),n}return null}const Nx={"Content-Type":void 0};function Px(t,e,n){if($.isString(t))try{return(e||JSON.parse)(t),$.trim(t)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(t)}const pu={transitional:e_,adapter:["xhr","http"],transformRequest:[function(e,n){const r=n.getContentType()||"",i=r.indexOf("application/json")>-1,s=$.isObject(e);if(s&&$.isHTMLForm(e)&&(e=new FormData(e)),$.isFormData(e))return i&&i?JSON.stringify(t_(e)):e;if($.isArrayBuffer(e)||$.isBuffer(e)||$.isStream(e)||$.isFile(e)||$.isBlob(e))return e;if($.isArrayBufferView(e))return e.buffer;if($.isURLSearchParams(e))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let l;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return Tx(e,this.formSerializer).toString();if((l=$.isFileList(e))||r.indexOf("multipart/form-data")>-1){const a=this.env&&this.env.FormData;return du(l?{"files[]":e}:e,a&&new a,this.formSerializer)}}return s||i?(n.setContentType("application/json",!1),Px(e)):e}],transformResponse:[function(e){const n=this.transitional||pu.transitional,r=n&&n.forcedJSONParsing,i=this.responseType==="json";if(e&&$.isString(e)&&(r&&!this.responseType||i)){const o=!(n&&n.silentJSONParsing)&&i;try{return JSON.parse(e)}catch(l){if(o)throw l.name==="SyntaxError"?He.from(l,He.ERR_BAD_RESPONSE,this,null,this.response):l}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:ur.classes.FormData,Blob:ur.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};$.forEach(["delete","get","head"],function(e){pu.headers[e]={}});$.forEach(["post","put","patch"],function(e){pu.headers[e]=$.merge(Nx)});const sh=pu,Rx=$.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Ix=t=>{const e={};let n,r,i;return t&&t.split(` -`).forEach(function(o){i=o.indexOf(":"),n=o.substring(0,i).trim().toLowerCase(),r=o.substring(i+1).trim(),!(!n||e[n]&&Rx[n])&&(n==="set-cookie"?e[n]?e[n].push(r):e[n]=[r]:e[n]=e[n]?e[n]+", "+r:r)}),e},Hm=Symbol("internals");function qo(t){return t&&String(t).trim().toLowerCase()}function Va(t){return t===!1||t==null?t:$.isArray(t)?t.map(Va):String(t)}function Dx(t){const e=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(t);)e[r[1]]=r[2];return e}function $x(t){return/^[-_a-zA-Z]+$/.test(t.trim())}function Of(t,e,n,r,i){if($.isFunction(r))return r.call(this,e,n);if(i&&(e=n),!!$.isString(e)){if($.isString(r))return e.indexOf(r)!==-1;if($.isRegExp(r))return r.test(e)}}function Lx(t){return t.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,n,r)=>n.toUpperCase()+r)}function Bx(t,e){const n=$.toCamelCase(" "+e);["get","set","has"].forEach(r=>{Object.defineProperty(t,r+n,{value:function(i,s,o){return this[r].call(this,e,i,s,o)},configurable:!0})})}class hu{constructor(e){e&&this.set(e)}set(e,n,r){const i=this;function s(l,a,c){const u=qo(a);if(!u)throw new Error("header name must be a non-empty string");const f=$.findKey(i,u);(!f||i[f]===void 0||c===!0||c===void 0&&i[f]!==!1)&&(i[f||a]=Va(l))}const o=(l,a)=>$.forEach(l,(c,u)=>s(c,u,a));return $.isPlainObject(e)||e instanceof this.constructor?o(e,n):$.isString(e)&&(e=e.trim())&&!$x(e)?o(Ix(e),n):e!=null&&s(n,e,r),this}get(e,n){if(e=qo(e),e){const r=$.findKey(this,e);if(r){const i=this[r];if(!n)return i;if(n===!0)return Dx(i);if($.isFunction(n))return n.call(this,i,r);if($.isRegExp(n))return n.exec(i);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,n){if(e=qo(e),e){const r=$.findKey(this,e);return!!(r&&this[r]!==void 0&&(!n||Of(this,this[r],r,n)))}return!1}delete(e,n){const r=this;let i=!1;function s(o){if(o=qo(o),o){const l=$.findKey(r,o);l&&(!n||Of(r,r[l],l,n))&&(delete r[l],i=!0)}}return $.isArray(e)?e.forEach(s):s(e),i}clear(e){const n=Object.keys(this);let r=n.length,i=!1;for(;r--;){const s=n[r];(!e||Of(this,this[s],s,e,!0))&&(delete this[s],i=!0)}return i}normalize(e){const n=this,r={};return $.forEach(this,(i,s)=>{const o=$.findKey(r,s);if(o){n[o]=Va(i),delete n[s];return}const l=e?Lx(s):String(s).trim();l!==s&&delete n[s],n[l]=Va(i),r[l]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const n=Object.create(null);return $.forEach(this,(r,i)=>{r!=null&&r!==!1&&(n[i]=e&&$.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,n])=>e+": "+n).join(` -`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...n){const r=new this(e);return n.forEach(i=>r.set(i)),r}static accessor(e){const r=(this[Hm]=this[Hm]={accessors:{}}).accessors,i=this.prototype;function s(o){const l=qo(o);r[l]||(Bx(i,o),r[l]=!0)}return $.isArray(e)?e.forEach(s):s(e),this}}hu.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);$.freezeMethods(hu.prototype);$.freezeMethods(hu);const Dr=hu;function xf(t,e){const n=this||sh,r=e||n,i=Dr.from(r.headers);let s=r.data;return $.forEach(t,function(l){s=l.call(n,s,i.normalize(),e?e.status:void 0)}),i.normalize(),s}function n_(t){return!!(t&&t.__CANCEL__)}function Xl(t,e,n){He.call(this,t??"canceled",He.ERR_CANCELED,e,n),this.name="CanceledError"}$.inherits(Xl,He,{__CANCEL__:!0});function Fx(t,e,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?t(n):e(new He("Request failed with status code "+n.status,[He.ERR_BAD_REQUEST,He.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}const Hx=ur.isStandardBrowserEnv?function(){return{write:function(n,r,i,s,o,l){const a=[];a.push(n+"="+encodeURIComponent(r)),$.isNumber(i)&&a.push("expires="+new Date(i).toGMTString()),$.isString(s)&&a.push("path="+s),$.isString(o)&&a.push("domain="+o),l===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(n){const r=document.cookie.match(new RegExp("(^|;\\s*)("+n+")=([^;]*)"));return r?decodeURIComponent(r[3]):null},remove:function(n){this.write(n,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}();function jx(t){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)}function Vx(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t}function r_(t,e){return t&&!jx(e)?Vx(t,e):e}const zx=ur.isStandardBrowserEnv?function(){const e=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");let r;function i(s){let o=s;return e&&(n.setAttribute("href",o),o=n.href),n.setAttribute("href",o),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:n.pathname.charAt(0)==="/"?n.pathname:"/"+n.pathname}}return r=i(window.location.href),function(o){const l=$.isString(o)?i(o):o;return l.protocol===r.protocol&&l.host===r.host}}():function(){return function(){return!0}}();function qx(t){const e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(t);return e&&e[1]||""}function Ux(t,e){t=t||10;const n=new Array(t),r=new Array(t);let i=0,s=0,o;return e=e!==void 0?e:1e3,function(a){const c=Date.now(),u=r[s];o||(o=c),n[i]=a,r[i]=c;let f=s,d=0;for(;f!==i;)d+=n[f++],f=f%t;if(i=(i+1)%t,i===s&&(s=(s+1)%t),c-o{const s=i.loaded,o=i.lengthComputable?i.total:void 0,l=s-n,a=r(l),c=s<=o;n=s;const u={loaded:s,total:o,progress:o?s/o:void 0,bytes:l,rate:a||void 0,estimated:a&&o&&c?(o-s)/a:void 0,event:i};u[e?"download":"upload"]=!0,t(u)}}const Wx=typeof XMLHttpRequest<"u",Kx=Wx&&function(t){return new Promise(function(n,r){let i=t.data;const s=Dr.from(t.headers).normalize(),o=t.responseType;let l;function a(){t.cancelToken&&t.cancelToken.unsubscribe(l),t.signal&&t.signal.removeEventListener("abort",l)}$.isFormData(i)&&(ur.isStandardBrowserEnv||ur.isStandardBrowserWebWorkerEnv)&&s.setContentType(!1);let c=new XMLHttpRequest;if(t.auth){const m=t.auth.username||"",h=t.auth.password?unescape(encodeURIComponent(t.auth.password)):"";s.set("Authorization","Basic "+btoa(m+":"+h))}const u=r_(t.baseURL,t.url);c.open(t.method.toUpperCase(),Zv(u,t.params,t.paramsSerializer),!0),c.timeout=t.timeout;function f(){if(!c)return;const m=Dr.from("getAllResponseHeaders"in c&&c.getAllResponseHeaders()),g={data:!o||o==="text"||o==="json"?c.responseText:c.response,status:c.status,statusText:c.statusText,headers:m,config:t,request:c};Fx(function(_){n(_),a()},function(_){r(_),a()},g),c=null}if("onloadend"in c?c.onloadend=f:c.onreadystatechange=function(){!c||c.readyState!==4||c.status===0&&!(c.responseURL&&c.responseURL.indexOf("file:")===0)||setTimeout(f)},c.onabort=function(){c&&(r(new He("Request aborted",He.ECONNABORTED,t,c)),c=null)},c.onerror=function(){r(new He("Network Error",He.ERR_NETWORK,t,c)),c=null},c.ontimeout=function(){let h=t.timeout?"timeout of "+t.timeout+"ms exceeded":"timeout exceeded";const g=t.transitional||e_;t.timeoutErrorMessage&&(h=t.timeoutErrorMessage),r(new He(h,g.clarifyTimeoutError?He.ETIMEDOUT:He.ECONNABORTED,t,c)),c=null},ur.isStandardBrowserEnv){const m=(t.withCredentials||zx(u))&&t.xsrfCookieName&&Hx.read(t.xsrfCookieName);m&&s.set(t.xsrfHeaderName,m)}i===void 0&&s.setContentType(null),"setRequestHeader"in c&&$.forEach(s.toJSON(),function(h,g){c.setRequestHeader(g,h)}),$.isUndefined(t.withCredentials)||(c.withCredentials=!!t.withCredentials),o&&o!=="json"&&(c.responseType=t.responseType),typeof t.onDownloadProgress=="function"&&c.addEventListener("progress",jm(t.onDownloadProgress,!0)),typeof t.onUploadProgress=="function"&&c.upload&&c.upload.addEventListener("progress",jm(t.onUploadProgress)),(t.cancelToken||t.signal)&&(l=m=>{c&&(r(!m||m.type?new Xl(null,t,c):m),c.abort(),c=null)},t.cancelToken&&t.cancelToken.subscribe(l),t.signal&&(t.signal.aborted?l():t.signal.addEventListener("abort",l)));const d=qx(u);if(d&&ur.protocols.indexOf(d)===-1){r(new He("Unsupported protocol "+d+":",He.ERR_BAD_REQUEST,t));return}c.send(i||null)})},za={http:bx,xhr:Kx};$.forEach(za,(t,e)=>{if(t){try{Object.defineProperty(t,"name",{value:e})}catch{}Object.defineProperty(t,"adapterName",{value:e})}});const Jx={getAdapter:t=>{t=$.isArray(t)?t:[t];const{length:e}=t;let n,r;for(let i=0;it instanceof Dr?t.toJSON():t;function uo(t,e){e=e||{};const n={};function r(c,u,f){return $.isPlainObject(c)&&$.isPlainObject(u)?$.merge.call({caseless:f},c,u):$.isPlainObject(u)?$.merge({},u):$.isArray(u)?u.slice():u}function i(c,u,f){if($.isUndefined(u)){if(!$.isUndefined(c))return r(void 0,c,f)}else return r(c,u,f)}function s(c,u){if(!$.isUndefined(u))return r(void 0,u)}function o(c,u){if($.isUndefined(u)){if(!$.isUndefined(c))return r(void 0,c)}else return r(void 0,u)}function l(c,u,f){if(f in e)return r(c,u);if(f in t)return r(void 0,c)}const a={url:s,method:s,data:s,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:l,headers:(c,u)=>i(zm(c),zm(u),!0)};return $.forEach(Object.keys(t).concat(Object.keys(e)),function(u){const f=a[u]||i,d=f(t[u],e[u],u);$.isUndefined(d)&&f!==l||(n[u]=d)}),n}const i_="1.3.4",oh={};["object","boolean","number","function","string","symbol"].forEach((t,e)=>{oh[t]=function(r){return typeof r===t||"a"+(e<1?"n ":" ")+t}});const qm={};oh.transitional=function(e,n,r){function i(s,o){return"[Axios v"+i_+"] Transitional option '"+s+"'"+o+(r?". "+r:"")}return(s,o,l)=>{if(e===!1)throw new He(i(o," has been removed"+(n?" in "+n:"")),He.ERR_DEPRECATED);return n&&!qm[o]&&(qm[o]=!0,console.warn(i(o," has been deprecated since v"+n+" and will be removed in the near future"))),e?e(s,o,l):!0}};function Gx(t,e,n){if(typeof t!="object")throw new He("options must be an object",He.ERR_BAD_OPTION_VALUE);const r=Object.keys(t);let i=r.length;for(;i-- >0;){const s=r[i],o=e[s];if(o){const l=t[s],a=l===void 0||o(l,s,t);if(a!==!0)throw new He("option "+s+" must be "+a,He.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new He("Unknown option "+s,He.ERR_BAD_OPTION)}}const Bd={assertOptions:Gx,validators:oh},Gr=Bd.validators;let oc=class{constructor(e){this.defaults=e,this.interceptors={request:new Fm,response:new Fm}}request(e,n){typeof e=="string"?(n=n||{},n.url=e):n=e||{},n=uo(this.defaults,n);const{transitional:r,paramsSerializer:i,headers:s}=n;r!==void 0&&Bd.assertOptions(r,{silentJSONParsing:Gr.transitional(Gr.boolean),forcedJSONParsing:Gr.transitional(Gr.boolean),clarifyTimeoutError:Gr.transitional(Gr.boolean)},!1),i!==void 0&&Bd.assertOptions(i,{encode:Gr.function,serialize:Gr.function},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let o;o=s&&$.merge(s.common,s[n.method]),o&&$.forEach(["delete","get","head","post","put","patch","common"],h=>{delete s[h]}),n.headers=Dr.concat(o,s);const l=[];let a=!0;this.interceptors.request.forEach(function(g){typeof g.runWhen=="function"&&g.runWhen(n)===!1||(a=a&&g.synchronous,l.unshift(g.fulfilled,g.rejected))});const c=[];this.interceptors.response.forEach(function(g){c.push(g.fulfilled,g.rejected)});let u,f=0,d;if(!a){const h=[Vm.bind(this),void 0];for(h.unshift.apply(h,l),h.push.apply(h,c),d=h.length,u=Promise.resolve(n);f{if(!r._listeners)return;let s=r._listeners.length;for(;s-- >0;)r._listeners[s](i);r._listeners=null}),this.promise.then=i=>{let s;const o=new Promise(l=>{r.subscribe(l),s=l}).then(i);return o.cancel=function(){r.unsubscribe(s)},o},e(function(s,o,l){r.reason||(r.reason=new Xl(s,o,l),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const n=this._listeners.indexOf(e);n!==-1&&this._listeners.splice(n,1)}static source(){let e;return{token:new lh(function(i){e=i}),cancel:e}}}const Yx=lh;function Xx(t){return function(n){return t.apply(null,n)}}function Qx(t){return $.isObject(t)&&t.isAxiosError===!0}const Fd={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Fd).forEach(([t,e])=>{Fd[e]=t});const Zx=Fd;function s_(t){const e=new qa(t),n=Hv(qa.prototype.request,e);return $.extend(n,qa.prototype,e,{allOwnKeys:!0}),$.extend(n,e,null,{allOwnKeys:!0}),n.create=function(i){return s_(uo(t,i))},n}const mt=s_(sh);mt.Axios=qa;mt.CanceledError=Xl;mt.CancelToken=Yx;mt.isCancel=n_;mt.VERSION=i_;mt.toFormData=du;mt.AxiosError=He;mt.Cancel=mt.CanceledError;mt.all=function(e){return Promise.all(e)};mt.spread=Xx;mt.isAxiosError=Qx;mt.mergeConfig=uo;mt.AxiosHeaders=Dr;mt.formToJSON=t=>t_($.isHTMLForm(t)?new FormData(t):t);mt.HttpStatusCode=Zx;mt.default=mt;const Hd=mt;var Pr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function eA(t){if(t.__esModule)return t;var e=t.default;if(typeof e=="function"){var n=function r(){if(this instanceof r){var i=[null];i.push.apply(i,arguments);var s=Function.bind.apply(e,i);return new s}return e.apply(this,arguments)};n.prototype=e.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(t).forEach(function(r){var i=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(n,r,i.get?i:{enumerable:!0,get:function(){return t[r]}})}),n}var tA=function(e){return nA(e)&&!rA(e)};function nA(t){return!!t&&typeof t=="object"}function rA(t){var e=Object.prototype.toString.call(t);return e==="[object RegExp]"||e==="[object Date]"||oA(t)}var iA=typeof Symbol=="function"&&Symbol.for,sA=iA?Symbol.for("react.element"):60103;function oA(t){return t.$$typeof===sA}function lA(t){return Array.isArray(t)?[]:{}}function Pl(t,e){return e.clone!==!1&&e.isMergeableObject(t)?fo(lA(t),t,e):t}function aA(t,e,n){return t.concat(e).map(function(r){return Pl(r,n)})}function cA(t,e){if(!e.customMerge)return fo;var n=e.customMerge(t);return typeof n=="function"?n:fo}function uA(t){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter(function(e){return Object.propertyIsEnumerable.call(t,e)}):[]}function Um(t){return Object.keys(t).concat(uA(t))}function o_(t,e){try{return e in t}catch{return!1}}function fA(t,e){return o_(t,e)&&!(Object.hasOwnProperty.call(t,e)&&Object.propertyIsEnumerable.call(t,e))}function dA(t,e,n){var r={};return n.isMergeableObject(t)&&Um(t).forEach(function(i){r[i]=Pl(t[i],n)}),Um(e).forEach(function(i){fA(t,i)||(o_(t,i)&&n.isMergeableObject(e[i])?r[i]=cA(i,n)(t[i],e[i],n):r[i]=Pl(e[i],n))}),r}function fo(t,e,n){n=n||{},n.arrayMerge=n.arrayMerge||aA,n.isMergeableObject=n.isMergeableObject||tA,n.cloneUnlessOtherwiseSpecified=Pl;var r=Array.isArray(e),i=Array.isArray(t),s=r===i;return s?r?n.arrayMerge(t,e,n):dA(t,e,n):Pl(e,n)}fo.all=function(e,n){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce(function(r,i){return fo(r,i,n)},{})};var pA=fo,hA=pA,mA=function(){if(typeof Symbol!="function"||typeof Object.getOwnPropertySymbols!="function")return!1;if(typeof Symbol.iterator=="symbol")return!0;var e={},n=Symbol("test"),r=Object(n);if(typeof n=="string"||Object.prototype.toString.call(n)!=="[object Symbol]"||Object.prototype.toString.call(r)!=="[object Symbol]")return!1;var i=42;e[n]=i;for(n in e)return!1;if(typeof Object.keys=="function"&&Object.keys(e).length!==0||typeof Object.getOwnPropertyNames=="function"&&Object.getOwnPropertyNames(e).length!==0)return!1;var s=Object.getOwnPropertySymbols(e);if(s.length!==1||s[0]!==n||!Object.prototype.propertyIsEnumerable.call(e,n))return!1;if(typeof Object.getOwnPropertyDescriptor=="function"){var o=Object.getOwnPropertyDescriptor(e,n);if(o.value!==i||o.enumerable!==!0)return!1}return!0},Wm=typeof Symbol<"u"&&Symbol,gA=mA,yA=function(){return typeof Wm!="function"||typeof Symbol!="function"||typeof Wm("foo")!="symbol"||typeof Symbol("bar")!="symbol"?!1:gA()},bA="Function.prototype.bind called on incompatible ",Ef=Array.prototype.slice,vA=Object.prototype.toString,_A="[object Function]",SA=function(e){var n=this;if(typeof n!="function"||vA.call(n)!==_A)throw new TypeError(bA+n);for(var r=Ef.call(arguments,1),i,s=function(){if(this instanceof i){var u=n.apply(this,r.concat(Ef.call(arguments)));return Object(u)===u?u:this}else return n.apply(e,r.concat(Ef.call(arguments)))},o=Math.max(0,n.length-r.length),l=[],a=0;a"u"?De:ir(Uint8Array),ts={"%AggregateError%":typeof AggregateError>"u"?De:AggregateError,"%Array%":Array,"%ArrayBuffer%":typeof ArrayBuffer>"u"?De:ArrayBuffer,"%ArrayIteratorPrototype%":Cs?ir([][Symbol.iterator]()):De,"%AsyncFromSyncIteratorPrototype%":De,"%AsyncFunction%":Is,"%AsyncGenerator%":Is,"%AsyncGeneratorFunction%":Is,"%AsyncIteratorPrototype%":Is,"%Atomics%":typeof Atomics>"u"?De:Atomics,"%BigInt%":typeof BigInt>"u"?De:BigInt,"%BigInt64Array%":typeof BigInt64Array>"u"?De:BigInt64Array,"%BigUint64Array%":typeof BigUint64Array>"u"?De:BigUint64Array,"%Boolean%":Boolean,"%DataView%":typeof DataView>"u"?De:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":typeof Float32Array>"u"?De:Float32Array,"%Float64Array%":typeof Float64Array>"u"?De:Float64Array,"%FinalizationRegistry%":typeof FinalizationRegistry>"u"?De:FinalizationRegistry,"%Function%":l_,"%GeneratorFunction%":Is,"%Int8Array%":typeof Int8Array>"u"?De:Int8Array,"%Int16Array%":typeof Int16Array>"u"?De:Int16Array,"%Int32Array%":typeof Int32Array>"u"?De:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":Cs?ir(ir([][Symbol.iterator]())):De,"%JSON%":typeof JSON=="object"?JSON:De,"%Map%":typeof Map>"u"?De:Map,"%MapIteratorPrototype%":typeof Map>"u"||!Cs?De:ir(new Map()[Symbol.iterator]()),"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":typeof Promise>"u"?De:Promise,"%Proxy%":typeof Proxy>"u"?De:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":typeof Reflect>"u"?De:Reflect,"%RegExp%":RegExp,"%Set%":typeof Set>"u"?De:Set,"%SetIteratorPrototype%":typeof Set>"u"||!Cs?De:ir(new Set()[Symbol.iterator]()),"%SharedArrayBuffer%":typeof SharedArrayBuffer>"u"?De:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":Cs?ir(""[Symbol.iterator]()):De,"%Symbol%":Cs?Symbol:De,"%SyntaxError%":po,"%ThrowTypeError%":xA,"%TypedArray%":AA,"%TypeError%":Zs,"%Uint8Array%":typeof Uint8Array>"u"?De:Uint8Array,"%Uint8ClampedArray%":typeof Uint8ClampedArray>"u"?De:Uint8ClampedArray,"%Uint16Array%":typeof Uint16Array>"u"?De:Uint16Array,"%Uint32Array%":typeof Uint32Array>"u"?De:Uint32Array,"%URIError%":URIError,"%WeakMap%":typeof WeakMap>"u"?De:WeakMap,"%WeakRef%":typeof WeakRef>"u"?De:WeakRef,"%WeakSet%":typeof WeakSet>"u"?De:WeakSet};try{null.error}catch(t){var EA=ir(ir(t));ts["%Error.prototype%"]=EA}var TA=function t(e){var n;if(e==="%AsyncFunction%")n=Tf("async function () {}");else if(e==="%GeneratorFunction%")n=Tf("function* () {}");else if(e==="%AsyncGeneratorFunction%")n=Tf("async function* () {}");else if(e==="%AsyncGenerator%"){var r=t("%AsyncGeneratorFunction%");r&&(n=r.prototype)}else if(e==="%AsyncIteratorPrototype%"){var i=t("%AsyncGenerator%");i&&(n=ir(i.prototype))}return ts[e]=n,n},Km={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},Ql=ah,lc=OA,CA=Ql.call(Function.call,Array.prototype.concat),MA=Ql.call(Function.apply,Array.prototype.splice),Jm=Ql.call(Function.call,String.prototype.replace),ac=Ql.call(Function.call,String.prototype.slice),NA=Ql.call(Function.call,RegExp.prototype.exec),PA=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,RA=/\\(\\)?/g,IA=function(e){var n=ac(e,0,1),r=ac(e,-1);if(n==="%"&&r!=="%")throw new po("invalid intrinsic syntax, expected closing `%`");if(r==="%"&&n!=="%")throw new po("invalid intrinsic syntax, expected opening `%`");var i=[];return Jm(e,PA,function(s,o,l,a){i[i.length]=l?Jm(a,RA,"$1"):o||s}),i},DA=function(e,n){var r=e,i;if(lc(Km,r)&&(i=Km[r],r="%"+i[0]+"%"),lc(ts,r)){var s=ts[r];if(s===Is&&(s=TA(r)),typeof s>"u"&&!n)throw new Zs("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:i,name:r,value:s}}throw new po("intrinsic "+e+" does not exist!")},ch=function(e,n){if(typeof e!="string"||e.length===0)throw new Zs("intrinsic name must be a non-empty string");if(arguments.length>1&&typeof n!="boolean")throw new Zs('"allowMissing" argument must be a boolean');if(NA(/^%?[^%]*%?$/,e)===null)throw new po("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var r=IA(e),i=r.length>0?r[0]:"",s=DA("%"+i+"%",n),o=s.name,l=s.value,a=!1,c=s.alias;c&&(i=c[0],MA(r,CA([0,1],c)));for(var u=1,f=!0;u=r.length){var g=es(l,d);f=!!g,f&&"get"in g&&!("originalValue"in g.get)?l=g.get:l=l[d]}else f=lc(l,d),l=l[d];f&&!a&&(ts[o]=l)}}return l},jd={},$A={get exports(){return jd},set exports(t){jd=t}};(function(t){var e=ah,n=ch,r=n("%Function.prototype.apply%"),i=n("%Function.prototype.call%"),s=n("%Reflect.apply%",!0)||e.call(i,r),o=n("%Object.getOwnPropertyDescriptor%",!0),l=n("%Object.defineProperty%",!0),a=n("%Math.max%");if(l)try{l({},"a",{value:1})}catch{l=null}t.exports=function(f){var d=s(e,i,arguments);if(o&&l){var m=o(d,"length");m.configurable&&l(d,"length",{value:1+a(0,f.length-(arguments.length-1))})}return d};var c=function(){return s(e,r,arguments)};l?l(t.exports,"apply",{value:c}):t.exports.apply=c})($A);var a_=ch,c_=jd,LA=c_(a_("String.prototype.indexOf")),BA=function(e,n){var r=a_(e,!!n);return typeof r=="function"&&LA(e,".prototype.")>-1?c_(r):r};const FA={},HA=Object.freeze(Object.defineProperty({__proto__:null,default:FA},Symbol.toStringTag,{value:"Module"})),jA=eA(HA);var uh=typeof Map=="function"&&Map.prototype,Mf=Object.getOwnPropertyDescriptor&&uh?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,cc=uh&&Mf&&typeof Mf.get=="function"?Mf.get:null,Gm=uh&&Map.prototype.forEach,fh=typeof Set=="function"&&Set.prototype,Nf=Object.getOwnPropertyDescriptor&&fh?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,uc=fh&&Nf&&typeof Nf.get=="function"?Nf.get:null,Ym=fh&&Set.prototype.forEach,VA=typeof WeakMap=="function"&&WeakMap.prototype,ul=VA?WeakMap.prototype.has:null,zA=typeof WeakSet=="function"&&WeakSet.prototype,fl=zA?WeakSet.prototype.has:null,qA=typeof WeakRef=="function"&&WeakRef.prototype,Xm=qA?WeakRef.prototype.deref:null,UA=Boolean.prototype.valueOf,WA=Object.prototype.toString,KA=Function.prototype.toString,JA=String.prototype.match,dh=String.prototype.slice,oi=String.prototype.replace,GA=String.prototype.toUpperCase,Qm=String.prototype.toLowerCase,u_=RegExp.prototype.test,Zm=Array.prototype.concat,sr=Array.prototype.join,YA=Array.prototype.slice,eg=Math.floor,Vd=typeof BigInt=="function"?BigInt.prototype.valueOf:null,Pf=Object.getOwnPropertySymbols,zd=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Symbol.prototype.toString:null,ho=typeof Symbol=="function"&&typeof Symbol.iterator=="object",qt=typeof Symbol=="function"&&Symbol.toStringTag&&(typeof Symbol.toStringTag===ho||"symbol")?Symbol.toStringTag:null,f_=Object.prototype.propertyIsEnumerable,tg=(typeof Reflect=="function"?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(t){return t.__proto__}:null);function ng(t,e){if(t===1/0||t===-1/0||t!==t||t&&t>-1e3&&t<1e3||u_.call(/e/,e))return e;var n=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if(typeof t=="number"){var r=t<0?-eg(-t):eg(t);if(r!==t){var i=String(r),s=dh.call(e,i.length+1);return oi.call(i,n,"$&_")+"."+oi.call(oi.call(s,/([0-9]{3})/g,"$&_"),/_$/,"")}}return oi.call(e,n,"$&_")}var qd=jA,rg=qd.custom,ig=p_(rg)?rg:null,XA=function t(e,n,r,i){var s=n||{};if(ti(s,"quoteStyle")&&s.quoteStyle!=="single"&&s.quoteStyle!=="double")throw new TypeError('option "quoteStyle" must be "single" or "double"');if(ti(s,"maxStringLength")&&(typeof s.maxStringLength=="number"?s.maxStringLength<0&&s.maxStringLength!==1/0:s.maxStringLength!==null))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var o=ti(s,"customInspect")?s.customInspect:!0;if(typeof o!="boolean"&&o!=="symbol")throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(ti(s,"indent")&&s.indent!==null&&s.indent!==" "&&!(parseInt(s.indent,10)===s.indent&&s.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(ti(s,"numericSeparator")&&typeof s.numericSeparator!="boolean")throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var l=s.numericSeparator;if(typeof e>"u")return"undefined";if(e===null)return"null";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="string")return m_(e,s);if(typeof e=="number"){if(e===0)return 1/0/e>0?"0":"-0";var a=String(e);return l?ng(e,a):a}if(typeof e=="bigint"){var c=String(e)+"n";return l?ng(e,c):c}var u=typeof s.depth>"u"?5:s.depth;if(typeof r>"u"&&(r=0),r>=u&&u>0&&typeof e=="object")return Ud(e)?"[Array]":"[Object]";var f=mE(s,r);if(typeof i>"u")i=[];else if(h_(i,e)>=0)return"[Circular]";function d(Z,X,ke){if(X&&(i=YA.call(i),i.push(X)),ke){var ae={depth:s.depth};return ti(s,"quoteStyle")&&(ae.quoteStyle=s.quoteStyle),t(Z,ae,r+1,i)}return t(Z,s,r+1,i)}if(typeof e=="function"&&!sg(e)){var m=oE(e),h=xa(e,d);return"[Function"+(m?": "+m:" (anonymous)")+"]"+(h.length>0?" { "+sr.call(h,", ")+" }":"")}if(p_(e)){var g=ho?oi.call(String(e),/^(Symbol\(.*\))_[^)]*$/,"$1"):zd.call(e);return typeof e=="object"&&!ho?Uo(g):g}if(dE(e)){for(var S="<"+Qm.call(String(e.nodeName)),_=e.attributes||[],v=0;v<_.length;v++)S+=" "+_[v].name+"="+d_(QA(_[v].value),"double",s);return S+=">",e.childNodes&&e.childNodes.length&&(S+="..."),S+="",S}if(Ud(e)){if(e.length===0)return"[]";var k=xa(e,d);return f&&!hE(k)?"["+Wd(k,f)+"]":"[ "+sr.call(k,", ")+" ]"}if(eE(e)){var b=xa(e,d);return!("cause"in Error.prototype)&&"cause"in e&&!f_.call(e,"cause")?"{ ["+String(e)+"] "+sr.call(Zm.call("[cause]: "+d(e.cause),b),", ")+" }":b.length===0?"["+String(e)+"]":"{ ["+String(e)+"] "+sr.call(b,", ")+" }"}if(typeof e=="object"&&o){if(ig&&typeof e[ig]=="function"&&qd)return qd(e,{depth:u-r});if(o!=="symbol"&&typeof e.inspect=="function")return e.inspect()}if(lE(e)){var N=[];return Gm&&Gm.call(e,function(Z,X){N.push(d(X,e,!0)+" => "+d(Z,e))}),og("Map",cc.call(e),N,f)}if(uE(e)){var E=[];return Ym&&Ym.call(e,function(Z){E.push(d(Z,e))}),og("Set",uc.call(e),E,f)}if(aE(e))return Rf("WeakMap");if(fE(e))return Rf("WeakSet");if(cE(e))return Rf("WeakRef");if(nE(e))return Uo(d(Number(e)));if(iE(e))return Uo(d(Vd.call(e)));if(rE(e))return Uo(UA.call(e));if(tE(e))return Uo(d(String(e)));if(!ZA(e)&&!sg(e)){var P=xa(e,d),T=tg?tg(e)===Object.prototype:e instanceof Object||e.constructor===Object,j=e instanceof Object?"":"null prototype",z=!T&&qt&&Object(e)===e&&qt in e?dh.call(Ai(e),8,-1):j?"Object":"",J=T||typeof e.constructor!="function"?"":e.constructor.name?e.constructor.name+" ":"",B=J+(z||j?"["+sr.call(Zm.call([],z||[],j||[]),": ")+"] ":"");return P.length===0?B+"{}":f?B+"{"+Wd(P,f)+"}":B+"{ "+sr.call(P,", ")+" }"}return String(e)};function d_(t,e,n){var r=(n.quoteStyle||e)==="double"?'"':"'";return r+t+r}function QA(t){return oi.call(String(t),/"/g,""")}function Ud(t){return Ai(t)==="[object Array]"&&(!qt||!(typeof t=="object"&&qt in t))}function ZA(t){return Ai(t)==="[object Date]"&&(!qt||!(typeof t=="object"&&qt in t))}function sg(t){return Ai(t)==="[object RegExp]"&&(!qt||!(typeof t=="object"&&qt in t))}function eE(t){return Ai(t)==="[object Error]"&&(!qt||!(typeof t=="object"&&qt in t))}function tE(t){return Ai(t)==="[object String]"&&(!qt||!(typeof t=="object"&&qt in t))}function nE(t){return Ai(t)==="[object Number]"&&(!qt||!(typeof t=="object"&&qt in t))}function rE(t){return Ai(t)==="[object Boolean]"&&(!qt||!(typeof t=="object"&&qt in t))}function p_(t){if(ho)return t&&typeof t=="object"&&t instanceof Symbol;if(typeof t=="symbol")return!0;if(!t||typeof t!="object"||!zd)return!1;try{return zd.call(t),!0}catch{}return!1}function iE(t){if(!t||typeof t!="object"||!Vd)return!1;try{return Vd.call(t),!0}catch{}return!1}var sE=Object.prototype.hasOwnProperty||function(t){return t in this};function ti(t,e){return sE.call(t,e)}function Ai(t){return WA.call(t)}function oE(t){if(t.name)return t.name;var e=JA.call(KA.call(t),/^function\s*([\w$]+)/);return e?e[1]:null}function h_(t,e){if(t.indexOf)return t.indexOf(e);for(var n=0,r=t.length;ne.maxStringLength){var n=t.length-e.maxStringLength,r="... "+n+" more character"+(n>1?"s":"");return m_(dh.call(t,0,e.maxStringLength),e)+r}var i=oi.call(oi.call(t,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,pE);return d_(i,"single",e)}function pE(t){var e=t.charCodeAt(0),n={8:"b",9:"t",10:"n",12:"f",13:"r"}[e];return n?"\\"+n:"\\x"+(e<16?"0":"")+GA.call(e.toString(16))}function Uo(t){return"Object("+t+")"}function Rf(t){return t+" { ? }"}function og(t,e,n,r){var i=r?Wd(n,r):sr.call(n,", ");return t+" ("+e+") {"+i+"}"}function hE(t){for(var e=0;e=0)return!1;return!0}function mE(t,e){var n;if(t.indent===" ")n=" ";else if(typeof t.indent=="number"&&t.indent>0)n=sr.call(Array(t.indent+1)," ");else return null;return{base:n,prev:sr.call(Array(e+1),n)}}function Wd(t,e){if(t.length===0)return"";var n=` -`+e.prev+e.base;return n+sr.call(t,","+n)+` -`+e.prev}function xa(t,e){var n=Ud(t),r=[];if(n){r.length=t.length;for(var i=0;i1;){var n=e.pop(),r=n.obj[n.prop];if(Vi(r)){for(var i=[],s=0;s=48&&c<=57||c>=65&&c<=90||c>=97&&c<=122||s===ME.RFC1738&&(c===40||c===41)){l+=o.charAt(a);continue}if(c<128){l=l+Zn[c];continue}if(c<2048){l=l+(Zn[192|c>>6]+Zn[128|c&63]);continue}if(c<55296||c>=57344){l=l+(Zn[224|c>>12]+Zn[128|c>>6&63]+Zn[128|c&63]);continue}a+=1,c=65536+((c&1023)<<10|o.charCodeAt(a)&1023),l+=Zn[240|c>>18]+Zn[128|c>>12&63]+Zn[128|c>>6&63]+Zn[128|c&63]}return l},$E=function(e){for(var n=[{obj:{o:e},prop:"o"}],r=[],i=0;i"u"&&(k=0)}if(typeof a=="function"?_=a(n,_):_ instanceof Date?_=f(_):r==="comma"&&Mr(_)&&(_=Ua.maybeMap(_,function(ae){return ae instanceof Date?f(ae):ae})),_===null){if(s)return l&&!h?l(n,Ft.encoder,g,"key",d):n;_=""}if(qE(_)||Ua.isBuffer(_)){if(l){var E=h?n:l(n,Ft.encoder,g,"key",d);return[m(E)+"="+m(l(_,Ft.encoder,g,"value",d))]}return[m(n)+"="+m(String(_))]}var P=[];if(typeof _>"u")return P;var T;if(r==="comma"&&Mr(_))h&&l&&(_=Ua.maybeMap(_,l)),T=[{value:_.length>0?_.join(",")||null:void 0}];else if(Mr(a))T=a;else{var j=Object.keys(_);T=c?j.sort(c):j}for(var z=i&&Mr(_)&&_.length===1?n+"[]":n,J=0;J"u"?Ft.allowDots:!!e.allowDots,charset:n,charsetSentinel:typeof e.charsetSentinel=="boolean"?e.charsetSentinel:Ft.charsetSentinel,delimiter:typeof e.delimiter>"u"?Ft.delimiter:e.delimiter,encode:typeof e.encode=="boolean"?e.encode:Ft.encode,encoder:typeof e.encoder=="function"?e.encoder:Ft.encoder,encodeValuesOnly:typeof e.encodeValuesOnly=="boolean"?e.encodeValuesOnly:Ft.encodeValuesOnly,filter:s,format:r,formatter:i,serializeDate:typeof e.serializeDate=="function"?e.serializeDate:Ft.serializeDate,skipNulls:typeof e.skipNulls=="boolean"?e.skipNulls:Ft.skipNulls,sort:typeof e.sort=="function"?e.sort:null,strictNullHandling:typeof e.strictNullHandling=="boolean"?e.strictNullHandling:Ft.strictNullHandling}},KE=function(t,e){var n=t,r=WE(e),i,s;typeof r.filter=="function"?(s=r.filter,n=s("",n)):Mr(r.filter)&&(s=r.filter,i=s);var o=[];if(typeof n!="object"||n===null)return"";var l;e&&e.arrayFormat in lg?l=e.arrayFormat:e&&"indices"in e?l=e.indices?"indices":"repeat":l="indices";var a=lg[l];if(e&&"commaRoundTrip"in e&&typeof e.commaRoundTrip!="boolean")throw new TypeError("`commaRoundTrip` must be a boolean, or absent");var c=a==="comma"&&e&&e.commaRoundTrip;i||(i=Object.keys(n)),r.sort&&i.sort(r.sort);for(var u=b_(),f=0;f0?h+m:""},mo=y_,Kd=Object.prototype.hasOwnProperty,JE=Array.isArray,vt={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:mo.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},GE=function(t){return t.replace(/&#(\d+);/g,function(e,n){return String.fromCharCode(parseInt(n,10))})},__=function(t,e){return t&&typeof t=="string"&&e.comma&&t.indexOf(",")>-1?t.split(","):t},YE="utf8=%26%2310003%3B",XE="utf8=%E2%9C%93",QE=function(e,n){var r={},i=n.ignoreQueryPrefix?e.replace(/^\?/,""):e,s=n.parameterLimit===1/0?void 0:n.parameterLimit,o=i.split(n.delimiter,s),l=-1,a,c=n.charset;if(n.charsetSentinel)for(a=0;a-1&&(h=JE(h)?[h]:h),Kd.call(r,m)?r[m]=mo.combine(r[m],h):r[m]=h}return r},ZE=function(t,e,n,r){for(var i=r?e:__(e,n),s=t.length-1;s>=0;--s){var o,l=t[s];if(l==="[]"&&n.parseArrays)o=[].concat(i);else{o=n.plainObjects?Object.create(null):{};var a=l.charAt(0)==="["&&l.charAt(l.length-1)==="]"?l.slice(1,-1):l,c=parseInt(a,10);!n.parseArrays&&a===""?o={0:i}:!isNaN(c)&&l!==a&&String(c)===a&&c>=0&&n.parseArrays&&c<=n.arrayLimit?(o=[],o[c]=i):a!=="__proto__"&&(o[a]=i)}i=o}return i},eT=function(e,n,r,i){if(e){var s=r.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,o=/(\[[^[\]]*])/,l=/(\[[^[\]]*])/g,a=r.depth>0&&o.exec(s),c=a?s.slice(0,a.index):s,u=[];if(c){if(!r.plainObjects&&Kd.call(Object.prototype,c)&&!r.allowPrototypes)return;u.push(c)}for(var f=0;r.depth>0&&(a=l.exec(s))!==null&&f"u"?vt.charset:e.charset;return{allowDots:typeof e.allowDots>"u"?vt.allowDots:!!e.allowDots,allowPrototypes:typeof e.allowPrototypes=="boolean"?e.allowPrototypes:vt.allowPrototypes,allowSparse:typeof e.allowSparse=="boolean"?e.allowSparse:vt.allowSparse,arrayLimit:typeof e.arrayLimit=="number"?e.arrayLimit:vt.arrayLimit,charset:n,charsetSentinel:typeof e.charsetSentinel=="boolean"?e.charsetSentinel:vt.charsetSentinel,comma:typeof e.comma=="boolean"?e.comma:vt.comma,decoder:typeof e.decoder=="function"?e.decoder:vt.decoder,delimiter:typeof e.delimiter=="string"||mo.isRegExp(e.delimiter)?e.delimiter:vt.delimiter,depth:typeof e.depth=="number"||e.depth===!1?+e.depth:vt.depth,ignoreQueryPrefix:e.ignoreQueryPrefix===!0,interpretNumericEntities:typeof e.interpretNumericEntities=="boolean"?e.interpretNumericEntities:vt.interpretNumericEntities,parameterLimit:typeof e.parameterLimit=="number"?e.parameterLimit:vt.parameterLimit,parseArrays:e.parseArrays!==!1,plainObjects:typeof e.plainObjects=="boolean"?e.plainObjects:vt.plainObjects,strictNullHandling:typeof e.strictNullHandling=="boolean"?e.strictNullHandling:vt.strictNullHandling}},nT=function(t,e){var n=tT(e);if(t===""||t===null||typeof t>"u")return n.plainObjects?Object.create(null):{};for(var r=typeof t=="string"?QE(t,n):t,i=n.plainObjects?Object.create(null):{},s=Object.keys(r),o=0;o
'};n.configure=function(h){var g,S;for(g in h)S=h[g],S!==void 0&&h.hasOwnProperty(g)&&(r[g]=S);return this},n.status=null,n.set=function(h){var g=n.isStarted();h=i(h,r.minimum,1),n.status=h===1?null:h;var S=n.render(!g),_=S.querySelector(r.barSelector),v=r.speed,k=r.easing;return S.offsetWidth,l(function(b){r.positionUsing===""&&(r.positionUsing=n.getPositioningCSS()),a(_,o(h,v,k)),h===1?(a(S,{transition:"none",opacity:1}),S.offsetWidth,setTimeout(function(){a(S,{transition:"all "+v+"ms linear",opacity:0}),setTimeout(function(){n.remove(),b()},v)},v)):setTimeout(b,v)}),this},n.isStarted=function(){return typeof n.status=="number"},n.start=function(){n.status||n.set(0);var h=function(){setTimeout(function(){n.status&&(n.trickle(),h())},r.trickleSpeed)};return r.trickle&&h(),this},n.done=function(h){return!h&&!n.status?this:n.inc(.3+.5*Math.random()).set(1)},n.inc=function(h){var g=n.status;return g?(typeof h!="number"&&(h=(1-g)*i(Math.random()*g,.1,.95)),g=i(g+h,0,.994),n.set(g)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},function(){var h=0,g=0;n.promise=function(S){return!S||S.state()==="resolved"?this:(g===0&&n.start(),h++,g++,S.always(function(){g--,g===0?(h=0,n.done()):n.set((h-g)/h)}),this)}}(),n.render=function(h){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var g=document.createElement("div");g.id="nprogress",g.innerHTML=r.template;var S=g.querySelector(r.barSelector),_=h?"-100":s(n.status||0),v=document.querySelector(r.parent),k;return a(S,{transition:"all 0 linear",transform:"translate3d("+_+"%,0,0)"}),r.showSpinner||(k=g.querySelector(r.spinnerSelector),k&&m(k)),v!=document.body&&u(v,"nprogress-custom-parent"),v.appendChild(g),g},n.remove=function(){f(document.documentElement,"nprogress-busy"),f(document.querySelector(r.parent),"nprogress-custom-parent");var h=document.getElementById("nprogress");h&&m(h)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var h=document.body.style,g="WebkitTransform"in h?"Webkit":"MozTransform"in h?"Moz":"msTransform"in h?"ms":"OTransform"in h?"O":"";return g+"Perspective"in h?"translate3d":g+"Transform"in h?"translate":"margin"};function i(h,g,S){return hS?S:h}function s(h){return(-1+h)*100}function o(h,g,S){var _;return r.positionUsing==="translate3d"?_={transform:"translate3d("+s(h)+"%,0,0)"}:r.positionUsing==="translate"?_={transform:"translate("+s(h)+"%,0)"}:_={"margin-left":s(h)+"%"},_.transition="all "+g+"ms "+S,_}var l=function(){var h=[];function g(){var S=h.shift();S&&S(g)}return function(S){h.push(S),h.length==1&&g()}}(),a=function(){var h=["Webkit","O","Moz","ms"],g={};function S(b){return b.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(N,E){return E.toUpperCase()})}function _(b){var N=document.body.style;if(b in N)return b;for(var E=h.length,P=b.charAt(0).toUpperCase()+b.slice(1),T;E--;)if(T=h[E]+P,T in N)return T;return b}function v(b){return b=S(b),g[b]||(g[b]=_(b))}function k(b,N,E){N=v(N),b.style[N]=E}return function(b,N){var E=arguments,P,T;if(E.length==2)for(P in N)T=N[P],T!==void 0&&N.hasOwnProperty(P)&&k(b,P,T);else k(b,E[1],E[2])}}();function c(h,g){var S=typeof h=="string"?h:d(h);return S.indexOf(" "+g+" ")>=0}function u(h,g){var S=d(h),_=S+g;c(S,g)||(h.className=_.substring(1))}function f(h,g){var S=d(h),_;c(h,g)&&(_=S.replace(" "+g+" "," "),h.className=_.substring(1,_.length-1))}function d(h){return(" "+(h.className||"")+" ").replace(/\s+/gi," ")}function m(h){h&&h.parentNode&&h.parentNode.removeChild(h)}return n})})(oT);const ar=Jd;function S_(t,e){let n;return function(...r){clearTimeout(n),n=setTimeout(()=>t.apply(this,r),e)}}function zr(t,e){return document.dispatchEvent(new CustomEvent(`inertia:${t}`,e))}var lT=t=>zr("before",{cancelable:!0,detail:{visit:t}}),aT=t=>zr("error",{detail:{errors:t}}),cT=t=>zr("exception",{cancelable:!0,detail:{exception:t}}),ug=t=>zr("finish",{detail:{visit:t}}),uT=t=>zr("invalid",{cancelable:!0,detail:{response:t}}),Wo=t=>zr("navigate",{detail:{page:t}}),fT=t=>zr("progress",{detail:{progress:t}}),dT=t=>zr("start",{detail:{visit:t}}),pT=t=>zr("success",{detail:{page:t}});function Gd(t){return t instanceof File||t instanceof Blob||t instanceof FileList&&t.length>0||t instanceof FormData&&Array.from(t.values()).some(e=>Gd(e))||typeof t=="object"&&t!==null&&Object.values(t).some(e=>Gd(e))}function w_(t,e=new FormData,n=null){t=t||{};for(let r in t)Object.prototype.hasOwnProperty.call(t,r)&&O_(e,k_(n,r),t[r]);return e}function k_(t,e){return t?t+"["+e+"]":e}function O_(t,e,n){if(Array.isArray(n))return Array.from(n.keys()).forEach(r=>O_(t,k_(e,r.toString()),n[r]));if(n instanceof Date)return t.append(e,n.toISOString());if(n instanceof File)return t.append(e,n,n.name);if(n instanceof Blob)return t.append(e,n);if(typeof n=="boolean")return t.append(e,n?"1":"0");if(typeof n=="string")return t.append(e,n);if(typeof n=="number")return t.append(e,`${n}`);if(n==null)return t.append(e,"");w_(n,t,e)}var hT={modal:null,listener:null,show(t){typeof t=="object"&&(t=`All Inertia requests must receive a valid Inertia response, however a plain JSON response was received.
${JSON.stringify(t)}`);let e=document.createElement("html");e.innerHTML=t,e.querySelectorAll("a").forEach(r=>r.setAttribute("target","_top")),this.modal=document.createElement("div"),this.modal.style.position="fixed",this.modal.style.width="100vw",this.modal.style.height="100vh",this.modal.style.padding="50px",this.modal.style.boxSizing="border-box",this.modal.style.backgroundColor="rgba(0, 0, 0, .6)",this.modal.style.zIndex=2e5,this.modal.addEventListener("click",()=>this.hide());let n=document.createElement("iframe");if(n.style.backgroundColor="white",n.style.borderRadius="5px",n.style.width="100%",n.style.height="100%",this.modal.appendChild(n),document.body.prepend(this.modal),document.body.style.overflow="hidden",!n.contentWindow)throw new Error("iframe not yet ready.");n.contentWindow.document.open(),n.contentWindow.document.write(e.outerHTML),n.contentWindow.document.close(),this.listener=this.hideOnEscape.bind(this),document.addEventListener("keydown",this.listener)},hide(){this.modal.outerHTML="",this.modal=null,document.body.style.overflow="visible",document.removeEventListener("keydown",this.listener)},hideOnEscape(t){t.keyCode===27&&this.hide()}};function Ms(t){return new URL(t.toString(),window.location.toString())}function x_(t,e,n,r="brackets"){let i=/^https?:\/\//.test(e.toString()),s=i||e.toString().startsWith("/"),o=!s&&!e.toString().startsWith("#")&&!e.toString().startsWith("?"),l=e.toString().includes("?")||t==="get"&&Object.keys(n).length,a=e.toString().includes("#"),c=new URL(e.toString(),"http://localhost");return t==="get"&&Object.keys(n).length&&(c.search=cg.stringify(hA(cg.parse(c.search,{ignoreQueryPrefix:!0}),n),{encodeValuesOnly:!0,arrayFormat:r}),n={}),[[i?`${c.protocol}//${c.host}`:"",s?c.pathname:"",o?c.pathname.substring(1):"",l?c.search:"",a?c.hash:""].join(""),n]}function Ko(t){return t=new URL(t.href),t.hash="",t}var fg=typeof window>"u",mT=class{constructor(){this.visitId=null}init({initialPage:e,resolveComponent:n,swapComponent:r}){this.page=e,this.resolveComponent=n,this.swapComponent=r,this.setNavigationType(),this.clearRememberedStateOnReload(),this.isBackForwardVisit()?this.handleBackForwardVisit(this.page):this.isLocationVisit()?this.handleLocationVisit(this.page):this.handleInitialPageVisit(this.page),this.setupEventListeners()}setNavigationType(){this.navigationType=window.performance&&window.performance.getEntriesByType("navigation").length>0?window.performance.getEntriesByType("navigation")[0].type:"navigate"}clearRememberedStateOnReload(){var e;this.navigationType==="reload"&&((e=window.history.state)!=null&&e.rememberedState)&&delete window.history.state.rememberedState}handleInitialPageVisit(e){this.page.url+=window.location.hash,this.setPage(e,{preserveState:!0}).then(()=>Wo(e))}setupEventListeners(){window.addEventListener("popstate",this.handlePopstateEvent.bind(this)),document.addEventListener("scroll",S_(this.handleScrollEvent.bind(this),100),!0)}scrollRegions(){return document.querySelectorAll("[scroll-region]")}handleScrollEvent(e){typeof e.target.hasAttribute=="function"&&e.target.hasAttribute("scroll-region")&&this.saveScrollPositions()}saveScrollPositions(){this.replaceState({...this.page,scrollRegions:Array.from(this.scrollRegions()).map(e=>({top:e.scrollTop,left:e.scrollLeft}))})}resetScrollPositions(){window.scrollTo(0,0),this.scrollRegions().forEach(e=>{typeof e.scrollTo=="function"?e.scrollTo(0,0):(e.scrollTop=0,e.scrollLeft=0)}),this.saveScrollPositions(),window.location.hash&&setTimeout(()=>{var e;return(e=document.getElementById(window.location.hash.slice(1)))==null?void 0:e.scrollIntoView()})}restoreScrollPositions(){this.page.scrollRegions&&this.scrollRegions().forEach((e,n)=>{let r=this.page.scrollRegions[n];if(r)typeof e.scrollTo=="function"?e.scrollTo(r.left,r.top):(e.scrollTop=r.top,e.scrollLeft=r.left);else return})}isBackForwardVisit(){return window.history.state&&this.navigationType==="back_forward"}handleBackForwardVisit(e){window.history.state.version=e.version,this.setPage(window.history.state,{preserveScroll:!0,preserveState:!0}).then(()=>{this.restoreScrollPositions(),Wo(e)})}locationVisit(e,n){try{let r={preserveScroll:n};window.sessionStorage.setItem("inertiaLocationVisit",JSON.stringify(r)),window.location.href=e.href,Ko(window.location).href===Ko(e).href&&window.location.reload()}catch{return!1}}isLocationVisit(){try{return window.sessionStorage.getItem("inertiaLocationVisit")!==null}catch{return!1}}handleLocationVisit(e){var r,i;let n=JSON.parse(window.sessionStorage.getItem("inertiaLocationVisit")||"");window.sessionStorage.removeItem("inertiaLocationVisit"),e.url+=window.location.hash,e.rememberedState=((r=window.history.state)==null?void 0:r.rememberedState)??{},e.scrollRegions=((i=window.history.state)==null?void 0:i.scrollRegions)??[],this.setPage(e,{preserveScroll:n.preserveScroll,preserveState:!0}).then(()=>{n.preserveScroll&&this.restoreScrollPositions(),Wo(e)})}isLocationVisitResponse(e){return!!(e&&e.status===409&&e.headers["x-inertia-location"])}isInertiaResponse(e){return!!(e!=null&&e.headers["x-inertia"])}createVisitId(){return this.visitId={},this.visitId}cancelVisit(e,{cancelled:n=!1,interrupted:r=!1}){e&&!e.completed&&!e.cancelled&&!e.interrupted&&(e.cancelToken.abort(),e.onCancel(),e.completed=!1,e.cancelled=n,e.interrupted=r,ug(e),e.onFinish(e))}finishVisit(e){!e.cancelled&&!e.interrupted&&(e.completed=!0,e.cancelled=!1,e.interrupted=!1,ug(e),e.onFinish(e))}resolvePreserveOption(e,n){return typeof e=="function"?e(n):e==="errors"?Object.keys(n.props.errors||{}).length>0:e}cancel(){this.activeVisit&&this.cancelVisit(this.activeVisit,{cancelled:!0})}visit(e,{method:n="get",data:r={},replace:i=!1,preserveScroll:s=!1,preserveState:o=!1,only:l=[],headers:a={},errorBag:c="",forceFormData:u=!1,onCancelToken:f=()=>{},onBefore:d=()=>{},onStart:m=()=>{},onProgress:h=()=>{},onFinish:g=()=>{},onCancel:S=()=>{},onSuccess:_=()=>{},onError:v=()=>{},queryStringArrayFormat:k="brackets"}={}){let b=typeof e=="string"?Ms(e):e;if((Gd(r)||u)&&!(r instanceof FormData)&&(r=w_(r)),!(r instanceof FormData)){let[P,T]=x_(n,b,r,k);b=Ms(P),r=T}let N={url:b,method:n,data:r,replace:i,preserveScroll:s,preserveState:o,only:l,headers:a,errorBag:c,forceFormData:u,queryStringArrayFormat:k,cancelled:!1,completed:!1,interrupted:!1};if(d(N)===!1||!lT(N))return;this.activeVisit&&this.cancelVisit(this.activeVisit,{interrupted:!0}),this.saveScrollPositions();let E=this.createVisitId();this.activeVisit={...N,onCancelToken:f,onBefore:d,onStart:m,onProgress:h,onFinish:g,onCancel:S,onSuccess:_,onError:v,queryStringArrayFormat:k,cancelToken:new AbortController},f({cancel:()=>{this.activeVisit&&this.cancelVisit(this.activeVisit,{cancelled:!0})}}),dT(N),m(N),Hd({method:n,url:Ko(b).href,data:n==="get"?{}:r,params:n==="get"?r:{},signal:this.activeVisit.cancelToken.signal,headers:{...a,Accept:"text/html, application/xhtml+xml","X-Requested-With":"XMLHttpRequest","X-Inertia":!0,...l.length?{"X-Inertia-Partial-Component":this.page.component,"X-Inertia-Partial-Data":l.join(",")}:{},...c&&c.length?{"X-Inertia-Error-Bag":c}:{},...this.page.version?{"X-Inertia-Version":this.page.version}:{}},onUploadProgress:P=>{r instanceof FormData&&(P.percentage=P.progress?Math.round(P.progress*100):0,fT(P),h(P))}}).then(P=>{var J;if(!this.isInertiaResponse(P))return Promise.reject({response:P});let T=P.data;l.length&&T.component===this.page.component&&(T.props={...this.page.props,...T.props}),s=this.resolvePreserveOption(s,T),o=this.resolvePreserveOption(o,T),o&&((J=window.history.state)!=null&&J.rememberedState)&&T.component===this.page.component&&(T.rememberedState=window.history.state.rememberedState);let j=b,z=Ms(T.url);return j.hash&&!z.hash&&Ko(j).href===z.href&&(z.hash=j.hash,T.url=z.href),this.setPage(T,{visitId:E,replace:i,preserveScroll:s,preserveState:o})}).then(()=>{let P=this.page.props.errors||{};if(Object.keys(P).length>0){let T=c?P[c]?P[c]:{}:P;return aT(T),v(T)}return pT(this.page),_(this.page)}).catch(P=>{if(this.isInertiaResponse(P.response))return this.setPage(P.response.data,{visitId:E});if(this.isLocationVisitResponse(P.response)){let T=Ms(P.response.headers["x-inertia-location"]),j=b;j.hash&&!T.hash&&Ko(j).href===T.href&&(T.hash=j.hash),this.locationVisit(T,s===!0)}else if(P.response)uT(P.response)&&hT.show(P.response.data);else return Promise.reject(P)}).then(()=>{this.activeVisit&&this.finishVisit(this.activeVisit)}).catch(P=>{if(!Hd.isCancel(P)){let T=cT(P);if(this.activeVisit&&this.finishVisit(this.activeVisit),T)return Promise.reject(P)}})}setPage(e,{visitId:n=this.createVisitId(),replace:r=!1,preserveScroll:i=!1,preserveState:s=!1}={}){return Promise.resolve(this.resolveComponent(e.component)).then(o=>{n===this.visitId&&(e.scrollRegions=e.scrollRegions||[],e.rememberedState=e.rememberedState||{},r=r||Ms(e.url).href===window.location.href,r?this.replaceState(e):this.pushState(e),this.swapComponent({component:o,page:e,preserveState:s}).then(()=>{i||this.resetScrollPositions(),r||Wo(e)}))})}pushState(e){this.page=e,window.history.pushState(e,"",e.url)}replaceState(e){this.page=e,window.history.replaceState(e,"",e.url)}handlePopstateEvent(e){if(e.state!==null){let n=e.state,r=this.createVisitId();Promise.resolve(this.resolveComponent(n.component)).then(i=>{r===this.visitId&&(this.page=n,this.swapComponent({component:i,page:n,preserveState:!1}).then(()=>{this.restoreScrollPositions(),Wo(n)}))})}else{let n=Ms(this.page.url);n.hash=window.location.hash,this.replaceState({...this.page,url:n.href}),this.resetScrollPositions()}}get(e,n={},r={}){return this.visit(e,{...r,method:"get",data:n})}reload(e={}){return this.visit(window.location.href,{...e,preserveScroll:!0,preserveState:!0})}replace(e,n={}){return console.warn(`Inertia.replace() has been deprecated and will be removed in a future release. Please use Inertia.${n.method??"get"}() instead.`),this.visit(e,{preserveState:!0,...n,replace:!0})}post(e,n={},r={}){return this.visit(e,{preserveState:!0,...r,method:"post",data:n})}put(e,n={},r={}){return this.visit(e,{preserveState:!0,...r,method:"put",data:n})}patch(e,n={},r={}){return this.visit(e,{preserveState:!0,...r,method:"patch",data:n})}delete(e,n={}){return this.visit(e,{preserveState:!0,...n,method:"delete"})}remember(e,n="default"){var r;fg||this.replaceState({...this.page,rememberedState:{...(r=this.page)==null?void 0:r.rememberedState,[n]:e}})}restore(e="default"){var n,r;if(!fg)return(r=(n=window.history.state)==null?void 0:n.rememberedState)==null?void 0:r[e]}on(e,n){let r=i=>{let s=n(i);i.cancelable&&!i.defaultPrevented&&s===!1&&i.preventDefault()};return document.addEventListener(`inertia:${e}`,r),()=>document.removeEventListener(`inertia:${e}`,r)}},gT={buildDOMElement(t){let e=document.createElement("template");e.innerHTML=t;let n=e.content.firstChild;if(!t.startsWith(" diff --git a/resources/js/Components/Actions/Action.vue b/resources/js/Components/Actions/Action.vue deleted file mode 100644 index d796c08f3..000000000 --- a/resources/js/Components/Actions/Action.vue +++ /dev/null @@ -1,77 +0,0 @@ - - - diff --git a/resources/js/Components/Actions/Actions.vue b/resources/js/Components/Actions/Actions.vue deleted file mode 100644 index dd1b97110..000000000 --- a/resources/js/Components/Actions/Actions.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - diff --git a/resources/js/Components/Alert.vue b/resources/js/Components/Alert.vue deleted file mode 100644 index 1ce749d1e..000000000 --- a/resources/js/Components/Alert.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - diff --git a/resources/js/Components/Dropdown.vue b/resources/js/Components/Dropdown.vue deleted file mode 100644 index 2e1ed66f0..000000000 --- a/resources/js/Components/Dropdown.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - diff --git a/resources/js/Components/Form/AsyncSelect.vue b/resources/js/Components/Form/AsyncSelect.vue deleted file mode 100644 index e3e1fde31..000000000 --- a/resources/js/Components/Form/AsyncSelect.vue +++ /dev/null @@ -1,219 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Checkbox.vue b/resources/js/Components/Form/Checkbox.vue deleted file mode 100644 index d959239b9..000000000 --- a/resources/js/Components/Form/Checkbox.vue +++ /dev/null @@ -1,100 +0,0 @@ - - - diff --git a/resources/js/Components/Form/DateTime.vue b/resources/js/Components/Form/DateTime.vue deleted file mode 100644 index da2c41578..000000000 --- a/resources/js/Components/Form/DateTime.vue +++ /dev/null @@ -1,119 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/Blockquote.vue b/resources/js/Components/Form/Editor/Blockquote.vue deleted file mode 100644 index c20afb7e8..000000000 --- a/resources/js/Components/Form/Editor/Blockquote.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/Bold.vue b/resources/js/Components/Form/Editor/Bold.vue deleted file mode 100644 index e20f08e93..000000000 --- a/resources/js/Components/Form/Editor/Bold.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/CodeBlock.vue b/resources/js/Components/Form/Editor/CodeBlock.vue deleted file mode 100644 index d36ef4f18..000000000 --- a/resources/js/Components/Form/Editor/CodeBlock.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/Editor.vue b/resources/js/Components/Form/Editor/Editor.vue deleted file mode 100644 index 1bdee4b94..000000000 --- a/resources/js/Components/Form/Editor/Editor.vue +++ /dev/null @@ -1,166 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/Heading.vue b/resources/js/Components/Form/Editor/Heading.vue deleted file mode 100644 index ba153dd04..000000000 --- a/resources/js/Components/Form/Editor/Heading.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/Highlight.vue b/resources/js/Components/Form/Editor/Highlight.vue deleted file mode 100644 index 3d10a4811..000000000 --- a/resources/js/Components/Form/Editor/Highlight.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/History.vue b/resources/js/Components/Form/Editor/History.vue deleted file mode 100644 index 83b8dd1d6..000000000 --- a/resources/js/Components/Form/Editor/History.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/HorizontalRule.vue b/resources/js/Components/Form/Editor/HorizontalRule.vue deleted file mode 100644 index 382b25c1c..000000000 --- a/resources/js/Components/Form/Editor/HorizontalRule.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/Italic.vue b/resources/js/Components/Form/Editor/Italic.vue deleted file mode 100644 index 610bd46be..000000000 --- a/resources/js/Components/Form/Editor/Italic.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/Link.vue b/resources/js/Components/Form/Editor/Link.vue deleted file mode 100644 index affe0c409..000000000 --- a/resources/js/Components/Form/Editor/Link.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/Media.vue b/resources/js/Components/Form/Editor/Media.vue deleted file mode 100644 index 628553ba2..000000000 --- a/resources/js/Components/Form/Editor/Media.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/OrderedList.vue b/resources/js/Components/Form/Editor/OrderedList.vue deleted file mode 100644 index f4f822f29..000000000 --- a/resources/js/Components/Form/Editor/OrderedList.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/Strike.vue b/resources/js/Components/Form/Editor/Strike.vue deleted file mode 100644 index 16b10b42f..000000000 --- a/resources/js/Components/Form/Editor/Strike.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/TextAlign.vue b/resources/js/Components/Form/Editor/TextAlign.vue deleted file mode 100644 index f27a808a6..000000000 --- a/resources/js/Components/Form/Editor/TextAlign.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Editor/UnorderedList.vue b/resources/js/Components/Form/Editor/UnorderedList.vue deleted file mode 100644 index bf1c0c76e..000000000 --- a/resources/js/Components/Form/Editor/UnorderedList.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Fieldset.vue b/resources/js/Components/Form/Fieldset.vue deleted file mode 100644 index 0accc7919..000000000 --- a/resources/js/Components/Form/Fieldset.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Handler.js b/resources/js/Components/Form/Handler.js deleted file mode 100644 index 68cc2e7e2..000000000 --- a/resources/js/Components/Form/Handler.js +++ /dev/null @@ -1,82 +0,0 @@ -import { debounce } from './../../Support/Helpers'; -import { h, resolveComponent } from 'vue'; -import AsyncSelect from './AsyncSelect.vue'; -import Checkbox from './Checkbox.vue'; -import DateTime from './DateTime.vue'; -import Editor from './Editor/Editor.vue'; -import Fieldset from './Fieldset.vue'; -import Hidden from './Hidden.vue'; -import Input from './Input.vue'; -import Media from './Media.vue'; -import Radio from './Radio.vue'; -import Range from './Range.vue'; -import Select from './Select.vue'; -import SubResource from './SubResource.vue'; -import Tag from './Tag.vue'; -import Textarea from './Textarea.vue'; - -export default { - name: 'FormHandler', - - components: { - AsyncSelect, - Checkbox, - DateTime, - Editor, - Fieldset, - Hidden, - Input, - Media, - Radio, - Range, - Select, - SubResource, - Tag, - Textarea, - }, - - props: { - modelValue: { - default: null, - }, - name: { - type: String, - required: true, - }, - component: { - type: String, - default: 'Input', - }, - form: { - type: Object, - required: true, - }, - componentResolver: { - type: Function, - default: (component) => resolveComponent(component), - }, - debounce: { - type: Number, - default: 0, - }, - }, - - inheritAttrs: false, - - emits: ['update:modelValue'], - - render() { - return h(this.componentResolver(this.component), { - ...this.$attrs, - name: this.name, - modelValue: this.modelValue, - error: this.form.errors[this.name], - readonly: this.form.processing || ! [undefined, 'false', false].includes(this.$attrs.readonly), - required: ! [undefined, 'false', false].includes(this.$attrs.required), - 'onUpdate:modelValue': debounce((value) => { - this.$emit('update:modelValue', value); - this.form.clearErrors(this.name); - }, this.debounce || 0), - }, this.$slots); - }, -} diff --git a/resources/js/Components/Form/Hidden.vue b/resources/js/Components/Form/Hidden.vue deleted file mode 100644 index 9bfbe1d74..000000000 --- a/resources/js/Components/Form/Hidden.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Input.vue b/resources/js/Components/Form/Input.vue deleted file mode 100644 index 1ea539a7d..000000000 --- a/resources/js/Components/Form/Input.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Media.vue b/resources/js/Components/Form/Media.vue deleted file mode 100644 index 3c116a97c..000000000 --- a/resources/js/Components/Form/Media.vue +++ /dev/null @@ -1,139 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Radio.vue b/resources/js/Components/Form/Radio.vue deleted file mode 100644 index de3f41847..000000000 --- a/resources/js/Components/Form/Radio.vue +++ /dev/null @@ -1,81 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Range.vue b/resources/js/Components/Form/Range.vue deleted file mode 100644 index db998e13e..000000000 --- a/resources/js/Components/Form/Range.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Select.vue b/resources/js/Components/Form/Select.vue deleted file mode 100644 index 134e49020..000000000 --- a/resources/js/Components/Form/Select.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - diff --git a/resources/js/Components/Form/SubResource.vue b/resources/js/Components/Form/SubResource.vue deleted file mode 100644 index 2b09a0b64..000000000 --- a/resources/js/Components/Form/SubResource.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Tag.vue b/resources/js/Components/Form/Tag.vue deleted file mode 100644 index 653f7ba54..000000000 --- a/resources/js/Components/Form/Tag.vue +++ /dev/null @@ -1,115 +0,0 @@ - - - diff --git a/resources/js/Components/Form/Textarea.vue b/resources/js/Components/Form/Textarea.vue deleted file mode 100644 index 89673d3a0..000000000 --- a/resources/js/Components/Form/Textarea.vue +++ /dev/null @@ -1,70 +0,0 @@ - - - diff --git a/resources/js/Components/Icon.vue b/resources/js/Components/Icon.vue deleted file mode 100644 index 62f34a75e..000000000 --- a/resources/js/Components/Icon.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/resources/js/Components/Layout/Breadcrumbs.vue b/resources/js/Components/Layout/Breadcrumbs.vue deleted file mode 100644 index 6af463e19..000000000 --- a/resources/js/Components/Layout/Breadcrumbs.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - diff --git a/resources/js/Components/Layout/Form.vue b/resources/js/Components/Layout/Form.vue deleted file mode 100644 index f11dfbe4d..000000000 --- a/resources/js/Components/Layout/Form.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - diff --git a/resources/js/Components/Layout/Header.vue b/resources/js/Components/Layout/Header.vue deleted file mode 100644 index f9d2cabb5..000000000 --- a/resources/js/Components/Layout/Header.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/resources/js/Components/Layout/Layout.vue b/resources/js/Components/Layout/Layout.vue deleted file mode 100644 index e0bfaa72d..000000000 --- a/resources/js/Components/Layout/Layout.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - diff --git a/resources/js/Components/Layout/Nav.vue b/resources/js/Components/Layout/Nav.vue deleted file mode 100644 index af44f25ae..000000000 --- a/resources/js/Components/Layout/Nav.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - diff --git a/resources/js/Components/Layout/Sidebar.vue b/resources/js/Components/Layout/Sidebar.vue deleted file mode 100644 index d6f1cc661..000000000 --- a/resources/js/Components/Layout/Sidebar.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - diff --git a/resources/js/Components/Layout/UserMenu.vue b/resources/js/Components/Layout/UserMenu.vue deleted file mode 100644 index 7292bb4bc..000000000 --- a/resources/js/Components/Layout/UserMenu.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - diff --git a/resources/js/Components/Media/Filters.vue b/resources/js/Components/Media/Filters.vue deleted file mode 100644 index 88672c193..000000000 --- a/resources/js/Components/Media/Filters.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/resources/js/Components/Media/Item.vue b/resources/js/Components/Media/Item.vue deleted file mode 100644 index c5c6d19ce..000000000 --- a/resources/js/Components/Media/Item.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - diff --git a/resources/js/Components/Media/Media.vue b/resources/js/Components/Media/Media.vue deleted file mode 100644 index 9f93062df..000000000 --- a/resources/js/Components/Media/Media.vue +++ /dev/null @@ -1,218 +0,0 @@ - - - diff --git a/resources/js/Components/Media/Queue.vue b/resources/js/Components/Media/Queue.vue deleted file mode 100644 index 055f8d38b..000000000 --- a/resources/js/Components/Media/Queue.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - diff --git a/resources/js/Components/Media/QueuedItem.vue b/resources/js/Components/Media/QueuedItem.vue deleted file mode 100644 index 37759649c..000000000 --- a/resources/js/Components/Media/QueuedItem.vue +++ /dev/null @@ -1,112 +0,0 @@ - - - diff --git a/resources/js/Components/Media/Selected.vue b/resources/js/Components/Media/Selected.vue deleted file mode 100644 index f1d9d5b0b..000000000 --- a/resources/js/Components/Media/Selected.vue +++ /dev/null @@ -1,93 +0,0 @@ - - - diff --git a/resources/js/Components/Media/Selection.vue b/resources/js/Components/Media/Selection.vue deleted file mode 100644 index 1ebb98f9c..000000000 --- a/resources/js/Components/Media/Selection.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - diff --git a/resources/js/Components/Media/Toolbar.vue b/resources/js/Components/Media/Toolbar.vue deleted file mode 100644 index 40ecd3534..000000000 --- a/resources/js/Components/Media/Toolbar.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/resources/js/Components/Modal.vue b/resources/js/Components/Modal.vue deleted file mode 100644 index 293010ca0..000000000 --- a/resources/js/Components/Modal.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - diff --git a/resources/js/Components/Notifications/Notification.vue b/resources/js/Components/Notifications/Notification.vue deleted file mode 100644 index c83eb08c9..000000000 --- a/resources/js/Components/Notifications/Notification.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - diff --git a/resources/js/Components/Notifications/Notifications.vue b/resources/js/Components/Notifications/Notifications.vue deleted file mode 100644 index 04aac4c63..000000000 --- a/resources/js/Components/Notifications/Notifications.vue +++ /dev/null @@ -1,111 +0,0 @@ - - - diff --git a/resources/js/Components/Relations/Relation.vue b/resources/js/Components/Relations/Relation.vue deleted file mode 100644 index 8540e110c..000000000 --- a/resources/js/Components/Relations/Relation.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - diff --git a/resources/js/Components/Table/Filters.vue b/resources/js/Components/Table/Filters.vue deleted file mode 100644 index 6b74038bb..000000000 --- a/resources/js/Components/Table/Filters.vue +++ /dev/null @@ -1,77 +0,0 @@ - - - diff --git a/resources/js/Components/Table/Head.vue b/resources/js/Components/Table/Head.vue deleted file mode 100644 index f84cc0635..000000000 --- a/resources/js/Components/Table/Head.vue +++ /dev/null @@ -1,111 +0,0 @@ - - - diff --git a/resources/js/Components/Table/Pagination.vue b/resources/js/Components/Table/Pagination.vue deleted file mode 100644 index 0a37311d9..000000000 --- a/resources/js/Components/Table/Pagination.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - diff --git a/resources/js/Components/Table/Row.vue b/resources/js/Components/Table/Row.vue deleted file mode 100644 index 8437f990d..000000000 --- a/resources/js/Components/Table/Row.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - diff --git a/resources/js/Components/Table/Table.vue b/resources/js/Components/Table/Table.vue deleted file mode 100644 index 44ee840d2..000000000 --- a/resources/js/Components/Table/Table.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - diff --git a/resources/js/Components/Widgets/Handler.js b/resources/js/Components/Widgets/Handler.js deleted file mode 100644 index 52b488199..000000000 --- a/resources/js/Components/Widgets/Handler.js +++ /dev/null @@ -1,23 +0,0 @@ -import { h, resolveComponent } from 'vue'; -import Widget from './Widget.vue'; - -export default { - name: 'WidgetHandler', - - components: { - Widget, - }, - - props: { - component: { - type: String, - default: 'Widget', - }, - }, - - inheritAttrs: false, - - render() { - return h(resolveComponent(this.component), this.$attrs, this.$slots); - }, -} diff --git a/resources/js/Components/Widgets/Widget.vue b/resources/js/Components/Widgets/Widget.vue deleted file mode 100644 index 8daed5616..000000000 --- a/resources/js/Components/Widgets/Widget.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - diff --git a/resources/js/Support/Cookie.js b/resources/js/Cookie.js similarity index 92% rename from resources/js/Support/Cookie.js rename to resources/js/Cookie.js index f183238c4..153b51d1c 100644 --- a/resources/js/Support/Cookie.js +++ b/resources/js/Cookie.js @@ -10,13 +10,13 @@ export default class Cookie * @param {object} options * @return {void} */ - set(key, value, expires = null, path = '/', options = { SameSite: 'Lax' }) + set(key, value, expires = null, path = '/', options = {}) { const pairs = Object.assign({ [key]: value, expires: expires instanceof Date ? expires.toUTCString() : expires, path, - }, options); + }, { SameSite: 'Lax' }, options); document.cookie = Object.entries(pairs) .reduce((stack, entry) => stack.concat(entry.join('=')), []) diff --git a/resources/js/Directives/Debounce.js b/resources/js/Directives/Debounce.js deleted file mode 100644 index e1e2a3d2b..000000000 --- a/resources/js/Directives/Debounce.js +++ /dev/null @@ -1,11 +0,0 @@ -import { debounce } from './../Support/Helpers'; - -export default { - beforeMount(el, binding) { - if (binding.value !== binding.oldValue) { - el.oninput = debounce((event) => { - el.dispatchEvent(new Event('change')); - }, parseInt(binding.value) || 300); - } - }, -} diff --git a/resources/js/Item.js b/resources/js/Item.js new file mode 100644 index 000000000..ba3442279 --- /dev/null +++ b/resources/js/Item.js @@ -0,0 +1,108 @@ +export default class Item +{ + /** + * Create a new item instance. + */ + constructor(file, config) + { + this.file = file; + this.error = null; + this.failed = false; + this.progress = 0; + this.uploaded = 0; + this.config = config; + this.hash = this._createHash(); + this.chunks = this._createChunks(); + } + + /** + * Handle the upload of the chunks. + */ + handle() + { + return this.chunks.reduce((promise, chunk, index) => { + return promise.then(() => { + return this.upload(chunk, index + 1) + }); + }, Promise.resolve(null)); + } + + /** + * Upload the given chunk. + */ + upload(chunk, index) + { + const formData = new FormData(); + + formData.set('file', chunk, `${this.hash}${this.file.name}`); + + return window.$http.post(this.config.url, formData, { + headers: { + 'X-Chunk-Hash': this.hash, + 'X-Chunk-Index': index, + 'X-Chunk-Total': this.chunks.length, + 'Content-Type': 'multipart/form-data', + }, + onUploadProgress: (event) => { + this.uploaded += event.loaded; + this.progress = Math.floor((this.uploaded * 100) / this.file.size); + }, + }).then((response) => { + return response.data; + }).catch((error) => { + this.error = error.response.data.message; + this.failed = true; + + throw new Error(); + }); + } + + /** + * Cancel the upload. + */ + cancel() + { + // + } + + /** + * Retry the upload. + */ + retry() + { + this.chunks = this._createChunks(); + this.error = null; + this.failed = false; + this.hash = this._createHash(); + this.processing = false; + this.progress = 0; + this.uploaded = 0; + } + + /** + * Create a unique hash. + */ + _createHash() + { + return Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10); + } + + /** + * Create the file chunks. + */ + _createChunks() + { + let chunks = []; + + const size = this.config.chunkSize; + const count = Math.ceil(this.file.size / size); + + for (let i = 0; i < count; i++) { + chunks.push(this.file.slice( + i * size, Math.min(i * size + size, this.file.size), this.file.type + )); + } + + return chunks; + } +} diff --git a/resources/js/Mixins/Closable.js b/resources/js/Mixins/Closable.js deleted file mode 100644 index 0dd1871bf..000000000 --- a/resources/js/Mixins/Closable.js +++ /dev/null @@ -1,25 +0,0 @@ -export default { - data() { - return { - isOpen: false, - }; - }, - - methods: { - open() { - if (! this.isOpen) { - this.isOpen = true; - this.$dispatcher.emit('open'); - } - }, - close() { - if (this.isOpen) { - this.isOpen = false; - this.$dispatcher.emit('close'); - } - }, - toggle() { - this.isOpen ? this.close() : this.open(); - }, - }, -} diff --git a/resources/js/Mixins/DispatchesEvents.js b/resources/js/Mixins/DispatchesEvents.js deleted file mode 100644 index 80359133b..000000000 --- a/resources/js/Mixins/DispatchesEvents.js +++ /dev/null @@ -1,14 +0,0 @@ -import Dispatcher from './../Support/Dispatcher'; - -export default { - beforeCreate() { - const dispatcher = new Dispatcher(); - - this.$dispatcher = { - on: (...args) => dispatcher.addEventListener(...args), - once: (event, callback, options = {}) => dispatcher.addEventListener(event, callback, { once: true, ...options }), - off: (...args) => dispatcher.removeEventListener(...args), - emit: (...args) => dispatcher.dispatchEvent(...args), - }; - }, -} diff --git a/resources/js/Pages/Dashboard.vue b/resources/js/Pages/Dashboard.vue deleted file mode 100644 index 774f50427..000000000 --- a/resources/js/Pages/Dashboard.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - diff --git a/resources/js/Pages/Error.vue b/resources/js/Pages/Error.vue deleted file mode 100644 index 9ec3271a8..000000000 --- a/resources/js/Pages/Error.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - diff --git a/resources/js/Pages/Extracts/Index.vue b/resources/js/Pages/Extracts/Index.vue deleted file mode 100644 index f8f3072c6..000000000 --- a/resources/js/Pages/Extracts/Index.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - diff --git a/resources/js/Pages/Relations/Index.vue b/resources/js/Pages/Relations/Index.vue deleted file mode 100644 index 4b49fb74b..000000000 --- a/resources/js/Pages/Relations/Index.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - diff --git a/resources/js/Pages/Resources/Form.vue b/resources/js/Pages/Resources/Form.vue deleted file mode 100644 index 47a93b469..000000000 --- a/resources/js/Pages/Resources/Form.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - diff --git a/resources/js/Pages/Resources/Index.vue b/resources/js/Pages/Resources/Index.vue deleted file mode 100644 index f8f3072c6..000000000 --- a/resources/js/Pages/Resources/Index.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - diff --git a/resources/js/Pages/Resources/Show.vue b/resources/js/Pages/Resources/Show.vue deleted file mode 100644 index f48b640e7..000000000 --- a/resources/js/Pages/Resources/Show.vue +++ /dev/null @@ -1,106 +0,0 @@ - - - diff --git a/resources/js/Plugins/Root.js b/resources/js/Plugins/Root.js deleted file mode 100644 index 7b2a2966c..000000000 --- a/resources/js/Plugins/Root.js +++ /dev/null @@ -1,44 +0,0 @@ -import Accordion from './../Components/Accordion.vue'; -import Axios from 'axios'; -import Cookie from './../Support/Cookie'; -import Debounce from './../Directives/Debounce'; -import DispatchesEvents from './../Mixins/DispatchesEvents'; -import Dropdown from './../Components/Dropdown.vue'; -import FormHandler from './../Components/Form/Handler'; -import Icon from './../Components/Icon.vue'; -import Modal from './../Components/Modal.vue'; -import Translator from './../Support/Translator'; -import WidgetHandler from './../Components/Widgets/Handler'; - -export default { - install(app, options = {}) { - app.mixin(DispatchesEvents); - - app.component('Accordion', Accordion); - app.component('Dropdown', Dropdown); - app.component('FormHandler', FormHandler); - app.component('Icon', Icon); - app.component('Modal', Modal); - app.component('WidgetHandler', WidgetHandler); - - app.directive('debounce', Debounce); - - app.config.globalProperties.$app = options; - - app.config.globalProperties.$cookie = new Cookie(); - - const translator = new Translator(options.translations || {}); - - app.config.globalProperties.__ = (string, replace = {}) => { - return translator.__(string, replace); - }; - - app.config.globalProperties.$http = Axios.create({ - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'X-Requested-With': 'XMLHttpRequest', - }, - }); - }, -} diff --git a/resources/js/Support/Dispatcher.js b/resources/js/Support/Dispatcher.js deleted file mode 100644 index 9b3c86561..000000000 --- a/resources/js/Support/Dispatcher.js +++ /dev/null @@ -1,49 +0,0 @@ -export default class Dispatcher -{ - /** - * Initialize a new event dispatcher instance. - * - * @return {void} - */ - constructor() - { - this.dispatcher = document.createElement('dispatcher'); - } - - /** - * Add an event listener. - * - * @param {string} event - * @param {function} callback - * @param {object} options - * @return {void} - */ - addEventListener(event, callback, options = {}) - { - this.dispatcher.addEventListener(event, callback, options); - } - - /** - * Remove an event listener. - * - * @param {string} event - * @param {function} callback - * @return {void} - */ - removeEventListener(event, callback) - { - this.dispatcher.removeEventListener(event, callback); - } - - /** - * Dispatch an event. - * - * @param {string} event - * @param {object} detail - * @return {void} - */ - dispatchEvent(event, detail = {}) - { - this.dispatcher.dispatchEvent(new CustomEvent(event, { detail })); - } -} diff --git a/resources/js/Support/Translator.js b/resources/js/Support/Translator.js deleted file mode 100644 index b39345c2e..000000000 --- a/resources/js/Support/Translator.js +++ /dev/null @@ -1,37 +0,0 @@ -export default class Translator -{ - /** - * Create a new Translator instance. - * - * @param {object} translations - * @return {void} - */ - constructor(translations) - { - this.translations = translations; - } - - /** - * Translate the given string. - * - * @param {string} string - * @param {object} replace - * @return {string} - */ - __(string, replace = {}) - { - string = this.translations[string] || string; - - for (let placeholder in replace) { - string = string.toString() - .replace(`:${placeholder}`, replace[placeholder]) - .replace(`:${placeholder.toUpperCase()}`, replace[placeholder].toString().toUpperCase()) - .replace( - `:${placeholder.charAt(0).toUpperCase()}${placeholder.slice(1)}`, - replace[placeholder].toString().charAt(0).toUpperCase() + replace[placeholder].toString().slice(1) - ); - } - - return string.toString().trim(); - } -} diff --git a/resources/js/app.js b/resources/js/app.js index 201d69083..dbe67587a 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,36 +1,23 @@ -import './../sass/app.scss'; -import { createInertiaApp } from '@inertiajs/vue3'; -import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; -import * as Vue from 'vue'; -import Layout from './Components/Layout/Layout.vue'; -import Root from './Plugins/Root'; +import Alpine from 'alpinejs'; +import Axios from 'axios'; +import focus from '@alpinejs/focus'; +import Cookie from './Cookie'; +import './notifications'; +import './theme'; -window.Vue = Vue; +// Alpine +Alpine.plugin(focus); +window.Alpine = Alpine; -createInertiaApp({ - resolve: (name) => { - return resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob('./Pages/**/*.vue', { eager: true })) - .catch(() => { - return new Promise((resolve, reject) => { - resolve(Vue.resolveComponent(name)); - }); - }) - .then((page) => { - page.default.resolveDefaultLayout = () => Layout; - - return page; - }); - }, - setup({ el, App, props, plugin }) { - const app = Vue.createApp({ render: () => Vue.h(App, props) }); - - app.use(plugin); - app.use(Root, window.Root); - - document.dispatchEvent(new CustomEvent('root:booting', { detail: { app } })); - - const instance = app.mount(el); - - document.dispatchEvent(new CustomEvent('root:booted', { detail: { app, instance } })); +// Axios +window.$http = Axios.create({ + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'X-Requested-With': 'XMLHttpRequest', + 'X-Root-Request': 'true', }, }); + +// Cookie +window.$cookie = new Cookie(); diff --git a/resources/js/dropdown.js b/resources/js/dropdown.js new file mode 100644 index 000000000..404c76132 --- /dev/null +++ b/resources/js/dropdown.js @@ -0,0 +1,61 @@ +document.addEventListener('alpine:init', () => { + window.Alpine.data('dropdown', (options, selection, config) => { + return { + selection: selection, + options: options, + search: null, + open: false, + highlighted: 0, + highlight(index) { + this.open = true; + + if (this.options.length === 0) { + this.highlighted = null; + } else if (index >= this.options.length) { + this.highlighted = 0; + } else if (index < 0) { + this.highlighted = this.options.length - 1; + } else { + this.highlighted = index; + } + + this.$refs.listbox.children[this.highlighted + 1].scrollIntoView({ + behavior: 'smooth', + block: 'nearest', + }); + }, + highlightNext() { + this.highlight(this.highlighted + 1); + }, + highlightPrev() { + this.highlight(this.highlighted - 1); + }, + select(item) { + config.multiple + ? this.selection.push(item) + : this.selection = [item]; + }, + deselect(item) { + this.selection.splice( + this.selection.findIndex((selected) => selected.value === item.value), 1 + ); + }, + toggle(item) { + this.selected(item) ? this.deselect(item) : this.select(item); + }, + selected(item) { + return this.selection.findIndex((selected) => selected.value === item.value) > -1; + }, + filter(search) { + if (! search) { + return this.options; + } + + return this.options.filter((option) => { + return option.value.includes(search) + || option.label.replace(/<[^>]+>/g, '').includes(search); + }); + }, + }; + }); +}); diff --git a/resources/js/editor.js b/resources/js/editor.js new file mode 100644 index 000000000..d37782ee0 --- /dev/null +++ b/resources/js/editor.js @@ -0,0 +1,55 @@ +import { Editor } from '@tiptap/core'; +import Highlight from '@tiptap/extension-highlight'; +import Image from '@tiptap/extension-image'; +import Link from '@tiptap/extension-link'; +import StarterKit from '@tiptap/starter-kit'; +import TextAlign from '@tiptap/extension-text-align'; + +document.addEventListener('alpine:init', () => { + window.Alpine.data('editor', (config = {}) => { + let _editor; + + return { + updatedAt: Date.now(), + + init() { + const _this = this; + + _editor = new Editor({ + content: this.$refs.input.value, + element: this.$refs.editor, + extensions: [ + StarterKit, + Link.configure({ ...(config.link || {}) }), + Highlight.configure({ ...(config.highlight || {}) }), + Image.configure({ ...(config.image || {}) }), + TextAlign.configure({ ...(config.textAlign || {}) }), + ], + editorProps: { + attributes: { + class: 'focus:outline-none', + style: 'height: 100%; width: 100%; min-height: 100px;', + }, + }, + onCreate() { + _this.updatedAt = Date.now(); + }, + onUpdate({ editor }) { + _this.$refs.input.value = editor.isEmpty ? '' : editor.getHTML(); + + _this.updatedAt = Date.now(); + }, + onSelectionUpdate() { + _this.updatedAt = Date.now(); + }, + }); + }, + editor() { + return _editor; + }, + isActive(type, opts = {}, updatedAt) { + return _editor.isActive(type, opts); + }, + }; + }); +}); diff --git a/resources/js/Support/Helpers.js b/resources/js/helpers.js similarity index 100% rename from resources/js/Support/Helpers.js rename to resources/js/helpers.js diff --git a/resources/js/media-manager.js b/resources/js/media-manager.js new file mode 100644 index 000000000..911bc03f1 --- /dev/null +++ b/resources/js/media-manager.js @@ -0,0 +1,92 @@ +import Item from './Item'; +import { throttle } from './helpers'; + +document.addEventListener('alpine:init', () => { + window.Alpine.data('mediaManager', (url, config) => { + return { + dragging: false, + processing: false, + working: false, + queue: [], + items: [], + nextPageUrl: url, + init() { + this.$root.querySelector('.modal__body').addEventListener('scroll', throttle((event) => { + if (this.shouldPaginate(event)) { + this.fetch(); + } + })); + }, + fetch() { + this.processing = true; + + window.$http.get(this.nextPageUrl).then((response) => { + this.items.push(...response.data.data); + this.nextPageUrl = response.data.next_page_url; + }).catch((error) => { + // + }).finally(() => { + this.processing = false; + }); + }, + shouldPaginate(event) { + return ! this.processing + && this.nextPageUrl !== null + && this.items.length > 0 + && Math.abs(event.target.scrollHeight - event.target.scrollTop - event.target.clientHeight) < 75; + }, + queueFiles(files) { + for (let i = 0; i < files.length; i++) { + this.queue.unshift(new Item(files[i], { + url: url, + chunkSize: config.chunk_size, + })); + } + + if (! this.working) { + this.work(); + } + }, + work() { + const next = this.queue.findLast((item) => ! item.failed); + + if (next) { + this.working = true; + + next.handle(url).then((item) => { + this.queue.splice(this.queue.indexOf(next), 1); + this.items.unshift(item); + }).catch((error) => { + // + }).finally(() => { + this.working = false; + this.work(); + }); + } + }, + retry(item) { + item.retry(); + + if (! this.working) { + this.work(); + } + }, + select(item) { + config.multiple + ? this.selection.push(item) + : this.selection = [item]; + }, + deselect(item) { + this.selection.splice( + this.selection.findIndex((selected) => selected.value === item.value), 1 + ); + }, + toggle(item) { + this.selected(item) ? this.deselect(item) : this.select(item); + }, + selected(item) { + return this.selection.findIndex((selected) => selected.value === item.value) > -1; + }, + }; + }); +}); diff --git a/resources/js/notifications.js b/resources/js/notifications.js new file mode 100644 index 000000000..975174ba8 --- /dev/null +++ b/resources/js/notifications.js @@ -0,0 +1,43 @@ +document.addEventListener('alpine:init', () => { + window.Alpine.data('notifications', (url) => { + return { + open: false, + processing: false, + notifications: [], + nextPageUrl: url, + unread: 0, + init() { + this.fetch(); + }, + fetch() { + this.processing = true; + + window.$http.get(this.nextPageUrl).then((response) => { + this.unread = response.data.total_unread; + this.notifications.push(...response.data.data); + this.nextPageUrl = response.data.next_page_url; + }).catch((error) => { + // + }).finally(() => { + this.processing = false; + }); + }, + markAsRead(notification) { + if (notification.is_read) { + return; + } + + this.processing = true; + + window.$http.patch(notification.url).then((response) => { + this.unread--; + notification.is_read = true; + }).catch((error) => { + // + }).finally(() => { + this.processing = false; + }); + }, + }; + }); +}); diff --git a/resources/js/repeater.js b/resources/js/repeater.js new file mode 100644 index 000000000..357c87983 --- /dev/null +++ b/resources/js/repeater.js @@ -0,0 +1,29 @@ +document.addEventListener('alpine:init', () => { + window.Alpine.data('repeater', (url, options = []) => { + return { + processing: false, + options: options, + add() { + this.processing = true; + + window.$http.post(url).then((response) => { + this.options.push(response.data); + }).catch((error) => { + // + }).finally(() => { + this.processing = false; + }); + }, + remove(index) { + this.options.splice(index, 1); + }, + swap(from, to) { + const tmp = this.options[to]; + + this.options[to] = this.options[from]; + + this.options[from] = tmp; + }, + }; + }); +}); diff --git a/resources/js/theme.js b/resources/js/theme.js new file mode 100644 index 000000000..93422151a --- /dev/null +++ b/resources/js/theme.js @@ -0,0 +1,47 @@ +document.addEventListener('alpine:init', () => { + window.Alpine.data('theme', () => { + return { + systemMode: window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light', + theme: window.$cookie.get('__root_theme', 'system'), + init() { + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (event) => { + if (this.theme === 'system') { + document.documentElement.setAttribute('data-theme-mode', event.matches ? 'dark' : 'light'); + } + }); + + document.documentElement.setAttribute('data-theme-mode', this.theme === 'system' ? this.systemMode : this.theme); + + this.changeAssets(); + + const observer = new MutationObserver(() => { + this.changeAssets(); + }); + + observer.observe(document.documentElement, { attributes: true }); + }, + change(theme) { + document.documentElement.classList.add('no-transition'); + + window.$cookie.set('__root_theme', theme); + + this.theme = theme; + + document.documentElement.setAttribute('data-theme-mode', theme === 'system' ? this.systemMode : theme); + + this.$root.querySelector(`.theme-switcher__${theme}-mode`).focus(); + + document.documentElement.classList.remove('no-transition'); + }, + changeAssets() { + const theme = document.documentElement.getAttribute('data-theme-mode') === 'system' + ? this.systemMode + : document.documentElement.getAttribute('data-theme-mode'); + + document.querySelectorAll('img[data-theme-mode]').forEach((el) => { + el.src = el.getAttribute(`data-${theme}-asset`); + }); + }, + }; + }); +}); diff --git a/resources/sass/_auth.scss b/resources/sass/_auth.scss deleted file mode 100644 index 46b8cd1fb..000000000 --- a/resources/sass/_auth.scss +++ /dev/null @@ -1,34 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.site-auth { - align-items: center; - background: linear-gradient(180deg, hsl(217, 100%, 97%) 4%, #fff); - background-attachment: fixed; - display: flex; - flex-direction: column; - justify-content: center; - min-height: 100vh; - padding: spruce.spacer(s); - - &__inner { - max-width: 25rem; - width: 100%; - } - - &__logo { - margin-block-end: spruce.spacer(m); - margin-inline: auto; - width: 6rem; - } - - &__panel { - background-color: spruce.color(background); - border: 1px solid var(--spruce-sidebar-color-border); - border-radius: spruce.$border-radius-lg; - padding: clamp(2rem, 2vw + 1rem, 2.5rem); - } - - .alert { - margin-block-end: spruce.spacer(s); - } -} diff --git a/resources/sass/_layout.scss b/resources/sass/_layout.scss deleted file mode 100644 index 54897281f..000000000 --- a/resources/sass/_layout.scss +++ /dev/null @@ -1,43 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -$sidebar-width: 20rem; - -.app { - background: linear-gradient(180deg, hsl(217, 100%, 97%) 4%, #fff); - background-attachment: fixed; - display: flex; - flex-direction: column; - min-height: 100vh; - - @include spruce.breakpoint(md) { - &-sidebar { - width: $sidebar-width; - } - - &-body { - margin-inline-start: $sidebar-width; - } - } -} - -.app-widget { - margin-block-start: 1.5rem; -} - -.form-group--submit { - background-color: spruce.color(background); - box-shadow: 0 0.25rem 2rem 0 rgba(74, 104, 179, 0.15); - display: flex; - flex-wrap: wrap; - inset: auto 0 0 0; - gap: spruce.spacer(s); - padding-block: spruce.get-css-variable(--gutter-md); - padding-inline: spruce.get-css-variable(--gutter-lg); - position: fixed; - width: auto !important; - z-index: 115; - - @include spruce.breakpoint(md) { - inset: auto 0 0 calc(20rem); - } -} diff --git a/resources/sass/app.scss b/resources/sass/app.scss index 4333d258f..283884917 100644 --- a/resources/sass/app.scss +++ b/resources/sass/app.scss @@ -1,18 +1,20 @@ @forward 'config'; -@forward 'component'; @forward 'layout'; -@forward 'plugin'; -@forward 'auth'; -@forward 'sprucecss-expansion'; +@forward 'component'; +@forward 'section'; +@forward 'extend'; +@forward 'helper'; -@use '~sprucecss/scss/spruce'; +@use 'sprucecss/scss/spruce' as *; :root { - @include spruce.set-css-variable(( - --box-shadow: 0 0.25rem 2rem 0 hsl(223 42% 50% / 0.15), - --gutter-lg: spruce.spacer-clamp(m, l), - --gutter-md: spruce.spacer-clamp(s, 2.25rem), - --logo-height: 1.35rem, - --mobile-logo-height: 1.15rem + @include set-css-variable(( + --sidebar-inline-size: 20rem, + --header-block-size: 4.5rem, + --container-gap: spacer-clamp('m', 'l') )); } + +[x-cloak] { + visibility: hidden !important; +} diff --git a/resources/sass/component/_accordion.scss b/resources/sass/component/_accordion.scss deleted file mode 100644 index 43da71e1a..000000000 --- a/resources/sass/component/_accordion.scss +++ /dev/null @@ -1,68 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.accordion-wrapper { - > * + * { - border-block-start: 1px solid spruce.color(border); - } -} - -.accordion { - background-color: spruce.color(background, form); - border-radius: spruce.$border-radius-sm; - padding-block: 0.75rem; - - &--read { - opacity: 0.5; - } - - &__title { - color: spruce.color(label, form); - font-family: spruce.$font-family-base; - font-size: spruce.responsive-font-size(1rem); - margin: 0; - - button { - align-items: center; - background: none; - border: 0; - cursor: pointer; - display: flex; - font-weight: 600; - justify-content: space-between; - padding: 0; - text-align: left; - width: 100%; - - &[aria-expanded='true'] .vert { - display: none; - } - } - } - - &__caption { - color: spruce.color(text); - display: flex; - flex-direction: column; - gap: spruce.spacer(xxs); - width: calc(100% - (2rem + 0.5rem)); - } - - &__meta { - display: flex; - font-size: spruce.$font-size-sm; - font-weight: 400; - width: 100%; - } - - &__icon { - color: spruce.color(primary); - height: 1.5rem; - margin-inline-start: spruce.spacer(xs); - width: 1.5rem; - } - - &__content { - @include spruce.layout-stack(s); - margin-top: spruce.spacer(xs); - } -} diff --git a/resources/sass/component/_alert.scss b/resources/sass/component/_alert.scss index 52f6324b7..48830e661 100644 --- a/resources/sass/component/_alert.scss +++ b/resources/sass/component/_alert.scss @@ -1,56 +1,63 @@ @use 'sass:color'; @use 'sass:map'; -@use '~sprucecss/scss/spruce'; - -.app-alert { - @include spruce.layout-stack(spruce.spacer(s)); - margin-block-start: 1.5rem; -} +@use 'sprucecss/scss/spruce' as *; .alert { + align-items: center; + border: 1px solid; + border-left: 0.4rem solid; + border-radius: config('border-radius-sm', $display); + display: flex; + gap: spacer('m'); + justify-content: space-between; + line-height: config('line-height-md', $typography); + padding: 0.65em 1em; + + @each $name, $value in map.get($colors, 'alert') { + @at-root .alert--#{$name} { + background-color: color.scale($value, $lightness: 95%); + color: color.scale($value, $lightness: -30%); + } + + @at-root .alert--#{$name} .alert__close { + background-color: color.scale($value, $lightness: -30%); + color: color.scale($value, $lightness: 90%); + } + } + + @each $name, $value in map.get($colors, 'alert') { + @at-root [data-theme-mode='dark'] .alert--#{$name} { + background-color: transparent; + border-color: color.scale($value, $lightness: -30%); + color: color('text'); + } + } + + &__caption { + @include layout-stack('xxs'); + } + + &__close { + --dimension: 1.5rem; + @include clear-btn; + @include transition; align-items: center; - border: 1px solid; - border-left: 0.35rem solid; - border-radius: spruce.$border-radius-lg; + block-size: var(--dimension); + border-radius: config('border-radius-sm', $display); display: flex; - flex-wrap: wrap; - font-weight: 500; - gap: spruce.spacer(m); - justify-content: space-between; - padding: 0.65em 1em; - - @each $name, $value in map.get(spruce.$colors, alert) { - @at-root .alert--#{$name} { - background-color: color.scale($value, $lightness: 90%); - color: color.scale($value, $lightness: -30%); - } - - @at-root .alert--#{$name} .alert__close { - background-color: color.scale($value, $lightness: -30%); - color: color.scale($value, $lightness: 90%); - } + flex-shrink: 0; + inline-size: var(--dimension); + justify-content: center; + + &:hover, + &:focus { + opacity: 0.75; } - &__close { - @include spruce.clear-btn; - align-items: center; - border-radius: spruce.$border-radius-lg; - display: flex; - height: 1.5rem; - justify-content: center; - transition-duration: spruce.transition(duration); - transition-property: opacity; - transition-timing-function: spruce.transition(timing-function); - width: 1.5rem; - - &:hover, - &:focus { - opacity: 0.75; - } - - svg { - height: 0.5rem; - width: 0.5rem; - } + svg { + --dimension: 0.85rem; + block-size: var(--dimension); + inline-size: var(--dimension); } + } } diff --git a/resources/sass/component/_auth-form.scss b/resources/sass/component/_auth-form.scss new file mode 100644 index 000000000..0341ba290 --- /dev/null +++ b/resources/sass/component/_auth-form.scss @@ -0,0 +1,26 @@ +@use 'sprucecss/scss/spruce' as *; + +.auth-form { + @include layout-stack('s'); + margin-block: auto; + + &__title { + font-weight: 700; + } + + .or-separator { + margin-block-start: spacer('m'); + } +} + +.form-group-stacked, +.social-logins { + @include layout-stack('s'); +} + +.form-label { + &--space-between { + display: flex; + justify-content: space-between; + } +} diff --git a/resources/sass/component/_block-navigation.scss b/resources/sass/component/_block-navigation.scss new file mode 100644 index 000000000..dffe26ba0 --- /dev/null +++ b/resources/sass/component/_block-navigation.scss @@ -0,0 +1,102 @@ +@use 'sprucecss/scss/spruce' as *; + +.block-navigation { + @include a11y-card-link('.block-navigation__toggle', true); + display: flex; + flex-direction: column; + gap: spacer('s'); + position: relative; + z-index: 1; + + &__title { + align-items: center; + color: color('heading'); + display: flex; + font-size: config('font-size-base', $typography); + font-weight: 700; + justify-content: space-between; + margin-block: 0; + } + + &__toggle { + &[aria-expanded='true'] { + svg { + rotate: 180deg; + } + } + + svg { + pointer-events: none; + } + } + + &__menu { + &:not(.is-open) { + display: none; + } + + &.is-open { + display: block; + } + + ul { + @include clear-list; + } + + a { + align-items: center; + color: color('text'); + display: flex; + gap: 0.75em; + padding-block: 0.35em; + padding-inline: 0.75em; + position: relative; + text-decoration: none; + + &:hover:not([aria-current='page']) { + &::before { + background-color: color('primary-lightest'); + } + } + + &::before { + border-radius: config('border-radius-sm', $display); + content: ''; + inset-block: 0; + inset-inline: 0; + position: absolute; + z-index: -1; + } + + &[aria-current='page'] { + color: hsl(0deg 0% 100%); + + &::before { + background-color: color('primary'); + } + + svg { + color: hsl(0deg 0% 100%); + } + } + + svg { + --dimension: 1.15em; + block-size: var(--dimension); + color: color('primary'); + inline-size: var(--dimension); + } + } + + &--breakout { + a { + padding-block: 0.35em; + padding-inline: 0; + + &::before { + inset-inline: -0.75rem -0.35em; + } + } + } + } +} diff --git a/resources/sass/component/_body.scss b/resources/sass/component/_body.scss deleted file mode 100644 index bbc52ff2d..000000000 --- a/resources/sass/component/_body.scss +++ /dev/null @@ -1,14 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.app-body { - display: flex; - flex-direction: column; - flex-grow: 1; - - &__inner { - margin-inline: auto; - max-width: 100rem; - padding-inline: spruce.get-css-variable(--gutter-lg); - width: 100%; - } -} diff --git a/resources/sass/component/_breadcrumb-list.scss b/resources/sass/component/_breadcrumb-list.scss new file mode 100644 index 000000000..2ce99a0a7 --- /dev/null +++ b/resources/sass/component/_breadcrumb-list.scss @@ -0,0 +1,44 @@ +@use 'sprucecss/scss/spruce' as *; + +.breadcrumb-list { + @include clear-list; + align-items: center; + display: flex; + max-inline-size: 100%; + overflow-x: auto; + white-space: nowrap; + + > li { + align-items: center; + display: inline-flex; + margin-block: 0; + + + li::before { + block-size: 0.4em; + border-block-end: 2px solid color('separator', 'breadcrumb'); + border-inline-end: 2px solid color('separator', 'breadcrumb'); + content: ''; + display: inline-flex; + inline-size: 0.4em; + margin-inline: 0.75em; + transform: rotate(-45deg); + + @at-root { + [dir='rtl'] & { + transform: rotate(45deg); + } + } + } + } + + a { + text-decoration: none; + } + + [aria-current='page'] { + @include text-ellipsis(1); + display: inline-block; + max-inline-size: 20ch; + text-align: start; + } +} diff --git a/resources/sass/component/_card.scss b/resources/sass/component/_card.scss index 83c5fa5fb..42a3d6808 100644 --- a/resources/sass/component/_card.scss +++ b/resources/sass/component/_card.scss @@ -1,34 +1,100 @@ -@use '~sprucecss/scss/spruce'; +@use 'sprucecss/scss/spruce' as *; .app-card { - margin-block-start: 1.5rem; -} + $this: &; + background-color: color('background'); + border: 1px solid color('border'); + border-radius: config('border-radius-sm', $display); + box-shadow: 0 0 spacer('xxs') hsl(201.15deg 72.03% 32.71% / 5%); + + &:focus-within { + z-index: 5; + } + + &--edit { + #{$this}__header { + padding-inline: spacer('m'); + } + + #{$this}__body { + padding: spacer('m'); + } + } + + &--setting { + #{$this}__body { + @include layout-stack(0.75rem); + padding: spacer('m'); + } -.card { - background-color: spruce.color(background); - border-radius: spruce.$border-radius-lg; - box-shadow: spruce.get-css-variable(--box-shadow); - padding: spruce.get-css-variable(--gutter-md); + #{$this}__content { + @include layout-stack('xs'); + } + } + + &--sidebar { + display: grid; + gap: spacer-clamp('m', 'l'); + grid-template-columns: minmax(0, 1fr); + padding: spacer('m'); + + @include breakpoint('md') { + grid-template-columns: minmax(0, 13.5rem) minmax(0, 1fr); + } - &--edit { - max-width: 50rem; + > #{$this}__body { + @include layout-stack('m'); + padding: 0; } + } - &__header { - margin-block-end: spruce.spacer(s); + &--info { + box-shadow: none; + + #{$this}__header { + border-block-end: 0; + min-block-size: 0; + padding-block: spacer('m') 0; + padding-inline: spacer('m'); } - &__title { - color: spruce.color(secondary); - font-size: spruce.font-size(h3); - margin-block: 0 clamp(spruce.spacer(xs), 3vw, spruce.spacer(s)); + #{$this}__body { + padding: spacer('m'); } + } + + &__header { + align-items: center; + border-block-end: 1px solid color('border'); + display: flex; + flex-wrap: wrap; + gap: spacer('xs') spacer('m'); + justify-content: space-between; + min-block-size: 3.4rem; + padding: 0.75rem spacer('s'); + } + + &__actions { + display: flex; + flex-wrap: wrap; + gap: spacer('xs'); + margin-inline-start: auto; + } + + &__title { + font-size: font-size('h4'); + font-weight: 600; + margin-block: 0; + } - &__inner { - @include spruce.layout-stack(spruce.spacer(s)); + &__body { + padding: spacer('s'); - fieldset { - @include spruce.layout-stack(spruce.spacer(xs)); - } + &--plain { + align-items: center; + display: flex; + justify-content: space-between; + padding: 0; } + } } diff --git a/resources/sass/component/_context-menu.scss b/resources/sass/component/_context-menu.scss new file mode 100644 index 000000000..35d3ea038 --- /dev/null +++ b/resources/sass/component/_context-menu.scss @@ -0,0 +1,67 @@ +@use 'sprucecss/scss/spruce' as *; + +.context-menu { + --inset-block-start: calc(100% + 1rem); + --inline-size: 10rem; + + @include clear-list; + @include transition; + background-color: color('background'); + border: 1px solid color('border'); + border-radius: config('border-radius-sm', $display); + box-shadow: 0 0 spacer('xxs') hsl(201.15deg 72.03% 32.71% / 5%); + inline-size: var(--inline-size); + opacity: 0; + position: absolute; + scale: 0.85; + visibility: hidden; + z-index: 10; + + &--inline-start { + inset: var(--inset-block-start) auto auto 0; + } + + &--inline-end { + inset: var(--inset-block-start) 0 auto auto; + } + + &.is-open { + opacity: 1; + scale: 1; + visibility: visible; + } + + > li { + display: flex; + flex-direction: column; + } + + > li + li { + border-block-start: 1px solid color('border'); + margin-block-start: 0; + } + + &__item { + align-items: center; + background: none; + block-size: 2.25rem; + border: 0; + border-radius: config('border-radius-sm', $display); + color: color('text'); + display: flex; + justify-content: space-between; + line-height: config('line-height-md', $typography); + margin: 0.15em; + padding-block: 0.25em; + padding-inline: 0.6em; + text-decoration: none; + + &:hover:not([aria-current='page'], :has(.theme-switcher)) { + background-color: color('primary-lightest'); + } + + &[aria-current='page'] { + color: color('primary'); + } + } +} diff --git a/resources/sass/component/_data-group.scss b/resources/sass/component/_data-group.scss new file mode 100644 index 000000000..6801bc513 --- /dev/null +++ b/resources/sass/component/_data-group.scss @@ -0,0 +1,13 @@ +@use 'sprucecss/scss/spruce' as *; + +.data-group { + @include layout-stack('xxs'); + + &__content { + @include text-ellipsis(2); + color: color('heading'); + font-family: config('font-family-heading', $typography); + font-weight: 600; + line-height: config('line-height-heading', $typography); + } +} diff --git a/resources/sass/component/_data-table.scss b/resources/sass/component/_data-table.scss new file mode 100644 index 000000000..ef275fa0d --- /dev/null +++ b/resources/sass/component/_data-table.scss @@ -0,0 +1,104 @@ +@use 'sass:color'; +@use 'sprucecss/scss/spruce' as *; + +.data-table { + overflow: hidden; + position: relative; + + &__image { + --dimension: 2.25rem; + block-size: var(--dimension); + border-radius: 50%; + inline-size: var(--dimension); + } + + &__actions { + align-items: center; + display: flex; + gap: spacer('xs'); + justify-content: end; + } + + &__footer { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: spacer('s'); + justify-content: space-between; + margin-block: spacer('m') spacer('s'); + + &-column { + display: flex; + flex-wrap: wrap; + gap: spacer('s'); + + > * { + margin-block: 0; + } + } + } +} + +.data-table-alert { + border-width: 1px; + flex-wrap: wrap; + gap: spacer('xs') spacer('s'); + padding-inline-end: 0.65em; + + &__actions { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: spacer('xs') spacer('m'); + + .form-control { + inline-size: auto; + } + } + + &__column { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: spacer('xs'); + } +} + +.data-table-filter { + position: relative; + + &__actions { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: spacer('xs'); + } + + .context-menu { + --inline-size: 16rem; + padding: spacer('s'); + } +} + +.data-table-sort { + @include a11y-card-link('.data-table-sort__control', true); + align-items: center; + display: flex; + gap: spacer('xs'); + white-space: nowrap; + + &__control { + @include clear-btn; + } + + svg { + --dimension: 0.85em; + block-size: var(--dimension); + color: color('icon', 'data-table'); + inline-size: var(--dimension); + } +} + +.data-table-deleted { + color: color('danger', 'alert'); +} diff --git a/resources/sass/component/_dropdown.scss b/resources/sass/component/_dropdown.scss deleted file mode 100644 index d6d4edb83..000000000 --- a/resources/sass/component/_dropdown.scss +++ /dev/null @@ -1,73 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.dropdown { - $this: &; - - display: grid; - position: relative; - - &__btn { - @include spruce.clear-btn; - display: inline-flex; - height: 0.85rem; - opacity: 0.5; - transition-duration: spruce.transition(duration); - transition-property: opacity; - transition-timing-function: spruce.transition(timing-function); - width: 0.85rem; - - &[aria-expanded='true'] + #{$this}__menu { - display: flex; - flex-direction: column; - } - - &:hover { - opacity: 0.75; - } - - svg { - height: auto; - width: 100%; - } - } - - &__menu { - @include spruce.clear-list; - background-color: spruce.color(background); - border-radius: spruce.$border-radius-sm; - box-shadow: spruce.get-css-variable(--box-shadow); - display: none; - font-weight: 400; - left: 0; - min-width: 22ch; - padding-block: spruce.spacer(xs); - position: absolute; - top: calc(100% + 0.25rem); - - > li + li { - margin-block-start: 0; - } - - a { - &:hover, - &:focus { - color: spruce.color(primary); - } - - &[aria-current="page"] { - font-weight: 700; - } - } - } - - &__item { - color: spruce.color(text); - display: flex; - padding: spruce.spacer(xxs) spruce.spacer(s); - } - - &__divider { - border-top: 1px solid spruce.color(border); - height: 0; - } -} diff --git a/resources/sass/component/_form-layout.scss b/resources/sass/component/_form-layout.scss deleted file mode 100644 index a7b374825..000000000 --- a/resources/sass/component/_form-layout.scss +++ /dev/null @@ -1,8 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.form-layout { - align-items: start; - display: grid; - gap: spruce.spacer(s); - margin-block-end: calc(#{spruce.get-css-variable(--gutter-lg)} + #{spruce.get-css-variable(--gutter-md)} * 2 + 2 * 0.75em + #{spruce.$font-size-base}); -} diff --git a/resources/sass/component/_header.scss b/resources/sass/component/_header.scss deleted file mode 100644 index f505c8839..000000000 --- a/resources/sass/component/_header.scss +++ /dev/null @@ -1,73 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.app-header { - align-items: center; - display: flex; - flex-wrap: wrap; - column-gap: spruce.spacer(l); - justify-content: space-between; - padding-block-start: spruce.spacer(m); - row-gap: spruce.spacer(s); - - &__heading { - display: flex; - flex-direction: column; - gap: spruce.spacer(xxs); - } - - &__actions { - display: flex; - flex-wrap: wrap; - gap: spruce.spacer(s); - } - - &__title { - font-size: spruce.font-size(h2); - font-weight: 800; - margin: 0; - } -} - -.breadcrumbs { - display: flex; - list-style: none; - margin: 0; - padding: 0; - white-space: nowrap; - - li { - align-items: center; - display: inline-flex; - margin: 0; - } - - > li + li { - &::before { - border-bottom: 2px solid spruce.color(arrow, breadcrumb); - border-right: 2px solid spruce.color(arrow, breadcrumb); - content: ''; - display: inline-flex; - height: 0.4rem; - margin: 0 spruce.spacer(xs); - transform: rotate(-45deg); - width: 0.4rem; - } - } - - span { - align-items: center; - display: inline-flex; - } - - a { - text-decoration: none; - } - - [aria-current='page'] { - display: inline-block; - max-width: 30rem; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } -} diff --git a/resources/sass/component/_index.scss b/resources/sass/component/_index.scss index 1d16df6ea..46994a84a 100644 --- a/resources/sass/component/_index.scss +++ b/resources/sass/component/_index.scss @@ -1,18 +1,23 @@ @forward 'alert'; -@forward 'body'; -@forward 'header'; -@forward 'user-menu'; -@forward 'mobile-header'; -@forward 'sidebar'; +@forward 'auth-form'; +@forward 'badge'; +@forward 'block-navigation'; +@forward 'breadcrumb-list'; @forward 'card'; -@forward 'list'; -@forward 'status-label'; -@forward 'form-layout'; -@forward 'operation'; -@forward 'typography'; +@forward 'context-menu'; +@forward 'data-group'; +@forward 'data-table'; +@forward 'form'; +@forward 'open-search'; +@forward 'or-separator'; +@forward 'pagination'; +@forward 'preloader'; +@forward 'prism'; +@forward 'range-group'; +@forward 'skip-link'; +@forward 'theme-switcher'; +@forward 'user-menu'; @forward 'modal'; -@forward 'accordion'; -@forward 'media-uploader'; -@forward 'dropdown'; @forward 'notification'; +@forward 'media-uploader'; @forward 'widget'; diff --git a/resources/sass/component/_media-uploader.scss b/resources/sass/component/_media-uploader.scss index e3be955c7..30928d464 100644 --- a/resources/sass/component/_media-uploader.scss +++ b/resources/sass/component/_media-uploader.scss @@ -1,432 +1,102 @@ -@use 'sass:color'; -@use '~sprucecss/scss/spruce'; - -.media-item-list { - &__body { - --columns: 2; - - @include spruce.breakpoint(sm) { - --columns: 3; - } - - @include spruce.breakpoint(md) { - --columns: 4; - } - - @include spruce.breakpoint(lg) { - --columns: 6; - } - - @include spruce.breakpoint(xl) { - --columns: 7; - } - - align-items: flex-start; - display: grid; - flex: 1 1 calc(100% - 24rem); - grid-template-columns: repeat(var(--columns), minmax(0, 1fr)); - grid-auto-rows: max-content; - gap: 2rem; - } - - &-wrapper { - &.is-sidebar-open { - display: grid; - gap: 2rem; - grid-template-columns: minmax(0, 1fr); - - @include spruce.breakpoint(md) { - grid-template-columns: minmax(0, 1fr) 25rem; - } - } - } -} - -.uploader-item { - align-items: center; - border-radius: spruce.$border-radius-lg; - background-color: rgba(0, 0, 0, 0.05); - display: flex; - justify-self: center; - padding: 1.5rem; - width: 100%; - - &::after { - content: ''; - display: block; - padding-bottom: 100%; - } - - &__error { - align-items: center; - display: flex; - flex-direction: column; - gap: 0.5rem; - text-align: center; - width: 100%; - } +@use 'sprucecss/scss/spruce' as *; + +.media-list { + --column: 2; + @include clear-list; + display: grid; + gap: spacer('m'); + grid-template-columns: repeat(var(--column), minmax(0, 1fr)); + + @include breakpoint('xs') { + --column: 3; + } + + @include breakpoint('sm') { + --column: 4; + } + + @include breakpoint('md') { + --column: 6; + } + + @include breakpoint('lg') { + --column: 8; + } + + > * + * { + margin-block-start: 0; + } } .media-item { - $this: &; - + border-radius: config('border-radius-lg', $display); + line-height: config('line-height-md', $typography); + position: relative; + + &[aria-checked="true"], + &:focus-visible { + @include focus-ring( + $type: config('focus-ring-type', $btn, false), + $ring-color: color('primary-background', 'btn'), + $box-shadow-type: config('focus-ring-box-shadow-type', $btn, false), + $ring-size: 3px, + $ring-offset: 3px + ); + } + + &__background { + align-items: center; aspect-ratio: 1; - border-radius: spruce.$border-radius-lg; - position: relative; - overflow: hidden; - width: 100%; - - &:hover, - &:focus, - &:focus-within { - #{$this}__actions { - opacity: 1; - } - } - - &.is-document { - align-items: center; - background-color: rgba(0, 0, 0, 0.02); - display: flex; - justify-content: center; - justify-self: center; - } - - &.is-svg { - align-items: center; - background-color: rgba(0, 0, 0, 0.02); - display: flex; - justify-content: center; - justify-self: center; - - img { - height: auto; - width: 70%; - } - } - - &.is-selected { - &::before { - border-radius: spruce.$border-radius-lg; - bottom: 0; - box-shadow: 0 0 0 4px spruce.color(primary) inset; - content: ''; - left: 0; - position: absolute; - right: 0; - top: 0; - } - } - - &.is-loading { - background-image: url('/vendor/root/image-loading-placeholder.svg'); - background-position: center; - background-size: cover; - - img { - display: none !important; - } - } - - &.is-small { - #{$this}__actions { - inset: auto 0.55rem 0.55rem auto; - } - - .media-item__caption { - font-size: 0.7rem; - padding: 0.5rem; - - .icon { - height: 1.25rem; - width: 1.25rem; - } - } - } - - &__actions { - display: flex; - inset: 0.75rem 0.75rem auto auto; - gap: spruce.spacer(xs); - position: absolute; - opacity: 0; - transition-duration: spruce.transition(duration); - transition-property: all; - transition-timing-function: spruce.transition(timing-function); - - .btn--icon { - padding: spruce.spacer(xs); - } - } - - &__caption { - align-items: center; - cursor: default; - display: flex; - font-size: spruce.$font-size-sm; - flex-direction: column; - line-height: 1.25; - padding: 1rem; - text-align: center; - - span { - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - word-break: break-word; - - @supports (-webkit-line-clamp: 2) { - overflow: hidden; - text-overflow: ellipsis; - white-space: initial; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - } - } - - .icon { - color: rgba(0, 0, 0, 0.1); - height: 2rem; - margin-bottom: 0.5rem; - width: 2rem; - } - } - - img { - aspect-ratio: 1; - border-radius: spruce.$border-radius-lg; - display: block; - object-fit: cover; - user-select: none; - width: 100%; - } -} - -.media-sidebar { - border-radius: spruce.$border-radius-lg; - font-size: spruce.$font-size-sm; - height: 100%; - position: relative; - z-index: 1; - - > * + * { - border-top: 1px dashed rgba(0, 0, 0, 0.1); - margin-top: 2rem; - padding-top: 2rem; - } - - &__title { - font-size: 0.9rem; - margin: 0 0 1rem; - text-transform: uppercase; - } - - &__list { - list-style: none; - margin-block: spruce.spacer(s); - padding: 0; - - > li + li { - margin-top: 0.75rem; - } - - li { - line-height: 1.25; - } - } -} - -.selected-media-item-list { - --columns: 2; - - margin-block-start: spruce.spacer(s); - - @include spruce.breakpoint(sm) { - --columns: 3; - } - - @include spruce.breakpoint(md) { - --columns: 4; - } + background-color: color('background', 'media'); + border-radius: config('border-radius-lg', $display); + display: flex; + flex-direction: column; + gap: spacer('xxs'); + justify-content: center; + padding: spacer('s'); + } + + &__icon { + --size: 1.5rem; + block-size: var(--size); + color: color('icon', 'media'); + inline-size: var(--size); + } + + &__name { + @include text-ellipsis(2); + max-inline-size: 100%; + text-align: center; + } + + &__selected { + --size: 1.5rem; + align-items: center; + background-color: color('primary-background', 'btn'); + block-size: var(--size); + border-radius: config('border-radius-sm', $display); + color: color('primary-foreground', 'btn'); + display: flex; + inline-size: var(--size); + inset: spacer('xs') spacer('xs') auto auto; + justify-content: center; + position: absolute; - @include spruce.breakpoint(lg) { - --columns: 5; + svg { + --size: 1rem; + block-size: var(--size); + inline-size: var(--size); } + } - align-items: flex-start; - display: grid; - flex: 1 1 calc(100% - 24rem); - grid-template-columns: repeat(var(--columns), minmax(0, 1fr)); - grid-auto-rows: max-content; - gap: 1.5rem; -} + .progressbar { + margin-block-start: spacer('s'); + } -.selected-media-item { + img { aspect-ratio: 1; - border-radius: spruce.$border-radius-lg; - position: relative; - - &:hover { - .selected-media-item__remove { - opacity: 1; - } - } - - &__remove { - align-items: center; - background-color: rgba(spruce.color(danger, alert, $only-color: true), 0.8); - border: 0; - border-radius: spruce.$border-radius-sm; - display: flex; - height: 1.4rem; - justify-content: center; - opacity: 0; - padding: 0; - position: absolute; - right: 0.5rem; - top: 0.5rem; - transition-duration: spruce.transition(duration); - transition-property: all; - transition-timing-function: spruce.transition(timing-function); - width: 1.4rem; - - &:hover { - background-color: spruce.color(danger, alert); - } - - .icon { - color: #fff; - height: 0.75rem; - width: 0.75rem; - } - } - - &__document { - aspect-ratio: 1; - align-items: center; - background-color: rgba(0, 0, 0, 0.02); - border-radius: spruce.$border-radius-sm; - display: flex; - flex-direction: column; - justify-content: center; - justify-self: center; - - .icon { - color: rgba(0, 0, 0, 0.1); - height: 2rem; - margin-block-end: spruce.spacer(xs); - width: 2rem; - } - } - - img { - aspect-ratio: 1; - border-radius: spruce.$border-radius-lg; - object-fit: cover; - } -} - -.modal-body { - &.has-active-dropzone { - &::before { - background-color: color.adjust(spruce.color(primary, $only-color: true), $alpha: -0.4); - border: 5px dashed spruce.color(primary); - bottom: 0; - content: ''; - left: 0; - pointer-events: none; - position: absolute; - right: 0; - top: 0; - z-index: 5; - } - - &::after { - align-items: center; - bottom: 0; - color: #fff; - content: attr(data-dropzone-text); - display: flex; - font-size: 1.4rem; - font-weight: 700; - justify-content: center; - left: 0; - pointer-events: none; - position: absolute; - right: 0; - text-shadow: 0 0 5px rgba(0, 0, 0, 0.2); - top: 0; - z-index: 10; - } - } -} - -.media-accordions { - > * + * { - border-top: 1px dashed #efefef; - margin-top: 1rem; - padding-top: 1rem; - } -} - -.media-accordion { - &__heading { - align-items: center; - cursor: pointer; - display: flex; - justify-content: space-between; - } - - &__title { - align-items: center; - font-size: spruce.$font-size-sm; - font-weight: 400; - display: flex; - margin: 0; - } - - &__image-wrapper { - border-radius: spruce.$border-radius-sm; - height: 1.5rem; - margin-inline-end: spruce.spacer(xs); - width: 1.5rem; - - &.is-loading { - background-image: url('/vendor/root/image-loading-placeholder.svg'); - background-position: center; - background-size: cover; - - img { - display: none !important; - } - } - } - - &__image { - border-radius: spruce.$border-radius-sm; - height: 1.5rem; - width: 1.5rem; - } - - &__icon { - color: spruce.color(primary); - height: 1.5rem; - margin-inline-end: spruce.spacer(xs); - width: 1.5rem !important; - } - - &__caption { - @include spruce.text-ellipsis(1); - width: 10rem; - } - - &__content { - display: none; - margin-top: 1rem; - - &.is-open { - display: block; - } - } + border-radius: config('border-radius-lg', $display); + inline-size: 100%; + object-fit: cover; + } } diff --git a/resources/sass/component/_mobile-header.scss b/resources/sass/component/_mobile-header.scss deleted file mode 100644 index 0a52cec63..000000000 --- a/resources/sass/component/_mobile-header.scss +++ /dev/null @@ -1,47 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.app-topbar { - &__inner { - align-items: center; - border-block-end: 1px solid spruce.color(border, sidebar); - display: flex; - gap: spruce.spacer(m); - justify-content: space-between; - margin-inline: spruce.get-css-variable(--gutter-lg); - padding-block: spruce.spacer(s); - } - - &__logo { - height: spruce.get-css-variable(--mobile-logo-height); - width: auto; - - @include spruce.breakpoint(md) { - display: none; - } - } - - &__actions { - align-items: center; - display: flex; - gap: spruce.spacer(s); - - [data-action=open-navigation] { - @include spruce.breakpoint(md) { - display: none; - } - } - } - - .user-menu__caption { - display: none; - - @include spruce.breakpoint(xs) { - display: flex; - } - } - - .user-menu-navigation { - inset-inline-start: initial; - min-width: 12rem; - } -} diff --git a/resources/sass/component/_modal.scss b/resources/sass/component/_modal.scss index ab445bf8c..ce4e41751 100644 --- a/resources/sass/component/_modal.scss +++ b/resources/sass/component/_modal.scss @@ -1,108 +1,171 @@ -@use '~sprucecss/scss/spruce'; +@use 'sprucecss/scss/spruce' as *; .modal-backdrop { - align-items: start; - background-color: hsl(230deg 100% 9% / 40%); - display: none; + align-items: start; + background-color: color('background', 'modal'); + display: flex; + inset: 0; + justify-content: center; + overflow-y: auto; + position: fixed; + z-index: 25; +} + +.modal { + $this: &; + + @include set-css-variable(( + --inline-size: 34rem + )); + background-color: color('background'); + border: 1px solid color('border'); + border-radius: config('border-radius-sm', $display); + box-shadow: 0 0 spacer('xxs') hsl(201.15deg 72.03% 32.71% / 5%); + inline-size: get-css-variable(--inline-size); + margin: spacer('m'); + max-inline-size: 100%; + position: relative; + + &--media { + display: flex; + flex-direction: column; + inline-size: auto; inset: 0; - justify-content: center; - margin-block: 0; position: fixed; - overflow-y: auto; - z-index: 140; - &--visible { - display: flex; + #{$this}__body { + @include scrollbar; + flex-grow: 1; + overflow-y: auto; } -} -.modal { - background-color: spruce.color(background); - border-radius: spruce.$border-radius-lg; - box-shadow: 0 0.25rem 2rem 0 rgba(74, 104, 179, 0.15); - max-width: 40rem; - padding: spruce.spacer(m); - width: 30rem; - - &--media { - inset: spruce.spacer(s); - max-width: 100%; - position: fixed; - width: auto; + #{$this}__header-caption { + order: 1; } - &-inner { - display: flex; - flex-direction: column; - height: 100%; + #{$this}__close { + order: 2; + + @include breakpoint('md') { + order: 3; + } } - &-header { - border-bottom: 1px solid hsl(0 0% 0% / 0.05); - align-items: center; - display: flex; - justify-content: space-between; - padding-block-end: spruce.spacer(s); + #{$this}__filter { + inline-size: 100%; + order: 3; + + @include breakpoint('md') { + inline-size: auto; + margin-inline-start: auto; + order: 2; + } } + } - &-title { - color: spruce.color(secondary); - font-size: spruce.font-size(h4); - margin-block: 0; + &--dropzone { + &::before { + background-color: color('dropzone-background', 'media'); + border: 2px solid color('dropzone-border', 'media'); + border-radius: config('border-radius-sm', $display); + content: ''; + inset: 0; + pointer-events: none; + position: absolute; + z-index: 2; } - &-action { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: spruce.spacer(s); - margin-block-start: spruce.spacer(s); + &::after { + align-items: center; + color: hsl(0deg 0% 100%); + content: attr(data-dropzone); + display: flex; + font-size: font-size('h2'); + inset: 0; + justify-content: center; + line-height: config('line-height-md', $typography); + padding: spacer('m'); + position: absolute; + text-align: center; + z-index: 3; } + } + + &__header { + align-items: center; + border-block-end: 1px solid color('border'); + display: flex; + flex-wrap: wrap; + gap: spacer('s'); + justify-content: space-between; + padding: spacer('s') spacer-clamp('s', 'm'); - &-filter { - align-items: center; - border-bottom: 1px solid hsl(0 0% 0% / 0.05); - display: flex; - flex-wrap: wrap; - column-gap: spruce.spacer(m); - margin-block-end: spruce.spacer(s); - padding-block-end: spruce.spacer(s); - row-gap: spruce.spacer(s); + &-caption { + @include layout-stack(0); } + } - &-body { - @include spruce.scrollbar( - $border-radius: 3px - ); - flex: 1 1 auto; - overflow-x: visible; - overflow-y: auto; - margin-inline: calc(-1 * #{spruce.spacer(s)}); - padding-inline: spruce.spacer(s); - padding-block: spruce.spacer(s); - - &--media { - margin-inline-end: 0; - } + &__title { + font-size: font-size('h3'); + font-weight: 600; + margin-block: 0; + } + + &__body { + @include layout-stack('s'); + padding: spacer-clamp('s', 'm'); + } + + &__footer { + align-items: center; + border-block-start: 1px solid color('border'); + display: flex; + flex-wrap: wrap; + gap: spacer('s'); + justify-content: end; + padding: spacer('s') spacer-clamp('s', 'm'); + + &--space-between { + justify-content: space-between; + } + + input { + flex-grow: 1; + max-inline-size: 25rem; } + } + + &__filter { + align-items: center; + display: flex; + gap: spacer('s'); + margin-inline: calc(#{spacer('xs')} * -1); + -ms-overflow-style: none; + overflow-x: auto; + padding: spacer('xs'); + scrollbar-width: none; - &-footer { - align-items: center; - border-top: 1px solid hsl(0 0% 0% / 0.05); - display: flex; - flex-shrink: 0; - flex-wrap: wrap; - justify-content: space-between; - padding-block-start: spruce.spacer(s); - - &--column { - gap: spruce.spacer(s); - } + @include breakpoint('md') { + margin-inline: 0; + overflow: initial; + padding: 0; } - &-footer-actions { - display: flex; - flex-wrap: wrap; - gap: spruce.spacer(s); + &::-webkit-scrollbar { + display: none; } + + select, + input { + inline-size: auto; + min-inline-size: 10rem; + } + } + + &__column { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: spacer('s'); + } } diff --git a/resources/sass/component/_notification.scss b/resources/sass/component/_notification.scss index e69de29bb..899bcea1b 100644 --- a/resources/sass/component/_notification.scss +++ b/resources/sass/component/_notification.scss @@ -0,0 +1,118 @@ +@use 'sass:color'; +@use 'sass:map'; +@use 'sprucecss/scss/spruce' as *; + +.app-notification { + position: relative; + + &__header { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: spacer('xs'); + justify-content: space-between; + } + + &__title { + font-size: font-size('h4'); + font-weight: 600; + margin-block: 0; + } + + &__list { + @include scrollbar; + max-block-size: 25rem; + overflow-y: auto; + overscroll-behavior: contain; + + > * + * { + border-block-start: 1px solid color('border'); + margin-block-start: spacer('s'); + padding-block-start: spacer('s'); + } + } + + .context-menu { + --inline-size: 20rem; + display: flex; + flex-direction: column; + gap: spacer('s'); + inset: var(--inset-block-start) -4.75rem auto auto; + padding: spacer('s'); + + @include breakpoint('sm') { + inset: var(--inset-block-start) 0 auto auto; + } + + @include breakpoint('md') { + --inline-size: 26rem; + } + } +} + +.notification-card { + @include a11y-card-link('.notification-card__link', true); + display: flex; + gap: spacer('s'); + + &--read { + opacity: 0.5; + } + + &__icon { + --size: 2.5rem; + align-items: center; + block-size: var(--size); + border-radius: config('border-radius-sm', $display); + display: flex; + flex-shrink: 0; + inline-size: var(--size); + justify-content: center; + + &--info { + background-color: color.adjust(color('info', 'alert', $only-color: true), $lightness: 55%); + color: color('info', 'alert'); + } + + &--warning { + background-color: color.adjust(color('warning', 'alert', $only-color: true), $lightness: 41%); + color: color('warning', 'alert'); + } + + &--danger { + background-color: color.adjust(color('danger', 'alert', $only-color: true), $lightness: 46.5%); + color: color('danger', 'alert'); + } + + &--success { + background-color: color.adjust(color('success', 'alert', $only-color: true), $lightness: 63%); + color: color('success', 'alert'); + } + + svg { + --size: 1rem; + block-size: var(--size); + inline-size: var(--size); + } + } + + &__caption { + @include layout-stack('xxs'); + line-height: config('line-height-md', $typography); + padding-inline-end: spacer('s'); + } + + &__title { + font-size: config('font-size-base', $typography); + } + + &__link { + color: color('heading'); + text-decoration: none; + + &:hover, + &:focus { + color: color('link'); + } + } +} diff --git a/resources/sass/component/_open-search.scss b/resources/sass/component/_open-search.scss new file mode 100644 index 000000000..8264c5958 --- /dev/null +++ b/resources/sass/component/_open-search.scss @@ -0,0 +1,15 @@ +@use 'sprucecss/scss/spruce' as *; + +.open-search { + @include a11y-card-link('.open-search__btn', true); + align-items: center; + display: flex; + gap: spacer('xs'); + + &__icon { + --dimension: 1rem; + block-size: var(--dimension); + color: color('icon', 'search'); + inline-size: var(--dimension); + } +} diff --git a/resources/sass/component/_operation.scss b/resources/sass/component/_operation.scss deleted file mode 100644 index 3264ad3dd..000000000 --- a/resources/sass/component/_operation.scss +++ /dev/null @@ -1,25 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.app-operation { - align-items: center; - display: flex; - flex-wrap: wrap; - column-gap: spruce.spacer(m); - margin-block-start: 1.5rem; - row-gap: spruce.spacer(s); - - &__edit { - &:empty { - display: none; - } - - background-color: spruce.color(background); - border-radius: spruce.$btn-border-radius; - box-shadow: spruce.get-css-variable(--box-shadow); - display: flex; - flex-wrap: wrap; - gap: spruce.spacer(xs); - margin-inline-start: auto; - padding: spruce.spacer(xs); - } -} diff --git a/resources/sass/component/_or-separator.scss b/resources/sass/component/_or-separator.scss new file mode 100644 index 000000000..1aeab6612 --- /dev/null +++ b/resources/sass/component/_or-separator.scss @@ -0,0 +1,18 @@ +@use 'sprucecss/scss/spruce' as *; + +.or-separator { + align-items: center; + display: flex; + font-size: config('font-size-sm', $typography); + gap: spacer('s'); + text-transform: uppercase; + + &::before, + &::after { + background-color: color('border'); + block-size: 1px; + content: ''; + display: flex; + inline-size: 100%; + } +} diff --git a/resources/sass/component/_pagination.scss b/resources/sass/component/_pagination.scss new file mode 100644 index 000000000..6874d026b --- /dev/null +++ b/resources/sass/component/_pagination.scss @@ -0,0 +1,19 @@ +@use 'sprucecss/scss/spruce' as *; + +.pagination { + &__links { + @include clear-list; + display: flex; + flex-wrap: wrap; + gap: spacer('xs'); + + > * + * { + margin-block-start: 0; + } + } + + [aria-current="page"] { + background-color: color('primary-background', 'btn'); + color: color('primary-foreground', 'btn'); + } +} diff --git a/resources/sass/component/_preloader.scss b/resources/sass/component/_preloader.scss new file mode 100644 index 000000000..67f7de3c4 --- /dev/null +++ b/resources/sass/component/_preloader.scss @@ -0,0 +1,27 @@ +@use 'sprucecss/scss/spruce' as *; + +.preloader--circle { + --color: currentColor; + --border-width: 0.25em; + --size: 1.5rem; + --animation-duration: 1s; + + block-size: var(--size); + inline-size: var(--size); + + &::after { + animation: rotation var(--animation-duration) linear infinite; + block-size: var(--size); + border: var(--border-width) solid var(--color); + border-color: var(--color) transparent var(--color) transparent; + border-radius: 50%; + content: ''; + display: flex; + inline-size: var(--size); + } +} + +@keyframes rotation { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} diff --git a/resources/sass/component/_prism.scss b/resources/sass/component/_prism.scss new file mode 100644 index 000000000..204fe60ce --- /dev/null +++ b/resources/sass/component/_prism.scss @@ -0,0 +1,126 @@ +@use 'sprucecss/scss/spruce' as *; + +code[class*='language-'], +pre[class*='language-'] { + border-radius: config('border-radius-lg', $display); + color: color('color', 'prism'); + font-family: config('font-family-cursive', $typography); + font-size: config('font-size-base', $typography); + hyphens: none; + line-height: 1.5; + tab-size: 4; + text-align: left; + white-space: pre; + word-break: normal; + word-spacing: normal; + word-wrap: normal; +} + +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*='language-'] { + display: grid; + overflow: auto; + padding: spacer('m'); +} + +pre[class*='language-'] code { + background-color: transparent; + padding: 0; +} + +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + @include scrollbar; + background: color('background', 'prism'); + overflow-x: auto; +} + +.token.comment, +.token.prolog, +.token.cdata { + color: color('comment', 'prism'); + font-style: italic; +} + +.token.punctuation { + color: color('punctuation', 'prism'); +} + +.namespace { + color: color('namespace', 'prism'); +} + +.token.deleted { + color: color('deleted', 'prism'); + font-style: italic; +} + +.token.symbol, +.token.operator, +.token.keyword, +.token.property { + color: color('namespace', 'prism'); +} + +.token.tag { + color: color('punctuation', 'prism'); +} + +.token.boolean { + color: color('boolean', 'prism'); +} + +.token.number { + color: color('number', 'prism'); +} + +.token.constant, +.token.builtin, +.token.string, +.token.url, +.token.entity, +.language-css .token.string, +.style .token.string, +.token.char { + color: color('constant', 'prism'); +} + +.token.selector, +.token.function, +.token.doctype { + color: color('punctuation', 'prism'); + font-style: italic; +} + +.token.attr-name, +.token.inserted { + color: color('constant', 'prism'); + font-style: italic; +} + +.token.class-name, +.token.atrule { + color: color('class-name', 'prism'); +} + +.token.regex, +.token.important, +.token.variable { + color: color('regex', 'prism'); +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} diff --git a/resources/sass/component/_range-group.scss b/resources/sass/component/_range-group.scss new file mode 100644 index 000000000..8a65fec58 --- /dev/null +++ b/resources/sass/component/_range-group.scss @@ -0,0 +1,30 @@ +@use 'sprucecss/scss/spruce' as *; + +.range-group { + display: flex; + flex-direction: column; + gap: spacer('xxs'); + + .form-label { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: spacer('xs'); + justify-content: center; + } + + &__inner { + align-items: center; + display: flex; + gap: spacer('xs'); + + .form-range { + flex-grow: 1; + margin-block-start: 0; + } + + .form-range-control { + flex-shrink: 0; + } + } +} diff --git a/resources/sass/component/_sidebar.scss b/resources/sass/component/_sidebar.scss deleted file mode 100644 index 5e9b50ee4..000000000 --- a/resources/sass/component/_sidebar.scss +++ /dev/null @@ -1,170 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.app-sidebar { - background-color: spruce.color(background); - border-inline-end: 1px solid spruce.color(border, sidebar); - display: none; - inset-block: 0; - inset-inline-start: auto; - position: fixed; - z-index: 120; - - @include spruce.breakpoint(md) { - display: block !important; - } - - &--open { - display: block !important; - } - - &__header { - align-items: center; - display: flex; - height: 6rem; - margin-block-end: 1rem; - margin-inline: spruce.spacer(m); - } - - &__logo { - height: spruce.get-css-variable(--logo-height); - width: auto; - } - - &__navigation { - @include spruce.scrollbar( - $border-radius: 3px - ); - @include spruce.layout-stack; - height: calc(100vh - 6rem - 1rem); - margin-inline-end: spruce.spacer(s); - min-height: 10rem; - padding-inline-start: spruce.spacer(m); - padding-inline-end: spruce.spacer(s); - overflow-y: auto; - } - - &__title { - color: spruce.color(secondary); - font-size: spruce.$font-size-sm; - font-weight: 700; - letter-spacing: 0.2px; - margin-block-end: spruce.spacer(s); - text-transform: uppercase; - } -} - -.navigation { - font-family: var(--font-family-heading); - list-style: none; - - ul { - list-style: none; - margin: 0; - padding: 0; - - > li + li { - margin-block-start: spruce.spacer(s); - } - } -} - -.navigation-item { - $this: &; - - &.is-disabled { - opacity: 0.5; - pointer-events: none; - user-select: none; - } - - .navigation-submenu { - display: none; - } - - &.is-open { - position: relative; - - &::before { - background-color: darken(spruce.color(primary, $only-color: true), 20%); - border-start-end-radius: spruce.$border-radius-sm; - border-end-end-radius: spruce.$border-radius-sm; - content: ''; - inset-inline-start: calc(spruce.spacer(m) * -1); - position: absolute; - inset-block: 0.25rem 0; - width: 0.4rem; - } - - #{$this}__icon { - color: spruce.color(primary); - } - - .navigation-submenu { - display: block; - } - } - - &__link { - align-items: center; - color: spruce.color(heading); - display: flex; - font-weight: 500; - gap: spruce.spacer(xs); - text-decoration: none; - transition-duration: spruce.transition(duration); - transition-property: color; - transition-timing-function: spruce.transition(timing-function); - - &:hover, - &:focus, - &.is-active { - color: spruce.color(primary); - text-decoration: none; - - #{$this}__icon { - color: spruce.color(primary); - } - } - } - - &__icon { - color: spruce.color(icon, sidebar); - display: inline-flex; - height: 1.15rem; - margin-right: 0; - transition-duration: spruce.transition(duration); - transition-property: color; - transition-timing-function: spruce.transition(timing-function); - width: 1.15rem; - } -} - -.navigation-submenu { - list-style: none; - margin-block: 0.7rem 1rem !important; - padding: 0; - - > * + * { - margin-top: 0.2rem !important; - } - - a { - border-radius: spruce.$border-radius-lg; - color: spruce.color(heading); - display: block; - font-weight: 500; - padding-block: 0.2em; - padding-inline: calc(1.15rem + #{spruce.spacer(xs)}) 1rem; - text-decoration: none; - transition-duration: spruce.transition(duration); - transition-property: color; - transition-timing-function: spruce.transition(timing-function); - - &:hover, - &:focus, - &[aria-current='page'] { - background-color: spruce.color(active, sidebar); - color: spruce.color(primary); - } - } -} diff --git a/resources/sass/component/_skip-link.scss b/resources/sass/component/_skip-link.scss new file mode 100644 index 000000000..02466663f --- /dev/null +++ b/resources/sass/component/_skip-link.scss @@ -0,0 +1,10 @@ +@use 'sprucecss/scss/spruce' as *; + +.skip-link { + inset: -50vh auto auto spacer('m'); + position: fixed; + + &:focus { + inset-block-start: spacer('m'); + } +} diff --git a/resources/sass/component/_status-label.scss b/resources/sass/component/_status-label.scss deleted file mode 100644 index 800922000..000000000 --- a/resources/sass/component/_status-label.scss +++ /dev/null @@ -1,17 +0,0 @@ -@use 'sass:color'; -@use 'sass:map'; -@use '~sprucecss/scss/spruce'; - -.status-label { - border-radius: spruce.$border-radius-lg; - font-size: spruce.$font-size-sm; - font-weight: 600; - padding: 0.2em 0.5em; - - @each $name, $value in map.get(spruce.$colors, alert) { - @at-root .status-label--#{$name} { - background-color: color.scale($value, $lightness: 90%); - color: color.scale($value, $lightness: -30%); - } - } -} diff --git a/resources/sass/component/_theme-switcher.scss b/resources/sass/component/_theme-switcher.scss new file mode 100644 index 000000000..fe859e268 --- /dev/null +++ b/resources/sass/component/_theme-switcher.scss @@ -0,0 +1,25 @@ +@use 'sprucecss/scss/spruce' as *; + +.no-transition { + * { + transition: none !important; + } +} + +.theme-switcher { + color: color('text'); + display: inline-flex; + position: relative; + + &[data-theme-mode='system'] &__system-mode { display: flex; } + &[data-theme-mode='light'] &__light-mode { display: flex; } + &[data-theme-mode='dark'] &__dark-mode { display: flex; } + + button { + display: none; + + > * { + pointer-events: none; + } + } +} diff --git a/resources/sass/component/_typography.scss b/resources/sass/component/_typography.scss deleted file mode 100644 index fd2067d27..000000000 --- a/resources/sass/component/_typography.scss +++ /dev/null @@ -1,5 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.clear-list { - @include spruce.clear-list; -} diff --git a/resources/sass/component/_user-menu.scss b/resources/sass/component/_user-menu.scss index 4ed491517..697115535 100644 --- a/resources/sass/component/_user-menu.scss +++ b/resources/sass/component/_user-menu.scss @@ -1,118 +1,51 @@ -@use '~sprucecss/scss/spruce'; - -.user-menu-wrapper { - position: relative; - width: 100%; -} +@use 'sprucecss/scss/spruce' as *; .user-menu { - align-items: center; - background-color: transparent; - border: none; - cursor: pointer; - display: flex; - gap: spruce.spacer(s); - justify-content: space-between; - padding: 0; - position: relative; - width: 100%; - - &[aria-expanded='true'] + .user-menu-navigation { - display: block; - } - - &__toggle { - align-items: center; - border: none; - border-radius: spruce.$border-radius-lg; - display: flex; - gap: spruce.spacer(s); - height: 2.3rem; - justify-content: center; - padding: 0; - width: 1.15rem; - - .icon { - color: spruce.color(primary); - } - } - - &__avatar { - border-radius: spruce.$border-radius-lg; - height: 2.3rem; - width: 2.3rem; - } - - &__arrow { - color: spruce.color(primary); - height: 1rem; - width: 1rem; - } - - &__caption { - align-items: start; - display: flex; - flex-direction: column; - margin-inline-end: auto; - } - - &__name { - color: spruce.color(heading); - font-weight: 700; - } - - &__role { - font-size: spruce.$font-size-sm; - margin-top: 0.2rem; - } -} - -.user-menu-navigation { - @include spruce.layout-stack(0.85rem); - background-color: spruce.color(background); - border: 1px solid spruce.color(border, sidebar); - border-radius: spruce.$border-radius-lg; + @include a11y-card-link('.user-menu__toggle', true); + align-items: center; + display: flex; + gap: spacer-clamp('xs', 's', '1vw'); + position: relative; + + &__avatar { + --dimension: 2.1rem; + block-size: var(--dimension); + border-radius: 50%; + inline-size: var(--dimension); + } + + &__caption { display: none; - inset-inline: 0; - list-style: none; - margin: 0; - padding-block: spruce.spacer(s); - padding-inline: calc(#{spruce.spacer(s)} + 0.25rem); - position: absolute; + flex-direction: column; + font-size: config('font-size-base', $typography); + gap: spacer('xxs'); + line-height: 1; - &--top { - inset-block-end: calc(100% + #{spruce.spacer(s)}); + @include breakpoint('md') { + display: flex; } + } - &--bottom { - inset-block-start: calc(100% + #{spruce.spacer(s)}); - } + &__role { + font-size: config('font-size-sm', $typography); + } - &__item { - background: transparent; - border: 0; - color: spruce.color(heading); - cursor: pointer; - display: flex; - font-weight: 500; - line-height: spruce.$line-height-md; - padding: 0; - text-decoration: none; - transition-duration: spruce.transition(duration); - transition-property: color; - transition-timing-function: spruce.transition(timing-function); - width: 100%; + &__display-name { + color: color('heading'); + font-weight: 700; + } - &:hover, - &:focus, - &.is-active { - color: spruce.color(primary); - text-decoration: none; - } + &__toggle { + background: none; + border: 0; + cursor: pointer; + display: flex; + padding: 0; - &[aria-current='page'] { - color: var(--color-secondary); - font-weight: 700; - } + svg { + --dimension: 1em; + block-size: var(--dimension); + inline-size: var(--dimension); } + } } diff --git a/resources/sass/component/_widget.scss b/resources/sass/component/_widget.scss index 281c75c98..3f8de382e 100644 --- a/resources/sass/component/_widget.scss +++ b/resources/sass/component/_widget.scss @@ -1,17 +1,109 @@ -@use '~sprucecss/scss/spruce'; +@use 'sass:color'; +@use 'sprucecss/scss/spruce' as *; .app-widget { + $this: &; + align-items: center; + + background-color: color('background'); + border: 1px solid color('border'); + border-radius: config('border-radius-sm', $display); + box-shadow: 0 0 spacer('xxs') hsl(201.15deg 72.03% 32.71% / 5%); + display: flex; + justify-content: space-between; + + &--primary { + background-color: color('primary'); + border: 0; + + #{$this}__title, + #{$this}__data { + color: hsl(0deg 0% 100%); + } + } + + &--secondary { + background-color: color('primary'); + border: 0; + + #{$this}__title, + #{$this}__data { + color: hsl(0deg 0% 100%); + } + } + + &--summary { + gap: spacer('m'); + justify-content: start; + padding: spacer('m'); + + #{$this}__column { + padding: 0; + } + } + + &--small-data { + #{$this}__data { + font-size: font-size('h4'); + } + } + + &__icon { + --dimension: 4rem; + align-items: center; + background-color: color('icon-background', 'widget'); + block-size: var(--dimension); + border-radius: config('border-radius-lg', $display); + color: color('primary'); + display: flex; + flex-shrink: 0; + inline-size: var(--dimension); + justify-content: center; + + svg { + --dimension: 1.5rem; + block-size: var(--dimension); + inline-size: var(--dimension); + } + } + + &__title { + font-size: font-size('h5'); + font-weight: 600; + margin-block: 0; + } + + &__data-row { + align-items: center; + display: flex; + gap: spacer('s'); + } + + &__data { + line-height: config('line-height-heading', $typography); + margin-block: 0; + } + + &__column { + align-items: start; + color: color('heading'); display: flex; flex-direction: column; - gap: spruce.spacer(m); -} + font-size: font-size('h1'); + font-weight: 700; + line-height: config('line-height-heading', $typography); + padding: spacer('m'); -.app-widget-row { - &--two-column { - @include spruce.layout-grid(m, 20rem); + #{$this}__trending { + margin-block-start: spacer('xxs'); } + } + + &__chart { + max-inline-size: 65%; - &--three-column { - @include spruce.layout-grid(m, 12.5rem); + foreignObject { + padding-block: spacer('s'); } + } } diff --git a/resources/sass/component/badge/_index.scss b/resources/sass/component/badge/_index.scss new file mode 100644 index 000000000..a433a0827 --- /dev/null +++ b/resources/sass/component/badge/_index.scss @@ -0,0 +1,2 @@ +@forward 'trending'; +@forward 'status'; diff --git a/resources/sass/component/badge/_status.scss b/resources/sass/component/badge/_status.scss new file mode 100644 index 000000000..263e528a9 --- /dev/null +++ b/resources/sass/component/badge/_status.scss @@ -0,0 +1,27 @@ +@use 'sass:color'; +@use 'sass:map'; +@use 'sprucecss/scss/spruce' as *; + +.status { + align-items: center; + display: inline-flex; + gap: spacer('xs'); + line-height: 1; + position: relative; + white-space: nowrap; + + @each $name, $value in map.get($colors, 'alert') { + &--#{$name}::before { + background-color: color($name, 'alert'); + } + } + + &::before { + --dimension: 0.55em; + block-size: var(--dimension); + border-radius: 50%; + content: ''; + flex-shrink: 0; + inline-size: var(--dimension); + } +} diff --git a/resources/sass/component/badge/_trending.scss b/resources/sass/component/badge/_trending.scss new file mode 100644 index 000000000..a605ba16b --- /dev/null +++ b/resources/sass/component/badge/_trending.scss @@ -0,0 +1,30 @@ +@use 'sass:color'; +@use 'sprucecss/scss/spruce' as *; + +.trending { + align-items: center; + border-radius: 2rem; + display: inline-flex; + font-family: config('font-family-heading', $typography); + font-size: config('font-size-sm', $typography); + font-weight: 600; + gap: spacer('xxs'); + line-height: 1; + padding: 0.35em 0.55em; + + &--up { + background: color.adjust(color('success', 'alert', $only-color: true), $lightness: 60%); + color: color.adjust(color('success', 'alert', $only-color: true), $lightness: -7.5%); + } + + &--down { + background: color.adjust(color('danger', 'alert', $only-color: true), $lightness: 45%); + color: color.adjust(color('danger', 'alert', $only-color: true), $lightness: -5%); + } + + &__icon { + --dimension: 0.95em; + block-size: var(--dimension); + inline-size: var(--dimension); + } +} diff --git a/resources/sass/component/form/_btn-dropdown.scss b/resources/sass/component/form/_btn-dropdown.scss new file mode 100644 index 000000000..ecc575e61 --- /dev/null +++ b/resources/sass/component/form/_btn-dropdown.scss @@ -0,0 +1,7 @@ +@use 'sprucecss/scss/spruce' as *; + +.btn-dropdown { + display: inline-flex; + position: relative; + z-index: 10; +} diff --git a/resources/sass/component/form/_combobox.scss b/resources/sass/component/form/_combobox.scss new file mode 100644 index 000000000..1ead4f08f --- /dev/null +++ b/resources/sass/component/form/_combobox.scss @@ -0,0 +1,114 @@ +@use 'sprucecss/scss/spruce' as *; + +.combobox { + @include generate-variables($form-control, $include: ('border-width', 'border-radius')); + display: flex; + flex-direction: column; + gap: spacer('xs'); + + &__inner { + position: relative; + } + + &__selected-items { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: spacer('xs'); + } + + &__toggle { + inset: 0 0 0 auto; + pointer-events: none; + position: absolute; + } + + &__reset { + align-self: start; + } + + &__no-results { + padding-inline: spacer('xs'); + } + + &__control { + @include field-icon(config('select', $form-icon, false), color('select-foreground', 'form', true)); + background-position: center right config('icon-right-offset', $form-select, false); + background-repeat: no-repeat; + background-size: config('icon-inline-size', $form-select, false) auto; + padding-inline-end: config('padding-right', $form-select, false); + } + + &__dropdown { + background-color: color('background', 'form'); + border: config('border-width', $form-control) solid color('border', 'form'); + border-radius: config('border-radius', $form-control); + inset: calc(100% + #{spacer('xs')}) 0 auto 0; + padding: spacer('xs'); + position: absolute; + z-index: 5; + } + + [role="listbox"] { + @include clear-list; + @include scrollbar; + display: flex; + flex-direction: column; + gap: spacer('xs'); + max-block-size: 10rem; + overflow-y: auto; + padding-inline-end: spacer('xs'); + + > * { + margin-block-start: 0; + } + } + + [role="option"] { + align-items: center; + border-radius: config('border-radius', $form-control); + display: flex; + justify-content: space-between; + padding-block: spacer('xxs'); + padding-inline: spacer('xs'); + user-select: none; + + &[aria-selected="true"] { + background-color: color('light-background', 'btn'); + color: color('light-foreground', 'btn'); + } + + &:hover, + &:focus, + &.highlighted { + background-color: color('primary-background', 'btn'); + color: color('primary-foreground', 'btn'); + } + + svg { + --dimension: 0.85em; + block-size: var(--dimension); + inline-size: var(--dimension); + } + } +} + +.combobox-item { + align-items: center; + background-color: color('item-background', 'combobox'); + border-radius: 1em; + color: color('item-foreground', 'combobox'); + display: flex; + font-size: config('font-size-sm', $typography); + gap: spacer('xxs'); + line-height: 1; + padding-block: spacer('xxs'); + padding-inline: spacer('xs') spacer('xxs'); + + .btn--sm { + @include set-css-variable(( + --icon-padding: 0.25em, + --border-radius: 1em, + )); + } +} diff --git a/resources/sass/component/form/_editor.scss b/resources/sass/component/form/_editor.scss new file mode 100644 index 000000000..4d0f518cc --- /dev/null +++ b/resources/sass/component/form/_editor.scss @@ -0,0 +1,60 @@ +@use 'sprucecss/scss/spruce' as *; + +.editor { + @include set-css-variable(( + --block-size: 18rem + )); + @include transition; + block-size: get-css-variable(--block-size); + border: 1px solid color('border', 'form'); + border-radius: config('border-radius-sm', $display); + display: flex; + flex-direction: column; + grid-template-rows: auto 1fr; + overflow: hidden; + + &:focus-within { + @include focus-ring( + $type: config('focus-ring-type', $form-control, false), + $border-color: color('border-focus', 'form'), + $ring-color: color('ring-focus', 'form'), + $box-shadow-type: config('focus-ring-box-shadow-type', $form-control, false), + $ring-size: config('focus-ring-size', $form-control, false), + $ring-offset: config('focus-ring-offset', $form-control, false) + ); + } + + &__controls { + align-items: center; + border-block-end: 1px solid color('border'); + display: flex; + flex-wrap: wrap; + gap: spacer('xs') spacer('s'); + padding: spacer('xs'); + + .form-control { + inline-size: auto; + } + } + + &__group { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + gap: spacer('xs'); + } + + &__body { + @include scrollbar; + flex: 1 1 auto; + margin: spacer('xxs'); + overflow-x: hidden; + overflow-y: auto; + padding: spacer('s'); + + > [contenteditable='true'] { + @include layout-stack('xs'); + outline: 0; + } + } +} diff --git a/resources/sass/component/form/_file-group.scss b/resources/sass/component/form/_file-group.scss new file mode 100644 index 000000000..2990b6de6 --- /dev/null +++ b/resources/sass/component/form/_file-group.scss @@ -0,0 +1,98 @@ +@use 'sprucecss/scss/spruce' as *; + +.file-group-container { + container: file-group-container / inline-size; +} + +.file-group { + $this: &; + @include generate-variables($form-control, $include: ('border-width', 'border-radius')); + align-items: center; + border: config('border-width', $form-control) solid color('border', 'form'); + border-radius: config('border-radius', $form-control); + display: flex; + gap: spacer('m'); + overflow: hidden; + padding: spacer('s'); + + @container file-group-container (inline-size < 30rem) { + flex-direction: column; + } + + &:has([style*='background-image']) { + #{$this}__remove { + display: inline-flex; + } + } + + &__preview { + align-items: center; + aspect-ratio: 1; + background-color: color('primary-lightest'); + background-position: center; + background-size: cover; + border-radius: config('border-radius', $form-control); + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + inline-size: 9rem; + justify-content: center; + + @container file-group-container (inline-size < 30rem) { + aspect-ratio: 16 / 9; + inline-size: 100%; + } + + &[style*='background-image'] #{$this}__icon { + display: none; + } + } + + &__body { + display: flex; + flex-direction: column; + gap: spacer('xxs'); + inline-size: 100%; + + > * { + margin-block: 0; + } + } + + &__icon { + --dimension: 2rem; + block-size: var(--dimension); + color: color('primary'); + inline-size: var(--dimension); + } + + &__title { + color: color('heading'); + font-family: config('font-family-heading', $typography); + font-weight: 700; + } + + &__meta { + list-style: none; + padding-inline-start: 0; + + > * + * { + margin-block-start: 0; + } + } + + &__action { + display: flex; + flex-wrap: wrap; + gap: spacer('xs'); + margin-block-start: spacer('xs'); + } + + &__remove { + display: none; + } + + &__input { + flex: 1; + } +} diff --git a/resources/sass/component/form/_file-list.scss b/resources/sass/component/form/_file-list.scss new file mode 100644 index 000000000..e79dd3f1a --- /dev/null +++ b/resources/sass/component/form/_file-list.scss @@ -0,0 +1,68 @@ +@use 'sprucecss/scss/spruce' as *; + +.file-list { + @include generate-variables($form-control, $include: ('border-width', 'border-radius')); + display: flex; + flex-direction: column; + gap: spacer('s'); + + &__items { + @include clear-list; + border: config('border-width', $form-control) solid color('border', 'form'); + border-radius: config('border-radius', $form-control); + padding: spacer('xs'); + + > li + li { + border-block-start: config('border-width', $form-control) solid color('border'); + margin-block-start: spacer('xs'); + padding-block-start: spacer('xs'); + } + } +} + +.file-list-item { + align-items: center; + display: flex; + gap: spacer('s'); + justify-content: space-between; + + &__icon { + align-items: center; + aspect-ratio: 1; + background-color: color('background', 'media'); + border-radius: config('border-radius-sm', $display); + display: flex; + inline-size: 2.5rem; + justify-content: center; + + svg { + --size: 1rem; + block-size: var(--size); + color: color('icon', 'media'); + inline-size: var(--size); + } + } + + &__column { + align-items: center; + display: flex; + gap: spacer('s'); + } + + &__thumbnail { + aspect-ratio: 1; + border-radius: config('border-radius-sm', $display); + inline-size: 2.5rem; + } + + &__name { + @include text-ellipsis(1); + max-inline-size: 25ch; + } + + &__actions { + align-items: center; + display: flex; + gap: spacer('xxs'); + } +} diff --git a/resources/sass/component/form/_index.scss b/resources/sass/component/form/_index.scss new file mode 100644 index 000000000..7ba5f9441 --- /dev/null +++ b/resources/sass/component/form/_index.scss @@ -0,0 +1,7 @@ +@forward 'btn-dropdown'; +@forward 'combobox'; +@forward 'editor'; +@forward 'file-group'; +@forward 'file-list'; +@forward 'repeater'; +@forward 'search-form'; diff --git a/resources/sass/component/form/_repeater.scss b/resources/sass/component/form/_repeater.scss new file mode 100644 index 000000000..89baf01b5 --- /dev/null +++ b/resources/sass/component/form/_repeater.scss @@ -0,0 +1,53 @@ +@use 'sprucecss/scss/spruce' as *; + +.repeater-container { + @include layout-stack('s'); +} + +.repeater { + @include generate-variables($form-control, $include: ('border-width', 'border-radius')); + border: config('border-width', $form-control) solid color('border', 'form'); + border-radius: config('border-radius', $form-control); + padding: spacer('s'); + + &__heading { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: spacer('s'); + justify-content: space-between; + } + + &__body { + border-block-start: 1px solid color('border'); + margin-block-start: spacer('s'); + padding-block-start: spacer('s'); + } + + &__column { + align-items: center; + display: flex; + gap: spacer('s'); + } + + &__title { + @include text-ellipsis(1); + font-size: config('font-size-base', $typography); + margin-block: 0; + max-inline-size: 20ch; + } + + &__actions { + align-items: center; + display: flex; + gap: spacer('xxs'); + } + + &__toggle { + &[aria-expanded='true'] { + .vertical-line { + display: none; + } + } + } +} diff --git a/resources/sass/component/form/_search-form.scss b/resources/sass/component/form/_search-form.scss new file mode 100644 index 000000000..2ea17a40b --- /dev/null +++ b/resources/sass/component/form/_search-form.scss @@ -0,0 +1,43 @@ +@use 'sprucecss/scss/spruce' as *; + +.search-form { + $this: &; + position: relative; + + &--sm { + #{$this}__control { + padding-inline-start: 1.75em; + } + + #{$this}__submit { + padding-inline: 0.6em; + } + + #{$this}__icon { + --dimension: 0.75rem; + } + } + + &__control { + padding-inline-start: 2.15em; + } + + &__submit { + align-items: center; + background: none; + border: 0; + color: color('border', 'form'); + display: flex; + inset: 0 auto 0 0; + justify-content: center; + padding-block: 0; + padding-inline: 0.75em; + position: absolute; + } + + &__icon { + --dimension: 0.9rem; + block-size: var(--dimension); + inline-size: var(--dimension); + } +} diff --git a/resources/sass/component/list/_drawer.scss b/resources/sass/component/list/_drawer.scss deleted file mode 100644 index 7abe87fbf..000000000 --- a/resources/sass/component/list/_drawer.scss +++ /dev/null @@ -1,23 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.app-drawer { - background-color: spruce.color(background); - box-shadow: 0 0.25rem 2rem 0 rgba(74, 104, 179, 0.15); - inset: 0 auto 0 0; - padding: spruce.spacer(m); - position: fixed; - width: 20rem; - z-index: 130; - - &__title { - align-items: center; - display: flex; - font-size: spruce.font-size(h4); - gap: spruce.spacer(m); - justify-content: space-between; - } - - &__inner { - @include spruce.layout-stack(spruce.spacer(xs)); - } -} diff --git a/resources/sass/component/list/_footer.scss b/resources/sass/component/list/_footer.scss deleted file mode 100644 index b0c08573d..000000000 --- a/resources/sass/component/list/_footer.scss +++ /dev/null @@ -1,41 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.list-footer { - align-items: center; - display: flex; - flex-wrap: wrap; - column-gap: spruce.spacer(l); - justify-content: space-between; - margin-block: spruce.spacer(m) spruce.spacer(l); - row-gap: spruce.spacer(s); - - &__pager { - align-items: center; - display: flex; - gap: spruce.spacer(xs); - - label { - flex-shrink: 0; - } - } - - &__pagination { - align-items: center; - display: flex; - gap: spruce.spacer(xs); - list-style: none; - margin: 0; - padding: 0; - - li { - margin: 0; - } - } - - .btn { - &[aria-current='page'] { - background-color: spruce.color(secondary); - opacity: 1; - } - } -} diff --git a/resources/sass/component/list/_index.scss b/resources/sass/component/list/_index.scss deleted file mode 100644 index 731afb651..000000000 --- a/resources/sass/component/list/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -@forward 'drawer'; -@forward 'footer'; -@forward 'list'; diff --git a/resources/sass/component/list/_list.scss b/resources/sass/component/list/_list.scss deleted file mode 100644 index f8808d41e..000000000 --- a/resources/sass/component/list/_list.scss +++ /dev/null @@ -1,5 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.app-list { - margin-block-start: 1.5rem; -} diff --git a/resources/sass/config/_config.scss b/resources/sass/config/_config.scss index b66e64490..4a35289ee 100644 --- a/resources/sass/config/_config.scss +++ b/resources/sass/config/_config.scss @@ -1,77 +1,132 @@ -$color-primary-light: hsl(215 100% 96%); -$color-primary: hsl(214 98% 49%); -$color-delete: hsl(0 71% 51%); +@use 'sass:color'; +@use 'dark-colors' as dark; -@use '~sprucecss/scss/spruce' with ( - $settings: ( - prefix: root, - utilities: true +$color-primary: hsl(214deg 98% 49%); +$color-secondary: hsl(160 89% 46%); +$color-primary-lightest: hsl(210deg 60% 98%); +$color-danger: hsl(0deg 71% 51%); + +@use 'sprucecss/scss/spruce' with ( + $btn: ( + 'font-family': #{'Manrope', sans-serif}, + 'font-weight': 600, + ), + $btn-lg: ( + 'font-size': 1rem, + ), + $colors: ( + 'base': ( + 'border': hsl(215deg 100% 96%), + 'primary-lightest': $color-primary-lightest, + ), + 'btn': ( + 'dark-background': hsl(205deg 100% 2%), + 'dark-background-hover': hsl(205deg 100% 5%), + 'dark-foreground': hsl(0deg 0% 100%), + 'dark-outline-border': hsl(260deg 4% 70%), + 'dark-outline-foreground': hsl(205deg 100% 2%), + 'dark-outline-foreground-hover': hsl(0deg 0% 100%), + 'dark-outline-background-hover': hsl(205deg 100% 2%), + 'dark-outline-focus-ring': hsl(205deg 100% 2%), + 'light-background': $color-primary-lightest, + 'light-background-hover': $color-primary, + 'light-focus-ring': $color-primary, + 'light-foreground': $color-primary, + 'light-foreground-hover': hsl(0deg 0% 100%), + 'delete-background': color.adjust($color-danger, $lightness: 45%), + 'delete-background-hover': $color-danger, + 'delete-focus-ring': $color-danger, + 'delete-foreground': $color-danger, + 'delete-foreground-hover': hsl(0deg 0% 100%), + 'primary-outline-foreground': $color-primary, + ), + 'breadcrumb': ( + 'separator': hsl(0deg 0% 80%), + ), + 'combobox': ( + 'item-background': $color-primary-lightest, + 'item-foreground': $color-primary, + ), + 'data-table': ( + 'icon': hsl(0deg 0% 80%), + ), + 'form': ( + 'border': hsl(260deg 4% 75%), + ), + 'header': ( + 'background': hsl(0deg 0% 100% / 95%), + ), + 'navigation': ( + 'arrow': hsl(0deg 0% 0% / 15%), + ), + 'main': ( + 'background': $color-primary-lightest, + ), + 'media': ( + 'background': $color-primary-lightest, + 'dropzone-background': hsl(214deg 98% 49% / 75%), + 'dropzone-border': hsl(214deg 98% 40%), + 'icon': $color-primary, + ), + 'modal': ( + 'background': hsl(210deg 60% 98% / 90%), + ), + 'search': ( + 'icon': hsl(229deg 26% 48% / 25%), + ), + 'prism': ( + 'color': hsl(243deg 14% 29%), + 'background': hsl(0deg 0% 98%), + 'comment': hsl(225deg 14% 46%), + 'punctuation': hsl(279deg 50% 53%), + 'namespace': hsl(173deg 100% 24%), + 'deleted': hsl(1deg 83% 63% / 56%), + 'boolean': hsl(0deg 44% 53%), + 'number': hsl(315deg 90% 35%), + 'constant': hsl(221deg 57% 52%), + 'class-name': hsl(0deg 0% 7%), + 'regex': hsl(1deg 48% 59%), ), - $color-primary: $color-primary, - $color-secondary: hsl(214 98% 25%), - $colors: ( - base: ( - primary-light: $color-primary-light, - heading: hsl(238 69% 22%), - text: hsl(207 44% 20%) - ), - btn: ( - primary-foreground-opaque: hsl(0 0% 100% / 0.75), - secondary-foreground-opaque: hsl(0 0% 100% / 0.75), - tertiary-background: $color-primary-light, - tertiary-background-hover: $color-primary, - tertiary-foreground: $color-primary, - tertiary-foreground-hover: $color-primary-light, - tertiary-focus-ring: $color-primary, - delete-foreground: $color-delete, - delete-foreground-hover: hsl(0 0% 100%), - delete-background: hsl(0 71% 95%), - delete-background-hover: $color-delete, - delete-focus-ring: $color-delete, - yellow-foreground: hsl(0 0% 0%), - yellow-background: hsl(45 100% 49%), - yellow-background-hover: hsl(45 100% 56%) - ), - form: ( - border: hsl(223 16% 80%), - border-focus: $color-primary, - check-background: hsl(214 98% 25%), - fieldset-background: hsl(210 100% 99%), - select-foreground: hsl(214 98% 25%), - range-background: hsl(210 50% 98%), - range-border: hsl(213 20% 83%) - ), - table: ( - border: $color-primary-light, - hover: $color-primary-light, - stripe: hsl(216 100% 98%) - ), - breadcrumb: ( - arrow: hsl(0 0% 0% / 0.1) - ), - sidebar: ( - border: hsl(214 100% 92%), - icon: hsl(245 37% 83%), - active: $color-primary-light - ) + 'table': ( + 'hover': $color-primary-lightest, + 'stripe': $color-primary-lightest, ), - $spacers: ( - m: 2rem + 'widget': ( + 'icon-background': color.adjust($color-primary, $lightness: 49%), ), - $font-family-base: #{'Inter', sans-serif}, - $font-family-heading: #{'Poppins', sans-serif}, - $font-size-sm: 0.8375rem, - $font-size-base: 0.9375rem, - $border-radius-sm: 0.25rem, - $border-radius-lg: 0.5rem, - $btn-border-radius: 0.5rem, - $btn-font-size-sm: 0.8675rem, - $btn-font-weight: 600, - $btn-icon-size-sm: 0.7em, - $btn-padding-sm: 0.65em 0.95em, - $form-control-font-size-sm: 0.9375rem, - $form-label-font-weight: 600, - $table-padding-sm: 0.5rem, - $transition-duration: 0.1s, - $table-stripe: even + ), + $color-primary: $color-primary, + $color-secondary: $color-secondary, + $dark-colors: dark.$colors, + $display: ( + 'border-radius-sm': 0.45rem, + ), + $form-check: ( + 'font-weight': 400, + ), + $form-control-sm: ( + 'padding': 0.1em 0.45em, + ), + $form-fieldset: ( + 'gap': 0.5rem, + 'legend-font-size': 0.938rem, + 'legend-font-weight': 600, + ), + $form-group: ( + 'row-container-inline-size': 40rem, + ), + $form-label: ( + 'font-family': #{'Manrope', sans-serif}, + 'font-weight': 600, + ), + $typography: ( + 'font-family-base': #{'Open Sans', sans-serif}, + 'font-family-heading': #{'Manrope', sans-serif}, + 'font-size-base': 0.938rem, + 'font-weight-heading': 600, + ), + $settings: ( + 'css-custom-properties': true, + 'prefix': 'root', + ) ); diff --git a/resources/sass/config/_dark-colors.scss b/resources/sass/config/_dark-colors.scss new file mode 100644 index 000000000..29eea5aeb --- /dev/null +++ b/resources/sass/config/_dark-colors.scss @@ -0,0 +1,147 @@ +@use 'sass:color'; + +$dark-color-black: hsl(240deg 30% 14%); +$dark-color-danger: hsl(0deg 71% 51%); +$dark-color-gray-dark: hsl(0deg 0% 100% / 4%); +$dark-color-gray: hsl(0deg 0% 97%); +$dark-color-primary: hsl(211deg 99% 46%); +$dark-color-secondary: hsl(160 89% 46%); +$dark-color-success: hsl(150deg 100% 33%); +$dark-color-white: hsl(0deg 0% 95%); + +$colors: ( + 'base': ( + 'background': $dark-color-black, + 'blockquote-border': $dark-color-primary, + 'border': $dark-color-gray-dark, + 'card-border': hsl(207deg 90% 13%), + 'code-background': hsl(207deg 64% 21%), + 'code-foreground': $dark-color-white, + 'footer-background': hsl(0deg 0% 0% / 15%), + 'heading': $dark-color-white, + 'link-hover': hsl(205deg 100% 62%), + 'link': hsl(205deg 100% 56%), + 'mark-background': hsl(50deg 100% 80%), + 'mark-foreground': $dark-color-black, + 'marker': $dark-color-primary, + 'primary': $dark-color-primary, + 'primary-lightest': hsl(240deg 30% 16%), + 'secondary': $dark-color-secondary, + 'text': $dark-color-gray, + ), + 'breadcrumb': ( + 'arrow': hsl(0deg 0% 100% / 10%), + ), + 'btn': ( + 'dark-background': hsl(0deg 0% 100%), + 'dark-background-hover': hsl(0deg 0% 95%), + 'dark-foreground': hsl(205deg 100% 5%), + 'dark-outline-border': hsl(0 0% 100% / 15%), + 'dark-outline-foreground': hsl(0deg 0% 100%), + 'dark-outline-foreground-hover': hsl(205deg 100% 2%), + 'dark-outline-background-hover': hsl(0deg 0% 100%), + 'dark-outline-focus-ring': hsl(0deg 0% 100%), + 'light-background': hsl(240deg 30% 12%), + 'light-background-hover': $dark-color-primary, + 'light-focus-ring': $dark-color-primary, + 'light-foreground': $dark-color-primary, + 'light-foreground-hover': hsl(0deg 0% 100%), + 'primary-background': $dark-color-primary, + 'primary-background-hover': color.adjust($dark-color-primary, $lightness: 10%), + 'primary-foreground': hsl(0deg 0% 100%), + 'primary-shadow': color.adjust($dark-color-primary, $lightness: -25%), + 'primary-outline-foreground': hsl(211deg 99% 60%), + 'secondary-background': $dark-color-secondary, + 'secondary-background-hover': color.adjust($dark-color-secondary, $lightness: 5%), + 'secondary-foreground': $dark-color-white, + ), + 'card': ( + 'background': $dark-color-black, + ), + 'combobox': ( + 'item-background': hsl(240deg 30% 12%), + 'item-foreground': $dark-color-primary, + ), + 'data-table': ( + 'icon': hsl(0deg 0% 100% / 0.1), + ), + 'form': ( + 'background': color.scale($dark-color-black, $lightness: 5%), + 'background-disabled': $dark-color-black, + 'border-disabled': $dark-color-gray-dark, + 'border-focus': $dark-color-primary, + 'border': hsl(0deg 0% 100% / 12%), + 'check-background': $dark-color-primary, + 'check-foreground': $dark-color-black, + 'group-label-background': color.scale($dark-color-black, $lightness: 2.5%), + 'group-label-foreground': $dark-color-gray, + 'invalid': $dark-color-danger, + 'invalid-shadow': color.adjust($dark-color-danger, $alpha: -0.75), + 'label': $dark-color-white, + 'legend': $dark-color-white, + 'placeholder': hsl(0deg 0% 90%), + 'select-foreground': hsl(0deg 0% 100%), + 'shadow-focus': color.adjust($dark-color-primary, $alpha: -0.75), + 'text': $dark-color-gray, + 'valid': $dark-color-success, + 'valid-shadow': color.adjust($dark-color-success, $alpha: -0.75), + ), + 'header': ( + 'background': hsl(240deg 30% 12% / 95%), + ), + 'navigation': ( + 'arrow': hsl(0deg 0% 100% / 15%), + 'icon-background': hsl(245deg 38% 10%), + 'icon-background-hover': $dark-color-primary, + 'icon-foreground': $dark-color-primary, + 'icon-foreground-hover': hsl(186deg 100% 5%), + ), + 'main': ( + 'background': hsl(240deg 30% 13%), + ), + 'media': ( + 'background': hsl(240deg 30% 12%), + 'dropzone-background': hsl(214deg 98% 49% / 75%), + 'dropzone-border': hsl(214deg 98% 40%), + 'icon': $dark-color-primary, + ), + 'modal': ( + 'background': hsla(240, 3%, 7%, 0.9), + ), + 'prism': ( + 'color': hsl(217deg 34% 88%), + 'background': hsl(245deg 38% 7%), + 'comment': hsl(180deg 9% 55%), + 'punctuation': hsl(276deg 68% 75%), + 'namespace': hsl(197deg 31% 77%), + 'deleted': hsl(1deg 83% 63% / 56%), + 'boolean': hsl(350deg 100% 67%), + 'number': hsl(14deg 90% 70%), + 'constant': hsl(221deg 100% 75%), + 'class-name': hsl(33deg 100% 77%), + 'regex': hsl(217deg 34% 88%), + ), + 'table': ( + 'border': $dark-color-gray-dark, + 'caption': $dark-color-gray, + 'heading': $dark-color-white, + 'hover': hsl(0deg 0% 100% / 2%), + 'stripe': hsl(0deg 0% 100% / 2.5%), + 'text': $dark-color-gray, + ), + 'selection': ( + 'background': $dark-color-primary, + 'foreground': hsl(0deg 0% 100%), + ), + 'search': ( + 'icon': hsl(0deg 0% 100% / 25%), + ), + 'scrollbar': ( + 'thumb-background': hsl(0 0% 100% / 15%), + 'thumb-background-hover': hsl(0 0% 100% / 25%), + 'track-background': hsl(0 0% 100% / 5%), + ), + 'widget': ( + 'icon-background': color.adjust($dark-color-black, $lightness: 5%), + ), +); diff --git a/resources/sass/config/_dark-mode.scss b/resources/sass/config/_dark-mode.scss new file mode 100644 index 000000000..79bf74c2c --- /dev/null +++ b/resources/sass/config/_dark-mode.scss @@ -0,0 +1,20 @@ +@use 'sprucecss/scss/spruce' as *; + +@include generate-color-variables( + $dark-colors, + ':root[data-theme-mode="dark"]' +); + +[data-theme-mode='dark'] { + color-scheme: dark; + + /* stylelint-disable */ + select.form-control:not([multiple]):not([size]), + .combobox__control { + @include field-icon( + config('select', $form-icon, false), + color('select-foreground', 'form', true, $dark-colors) + ); + } + /* stylelint-enable */ +} diff --git a/resources/sass/config/_index.scss b/resources/sass/config/_index.scss index 4e8e36780..5a385ddd2 100644 --- a/resources/sass/config/_index.scss +++ b/resources/sass/config/_index.scss @@ -1,2 +1,3 @@ @forward 'config'; @forward 'styles'; +@forward 'dark-mode'; diff --git a/resources/sass/config/_styles.scss b/resources/sass/config/_styles.scss index dbe77bc61..489302c6d 100644 --- a/resources/sass/config/_styles.scss +++ b/resources/sass/config/_styles.scss @@ -1,4 +1,3 @@ -@use '~sprucecss/scss/spruce'; +@use 'sprucecss/scss/spruce' as *; -@include spruce.generate-content; -@include spruce.generate-form; +@include generate-styles; diff --git a/resources/sass/extend/_btn.scss b/resources/sass/extend/_btn.scss new file mode 100644 index 000000000..3e0796e62 --- /dev/null +++ b/resources/sass/extend/_btn.scss @@ -0,0 +1,46 @@ +@use 'sass:color'; +@use 'sprucecss/scss/spruce' as *; + +.btn--dark { + @include btn-variant('dark'); +} + +.btn--light { + @include btn-variant('light'); + + &.btn--active { + background-color: color('light-background-hover', 'btn'); + border-color: color('light-background-hover', 'btn'); + color: color('light-foreground-hover', 'btn'); + } +} + +.btn--delete { + @include btn-variant('delete'); +} + +.btn--dark { + @include btn-variant('dark'); +} + +.btn--outline-dark { + @include btn-variant-outline('dark'); +} + +.btn { + &--counter { + position: relative; + } + + &__counter { + background-color: color('danger', 'alert'); + border-radius: config('border-radius-sm', $display); + color: color('primary-foreground', 'btn'); + font-size: 0.6375rem; + inset: -0.5em -0.5em auto auto; + min-inline-size: 1.25rem; + padding: 0.45em; + position: absolute; + text-align: center; + } +} diff --git a/resources/sass/extend/_chart.scss b/resources/sass/extend/_chart.scss new file mode 100644 index 000000000..a2546de53 --- /dev/null +++ b/resources/sass/extend/_chart.scss @@ -0,0 +1,39 @@ +@use 'sprucecss/scss/spruce' as *; + +.apexcharts-legend-series { + align-items: center; + display: flex !important; + gap: spacer('xxs'); +} + +.apexcharts-legend { + display: flex; + gap: spacer('s'); + + > * { + margin: 0 !important; + } +} + +.apexcharts-text, +.apexcharts-legend-text { + color: color('text') !important; + fill: color('text'); +} + +.apexcharts-tooltip, +.apexcharts-tooltip-title { + background: color('background') !important; + border-color: color('border') !important; +} + +.apexcharts-tooltip-title { + line-height: 1; + padding-block: 0.75em !important; +} + +.apexcharts-xaxis-tick, +.apexcharts-gridline, +.apexcharts-grid-borders line:last-child { + stroke: color('border'); +} diff --git a/resources/sass/extend/_form.scss b/resources/sass/extend/_form.scss new file mode 100644 index 000000000..88cb13835 --- /dev/null +++ b/resources/sass/extend/_form.scss @@ -0,0 +1,26 @@ +@use 'sprucecss/scss/spruce' as *; + +.form-group-stack { + @include layout-stack('s'); + + &--bordered { + > * + * { + border-block-start: 1px solid color('border'); + padding-block-start: spacer('s'); + } + } +} + +legend { + font-family: config('font-family-heading', $typography); +} + +.form-control[type=color] { + @include set-css-variable(( + --border-radius: spacer-clamp('m', 'l') + )); +} + +.required-marker { + color: color('danger', 'alert'); +} diff --git a/resources/sass/extend/_index.scss b/resources/sass/extend/_index.scss new file mode 100644 index 000000000..29fdb8653 --- /dev/null +++ b/resources/sass/extend/_index.scss @@ -0,0 +1,4 @@ +@forward 'btn'; +@forward 'chart'; +@forward 'form'; +@forward 'progress'; diff --git a/resources/sass/extend/_progress.scss b/resources/sass/extend/_progress.scss new file mode 100644 index 000000000..c55e28429 --- /dev/null +++ b/resources/sass/extend/_progress.scss @@ -0,0 +1,43 @@ +@use 'sprucecss/scss/spruce' as *; + +.progressbar { + display: flex; + flex-direction: column; + gap: spacer('xs'); + inline-size: 100%; + + &__inner { + background-color: color('background', 'form'); + block-size: 0.5rem; + border-radius: config('border-radius-sm', $display); + box-shadow: inset 0 0 0 1px color('border', 'form'); + position: relative; + } + + &__indicator { + background-color: color('primary'); + block-size: 100%; + border-radius: config('border-radius-sm', $display); + inset: 0 auto 0 0; + position: absolute; + + &:not([style*="inline-size"]) { + animation: 1s progress infinite linear alternate; + inline-size: 20%; + } + } + + &__caption { + text-align: center; + } +} + +@keyframes progress { + 0% { + inset-inline-start: 0%; + } + + 100% { + inset-inline-start: 80%; + } +} diff --git a/resources/sass/helper/_display.scss b/resources/sass/helper/_display.scss new file mode 100644 index 000000000..ac449b9a3 --- /dev/null +++ b/resources/sass/helper/_display.scss @@ -0,0 +1,19 @@ +@use 'sprucecss/scss/spruce' as *; + +.display { + @each $name, $breakpoint in $breakpoints { + @include breakpoint($name) { + &--flex\:#{$name} { + display: flex !important; + } + } + } + + @each $name, $breakpoint in $breakpoints { + @include breakpoint($name) { + &--none\:#{$name} { + display: none !important; + } + } + } +} diff --git a/resources/sass/helper/_index.scss b/resources/sass/helper/_index.scss new file mode 100644 index 000000000..1fcc0033d --- /dev/null +++ b/resources/sass/helper/_index.scss @@ -0,0 +1,2 @@ +@forward 'display'; +@forward 'margin'; diff --git a/resources/sass/helper/_margin.scss b/resources/sass/helper/_margin.scss new file mode 100644 index 000000000..2ecdecfd7 --- /dev/null +++ b/resources/sass/helper/_margin.scss @@ -0,0 +1,5 @@ +@use 'sprucecss/scss/spruce' as *; + +.m-block\:0 { + margin-block: 0 !important; +} diff --git a/resources/sass/layout/_auth.scss b/resources/sass/layout/_auth.scss new file mode 100644 index 000000000..ea0286c25 --- /dev/null +++ b/resources/sass/layout/_auth.scss @@ -0,0 +1,85 @@ +@use 'sprucecss/scss/spruce' as *; + +.l-auth { + &__inner { + background-attachment: fixed; + display: flex; + flex-direction: column; + min-block-size: 100vh; + text-align: center; + + @include breakpoint('md') { + align-items: center; + flex-direction: row; + text-align: start; + } + } + + &__sidebar { + background-image: url('/vendor/root/img/auth-background.png'); + background-position: center; + background-size: cover; + border-radius: 2rem; + margin-block-end: spacer-clamp('m', 'l'); + margin-inline: spacer-clamp('m', 'l'); + min-block-size: 10rem; + + @include breakpoint('md') { + block-size: calc(100% - 2 * #{spacer('l')}); + inline-size: calc(50% - #{spacer('l')}); + inset-block: spacer('l'); + inset-inline: 50% spacer('l'); + margin: 0; + position: fixed; + } + } + + &__form { + align-items: center; + block-size: 100%; + display: flex; + flex-direction: column; + gap: spacer('l'); + justify-content: center; + padding-block: spacer('l'); + padding-inline: spacer-clamp('m', 'l'); + + @include breakpoint('md') { + inline-size: 50%; + margin-inline-start: 0; + min-block-size: 100vh; + } + } + + &__logo { + align-self: center; + block-size: 1.5rem; + display: inline-flex; + + @include breakpoint('md') { + align-self: flex-start; + } + + img { + block-size: 100%; + inline-size: auto; + } + } + + &__footer { + inline-size: 100%; + + p { + margin-block: 0; + } + } + + .auth-form { + inline-size: 100%; + max-inline-size: 25rem; + + @include breakpoint('md') { + padding-block-end: spacer('m'); + } + } +} diff --git a/resources/sass/layout/_container.scss b/resources/sass/layout/_container.scss new file mode 100644 index 000000000..adf7e8443 --- /dev/null +++ b/resources/sass/layout/_container.scss @@ -0,0 +1,19 @@ +@use 'sprucecss/scss/spruce' as *; + +.container { + --inline-size: #{config('container-inline-size', $layout)}; + --gap: #{get-css-variable(--container-gap)}; + + @include layout-center( + var(--gap), + var(--inline-size) + ); + + &--wide { + --inline-size: 100%; + } + + &--narrow { + --inline-size: 50rem; + } +} diff --git a/resources/sass/layout/_index.scss b/resources/sass/layout/_index.scss new file mode 100644 index 000000000..89113914f --- /dev/null +++ b/resources/sass/layout/_index.scss @@ -0,0 +1,4 @@ +@forward 'container'; +@forward 'row'; +@forward 'main'; +@forward 'auth'; diff --git a/resources/sass/layout/_main.scss b/resources/sass/layout/_main.scss new file mode 100644 index 000000000..30eb89841 --- /dev/null +++ b/resources/sass/layout/_main.scss @@ -0,0 +1,35 @@ +@use 'sprucecss/scss/spruce' as *; + +.l-main { + display: flex; + position: relative; + + &__sidebar { + background-color: color('background'); + display: none; + inline-size: get-css-variable(--sidebar-inline-size); + inset-block: 0; + inset-inline: 0 auto; + position: fixed; + z-index: 20; + + @include breakpoint('md') { + display: block; + } + + &--open { + display: block; + } + } + + &__body { + background-color: color('background', 'main'); + inline-size: 100%; + min-block-size: 100lvh; + + @include breakpoint('md') { + inline-size: calc(100% - #{get-css-variable(--sidebar-inline-size)}); + margin-inline-start: get-css-variable(--sidebar-inline-size); + } + } +} diff --git a/resources/sass/layout/_row.scss b/resources/sass/layout/_row.scss new file mode 100644 index 000000000..d21be5568 --- /dev/null +++ b/resources/sass/layout/_row.scss @@ -0,0 +1,30 @@ +@use 'sprucecss/scss/spruce' as *; + +.l-row { + align-items: start; + display: grid; + gap: spacer('m'); + grid-template-columns: minmax(0, 1fr); + + @each $name, $breakpoint in $breakpoints { + @for $i from 1 through 4 { + @include breakpoint($name) { + &--column\:#{$name}\:#{$i} { + grid-template-columns: repeat(#{$i}, minmax(0, 1fr)); + } + } + } + } + + &--sidebar { + @include breakpoint('lg') { + grid-template-columns: minmax(0, 1fr) minmax(0, 20rem); + } + } + + &__column { + display: grid; + gap: spacer('m'); + grid-template-columns: minmax(0, 1fr); + } +} diff --git a/resources/sass/plugin/_index.scss b/resources/sass/plugin/_index.scss deleted file mode 100644 index 7466a2ea3..000000000 --- a/resources/sass/plugin/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@forward 'tiptap'; diff --git a/resources/sass/plugin/_tiptap.scss b/resources/sass/plugin/_tiptap.scss deleted file mode 100644 index f67db2e5a..000000000 --- a/resources/sass/plugin/_tiptap.scss +++ /dev/null @@ -1,58 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -@include spruce.generate-form-control('.tiptap'); - -.tiptap { - display: grid; - grid-template-rows: auto 1fr; - height: calc(100% - 1.75em - 1px); - - &:focus-within { - @include spruce.focus-ring( - $type: spruce.$form-control-focus-ring-type, - $border-color: spruce.color(border-focus, form), - $ring-color: spruce.color(ring-focus, form), - $box-shadow-type: spruce.$form-control-focus-ring-box-shadow-type, - $ring-width: spruce.$form-control-focus-ring-width, - $ring-offset: spruce.$form-control-focus-ring-offset - ); - } - - &__controls { - align-items: center; - border-block-end: 1px solid spruce.color(border, form); - display: flex; - flex-wrap: wrap; - gap: spruce.spacer(xs) spruce.spacer(s); - padding-block-end: 0.5em; - - .btn--control { - border-radius: spruce.$border-radius-sm; - height: 2rem; - padding: 0; - width: 2rem; - } - - .form-control { - width: auto; - } - } - - &__group { - align-items: flex-start; - display: flex; - flex-wrap: wrap; - gap: spruce.spacer(xs); - } - - &__editor { - @include spruce.scrollbar; - margin-block-start: 0.5em; - overflow-y: auto; - - > [contenteditable="true"] { - @include spruce.layout-stack(xs); - outline: 0; - } - } -} diff --git a/resources/sass/section/_actions.scss b/resources/sass/section/_actions.scss new file mode 100644 index 000000000..848b5e94d --- /dev/null +++ b/resources/sass/section/_actions.scss @@ -0,0 +1,18 @@ +@use 'sprucecss/scss/spruce' as *; + +.app-actions { + justify-content: space-between; + + &--sidebar { + @include breakpoint('lg') { + margin-inline-end: calc(20rem + #{spacer('m')}); + } + } + + &, + &__column { + display: flex; + flex-wrap: wrap; + gap: spacer('m'); + } +} diff --git a/resources/sass/section/_body.scss b/resources/sass/section/_body.scss new file mode 100644 index 000000000..17f324c04 --- /dev/null +++ b/resources/sass/section/_body.scss @@ -0,0 +1,7 @@ +@use 'sprucecss/scss/spruce' as *; + +.app-body { + display: flex; + flex-direction: column; + gap: spacer('m'); +} diff --git a/resources/sass/section/_footer.scss b/resources/sass/section/_footer.scss new file mode 100644 index 000000000..7324a2013 --- /dev/null +++ b/resources/sass/section/_footer.scss @@ -0,0 +1,10 @@ +@use 'sprucecss/scss/spruce' as *; + +.app-footer { + padding-block: spacer-clamp('m', 'l'); + text-align: center; + + &__created-with { + margin-block: 0; + } +} diff --git a/resources/sass/section/_header.scss b/resources/sass/section/_header.scss new file mode 100644 index 000000000..42740b236 --- /dev/null +++ b/resources/sass/section/_header.scss @@ -0,0 +1,56 @@ +@use 'sprucecss/scss/spruce' as *; + +.app-header { + backdrop-filter: saturate(180%) blur(.25rem); + background-color: color('background', 'header'); + border-block-end: 1px solid color('border'); + inset-block-start: 0; + inset-block-start: 0; + position: sticky; + position: sticky; + z-index: 15; + + &__inner { + align-items: center; + block-size: get-css-variable(--header-block-size); + display: flex; + flex-wrap: wrap; + gap: spacer-clamp('s', 'l'); + justify-content: space-between; + margin-inline: get-css-variable(--container-gap); + } + + &__column { + align-items: center; + display: flex; + flex-grow: 1; + gap: spacer-clamp('s', 'm'); + } + + &__actions { + align-items: center; + display: flex; + gap: spacer-clamp('s', 'm'); + + &--secondary { + gap: spacer('s'); + } + } + + &__logo { + block-size: 1.25rem; + display: inline-flex; + + @include breakpoint('md') { + display: none; + } + } + + &__breadcrumb { + display: none; + + @include breakpoint('md') { + display: flex; + } + } +} diff --git a/resources/sass/section/_heading.scss b/resources/sass/section/_heading.scss new file mode 100644 index 000000000..eeee75b53 --- /dev/null +++ b/resources/sass/section/_heading.scss @@ -0,0 +1,41 @@ +@use 'sprucecss/scss/spruce' as *; + +.app-heading { + padding-block: spacer-clamp('m', 'l'); + + &__inner { + display: flex; + flex-wrap: wrap; + gap: spacer('s') spacer('m'); + justify-content: space-between; + + &--column { + flex-direction: column; + } + } + + &__caption { + @include layout-stack('xs'); + } + + &__title { + font-weight: 700; + } + + &__description { + @include layout-stack('xxs'); + align-items: center; + display: flex; + flex-wrap: wrap; + font-size: 1rem; + gap: spacer('xs') spacer('m'); + } + + &__actions { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: spacer('xs')spacer('s'); + justify-content: end; + } +} diff --git a/resources/sass/section/_index.scss b/resources/sass/section/_index.scss new file mode 100644 index 000000000..60cda4cc2 --- /dev/null +++ b/resources/sass/section/_index.scss @@ -0,0 +1,6 @@ +@forward 'sidebar'; +@forward 'header'; +@forward 'heading'; +@forward 'body'; +@forward 'actions'; +@forward 'footer'; diff --git a/resources/sass/section/_sidebar.scss b/resources/sass/section/_sidebar.scss new file mode 100644 index 000000000..a8f7ed33c --- /dev/null +++ b/resources/sass/section/_sidebar.scss @@ -0,0 +1,49 @@ +@use 'sprucecss/scss/spruce' as *; + +.app-sidebar { + block-size: 100%; + border-inline-end: 1px solid color('border'); + display: flex; + flex-direction: column; + gap: spacer('m'); + padding-block: 0 spacer('m'); + + &__logo { + block-size: 1.25rem; + display: inline-flex; + } + + &__search { + display: none; + + @include breakpoint('md') { + display: flex; + } + } + + &__header { + align-items: center; + block-size: get-css-variable(--header-block-size); + border-block-end: 1px solid color('border'); + display: flex; + flex-shrink: 0; + justify-content: space-between; + margin-inline: spacer('m'); + } + + &__body { + @include scrollbar( + $border-radius: 0.15em + ); + flex-grow: 1; + margin-inline: calc(#{spacer('m')} / 2); + overflow-y: auto; + padding-inline: calc(#{spacer('m')} / 2); + + > * + * { + border-block-start: 1px solid color('border'); + margin-block-start: spacer('s'); + padding-block-start: spacer('s'); + } + } +} diff --git a/resources/sass/sprucecss-expansion/_btn.scss b/resources/sass/sprucecss-expansion/_btn.scss deleted file mode 100644 index 0fdcad14a..000000000 --- a/resources/sass/sprucecss-expansion/_btn.scss +++ /dev/null @@ -1,38 +0,0 @@ -@use '~sprucecss/scss/spruce'; - -.btn { - &--has-counter { - position: relative; - } - - &__keybind { - color: spruce.color(primary-foreground-opaque, btn); - font-weight: 400; - } - - &__counter { - align-items: center; - background-color: spruce.color(danger, alert); - border-radius: spruce.$border-radius-lg; - color: #fff; - display: flex; - font-size: 0.7rem; - height: 1.2rem; - inset: -0.6em -0.65em auto auto; - justify-content: center; - line-height: 1; - min-width: 1.2rem; - position: absolute; - } - - &__icon { - &--md { - height: 0.85em; - width: 0.85em; - } - } -} - -.btn--tertiary { @include spruce.btn-variant(tertiary); } -.btn--delete { @include spruce.btn-variant(delete); } -.btn--warning { @include spruce.btn-variant(yellow); } diff --git a/resources/sass/sprucecss-expansion/_form.scss b/resources/sass/sprucecss-expansion/_form.scss deleted file mode 100644 index 9e6ac2dc7..000000000 --- a/resources/sass/sprucecss-expansion/_form.scss +++ /dev/null @@ -1,264 +0,0 @@ -@use 'sass:color'; -@use '~sprucecss/scss/spruce'; - -.form-group-stack { - @include spruce.layout-stack(spruce.spacer(s)); - - fieldset.is-json:not(.form-group-stack) { - background-color: spruce.color(fieldset-background, form); - border: 1px solid spruce.color(border, sidebar); - border-radius: spruce.$border-radius-lg; - padding: spruce.spacer-clamp(s, m); - - legend { - display: flex; - float: left; - width: 100%; - } - } - - fieldset.is-json.form-group-stack { - > legend { - display: none; - } - } -} - -.form { - &--inline { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: spruce.spacer(s); - } -} - -.form-group { - &--inline { - align-items: center; - display: flex; - flex-direction: row; - gap: spruce.spacer(s); - - > * + * { - margin-block-start: 0; - } - } - - &--reset { - display: flex; - justify-content: end; - margin-block-start: spruce.spacer(s); - } - - &--autocomplete { - position: relative; - } -} - -.form-row { - &--accordion { - .accordion-wrapper { - margin-block-start: spruce.spacer(s); - } - } -} - -.form-control { - &[type='date'], - &[type='time'] { - padding-block: 0.43em; - } -} - -.form-file { - display: block; -} - -.form-group-inner { - &--stack { - align-items: center; - display: flex; - flex-direction: column; - - > *:first-child:not(:last-child) { - border-end-end-radius: 0; - border-end-start-radius: 0; - } - - > * + * { - border-start-start-radius: 0; - border-start-end-radius: 0; - margin-block-start: -1px; - } - - @include spruce.breakpoint(xs) { - flex-direction: row; - - > * { - border-radius: spruce.$form-control-border-radius; - } - - > *:first-child:not(:last-child) { - border-end-end-radius: 0; - border-end-start-radius: spruce.$border-radius-sm !important; - border-start-end-radius: 0; - } - - > * + * { - border-end-start-radius: 0; - border-start-start-radius: 0; - margin-block-start: 0; - margin-inline-start: -1px; - } - } - } -} - -select { - option[disabled]:first-child { - color: spruce.color(secondary); - cursor: not-allowed; - font-size: spruce.$font-size-sm; - font-weight: 700; - text-transform: uppercase; - } -} - -.form-range { - width: 100%; -} - -.form-range-display { - align-items: center; - display: flex; - justify-content: space-between; - margin-block-start: spruce.spacer(xs); - position: relative; - - &::before { - border-bottom: 1px dashed spruce.color(border, form); - content: ''; - inset: 50% 0 auto 0; - height: 0; - position: absolute; - z-index: 1; - } - - &__item { - color: spruce.color(text); - position: relative; - z-index: 10; - - &.is-min, - &.is-max { - background-color: spruce.color(background); - } - - &.is-min { - padding-right: spruce.spacer(xs); - } - - &.is-max { - padding-left: spruce.spacer(xs); - } - - &.is-current { - background-color: spruce.color(range-background, form); - border: 1px solid spruce.color(range-border, form); - border-radius: spruce.$border-radius-sm; - font-size: spruce.$font-size-base; - font-weight: 700; - padding: spruce.spacer(xxs) spruce.spacer(xs); - } - } -} - -.form-label { - &__required-marker { - color: spruce.color(danger, alert); - } -} - -.tag-control { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: spruce.spacer(xs); - padding: 0.5em; - - input { - border: none; - border-radius: 0; - box-shadow: none; - flex-grow: 1; - height: 1.5rem; - } -} - -.tag { - align-items: stretch; - background-color: spruce.color(primary); - border-radius: spruce.$form-control-border-radius; - display: inline-flex; - font-size: spruce.$font-size-sm; - - &__label { - color: #fff; - display: inline-block; - font-weight: 500; - margin: 0; - padding: 0.15em 0.45em; - } - - &__remove { - align-items: center; - background-color: color.adjust(spruce.color(primary, $only-color: true), $lightness: -10%); - border: 0; - border-radius: 0 spruce.$form-control-border-radius spruce.$form-control-border-radius 0; - color: hsl(0 0% 100%); - cursor: pointer; - display: flex; - padding: 0 0.5em; - transition-duration: spruce.transition(duration); - transition-property: background-color; - transition-timing-function: spruce.transition(timing-function); - - &:hover { - background-color: color.adjust(spruce.color(primary, $only-color: true), $lightness: -15%); - } - - svg { - height: 0.75em; - width: 0.75em; - } - } -} - -[role='listbox'] { - background-color: spruce.color(background, form); - border: 1px solid spruce.color(border, form); - border-end-start-radius: spruce.$form-control-border-radius; - border-end-end-radius: spruce.$form-control-border-radius; - inset: calc(100% - 1px) spruce.spacer(xs) auto spruce.spacer(xs); - list-style: none; - margin-block: 0; - padding: spruce.spacer(xs); - position: absolute; - - li { - border-radius: spruce.$border-radius-sm; - padding-inline: spruce.spacer(xs); - - &.is-selected { - background-color: color.adjust(spruce.color(primary, $only-color: true), $lightness: 20%); - color: hsl(0 0% 100%); - } - - &:hover, - &.is-active { - background-color: spruce.color(primary); - color: hsl(0 0% 100%); - } - } -} diff --git a/resources/sass/sprucecss-expansion/_index.scss b/resources/sass/sprucecss-expansion/_index.scss deleted file mode 100644 index 24e5d680d..000000000 --- a/resources/sass/sprucecss-expansion/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -@forward 'btn'; -@forward 'form'; -@forward 'table'; diff --git a/resources/sass/sprucecss-expansion/_table.scss b/resources/sass/sprucecss-expansion/_table.scss deleted file mode 100644 index a2a21b560..000000000 --- a/resources/sass/sprucecss-expansion/_table.scss +++ /dev/null @@ -1,65 +0,0 @@ -@use 'sass:color'; -@use '~sprucecss/scss/spruce'; - -.table { - a { - text-decoration: none; - } - - thead { - th { - background-color: spruce.color(primary); - color: hsl(0 0% 100%); - line-height: spruce.$line-height-sm; - } - } - - .select-row-wrapper { - display: flex; - - .form-check { - margin-block-end: 1px; - } - } - - &__actions { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: spruce.spacer(xs); - min-width: 6.5rem; - } - - .th-helper { - align-items: center; - display: flex; - gap: spruce.spacer(xxs); - } - - &-sort-btn { - @include spruce.clear-btn; - display: inline-flex; - height: 0.85rem; - opacity: 0.5; - transition-duration: spruce.transition(duration); - transition-property: opacity; - transition-timing-function: spruce.transition(timing-function); - width: 0.85rem; - - &:hover, - &:focus { - opacity: 0.75; - } - - svg { - height: auto; - width: 100%; - } - } - - tbody { - tr.is-trashed { - background-color: color.scale(hsl(0 71% 51%), $lightness: 80%) - } - } -} diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php index c06653eaf..6011979c9 100644 --- a/resources/views/app.blade.php +++ b/resources/views/app.blade.php @@ -7,36 +7,77 @@ {{-- Styles --}} - - - - - - @foreach(App::make('root')->assets->styles() as $key => $style) - - @endforeach + + + + + {{ + Vite::withEntryPoints('resources/sass/app.scss') + ->useBuildDirectory('vendor/root/build') + ->useHotFile(public_path('vendor/root/hot')) + }} + @stack('styles') {{-- Title --}} {{ Config::get('app.name') }} - {{-- App --}} - @inertia + +
+ +
+ +
+
+
+
+

@yield('title')

+ @hasSection('subtitle') +
+

@yield('subtitle')

+
+ @endif +
+ @hasSection('actions') +
+ @yield('actions') +
+ @endif +
+
+
+
+
+ @foreach($alerts as $alert) + + {!! $alert['message'] !!} + + @endforeach + @yield('content') +
+
+ +
+
- {{-- SVG Icons --}} - @include('root::icons') + {{-- Modals --}} +
{{-- Scripts --}} - {{ Vite::withEntryPoints('resources/js/app.js') ->useBuildDirectory('vendor/root/build') ->useHotFile(public_path('vendor/root/hot')) }} - @foreach(App::make('root')->assets->scripts() as $key => $script) - - @endforeach + @stack('scripts') + + {{-- Logout Form --}} + diff --git a/resources/views/auth/forgot-password.blade.php b/resources/views/auth/forgot-password.blade.php new file mode 100644 index 000000000..e69de29bb diff --git a/resources/views/auth/layout.blade.php b/resources/views/auth/layout.blade.php index 6fcf3ed19..4f15aa3ad 100644 --- a/resources/views/auth/layout.blade.php +++ b/resources/views/auth/layout.blade.php @@ -1,39 +1,44 @@ - {{-- Meta --}} - {{-- Styles --}} - + - {{-- Title --}} @yield('title') - {{ Config::get('app.name') }} -
-
- + +
+
+
+ +
+

@yield('title')

+ @if(Session::has('status')) + + {{ Session::get('status') }} + + @endif - {{-- Message --}} - @if(Session::has('message')) - - @endif + @if($errors->isNotEmpty()) + + {{ __('Some error occurred when submitting the form!') }} + + @endif - {{-- Errors --}} - @if($errors->isNotEmpty()) - - @endif - -
- {{-- Content --}} - @yield('content') + @hasSection('footer') + + @endif
+
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 1294d6246..94c1c3abe 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -5,63 +5,50 @@ {{-- Content --}} @section('content') -
- @csrf -
-
- - - @error('email') - - {{ $message }} - - @enderror -
- -
- - - @error('password') - - {{ $message }} - - @enderror -
- -
- -
- -
- -
+

Hey there, welcome back!

+ + @csrf +
+
+ + $errors->has('email')]) + id="email" + type="email" + name="email" + required + value="{{ Request::old('email') }}" + > + @error('email') + {{ $message }} + @enderror +
+
+ + $errors->has('password')]) + id="password" + type="password" + name="password" + required + > + @error('password') + {{ $message }} + @enderror +
+
+ +
+
+
- +
+ @endsection diff --git a/resources/views/auth/reset-password.blade.php b/resources/views/auth/reset-password.blade.php new file mode 100644 index 000000000..e69de29bb diff --git a/resources/views/components/alert.blade.php b/resources/views/components/alert.blade.php new file mode 100644 index 000000000..94e0429ac --- /dev/null +++ b/resources/views/components/alert.blade.php @@ -0,0 +1 @@ + diff --git a/resources/views/components/icon.blade.php b/resources/views/components/icon.blade.php new file mode 100644 index 000000000..c612638fd --- /dev/null +++ b/resources/views/components/icon.blade.php @@ -0,0 +1 @@ +@include($icon, ['attributes' => $attributes]) diff --git a/resources/views/components/layout/breadcrumbs.blade.php b/resources/views/components/layout/breadcrumbs.blade.php new file mode 100644 index 000000000..870d5f180 --- /dev/null +++ b/resources/views/components/layout/breadcrumbs.blade.php @@ -0,0 +1,8 @@ + diff --git a/resources/views/components/layout/footer.blade.php b/resources/views/components/layout/footer.blade.php new file mode 100644 index 000000000..1b4152f98 --- /dev/null +++ b/resources/views/components/layout/footer.blade.php @@ -0,0 +1,9 @@ +
+
+ +
+
diff --git a/resources/views/components/layout/header.blade.php b/resources/views/components/layout/header.blade.php new file mode 100644 index 000000000..353cce679 --- /dev/null +++ b/resources/views/components/layout/header.blade.php @@ -0,0 +1,45 @@ +
+
+
+ +
+ + {{-- --}} + +
+ +
+
+ +
+ {{ $user->name }} +
+ {{ $user->name }} + {{ $user->email }} +
+ +
    +
  • + +
  • +
+
+
+
+
diff --git a/resources/views/components/layout/notifications.blade.php b/resources/views/components/layout/notifications.blade.php new file mode 100644 index 000000000..10db14d6e --- /dev/null +++ b/resources/views/components/layout/notifications.blade.php @@ -0,0 +1,54 @@ +
+ +
+
+

{{ __('Notifications') }}

+ +
+
+ +
+ +
+
diff --git a/resources/views/components/layout/sidebar-group.blade.php b/resources/views/components/layout/sidebar-group.blade.php new file mode 100644 index 000000000..171ba3c1f --- /dev/null +++ b/resources/views/components/layout/sidebar-group.blade.php @@ -0,0 +1,28 @@ +
+

+ {{ $title }} + +

+ +
diff --git a/resources/views/components/layout/sidebar.blade.php b/resources/views/components/layout/sidebar.blade.php new file mode 100644 index 000000000..59d9cb4ef --- /dev/null +++ b/resources/views/components/layout/sidebar.blade.php @@ -0,0 +1,51 @@ +
+ +
diff --git a/resources/views/components/layout/theme.blade.php b/resources/views/components/layout/theme.blade.php new file mode 100644 index 000000000..906acdcd5 --- /dev/null +++ b/resources/views/components/layout/theme.blade.php @@ -0,0 +1,31 @@ +
+ + + +
diff --git a/resources/views/components/modal.blade.php b/resources/views/components/modal.blade.php new file mode 100644 index 000000000..7017b540d --- /dev/null +++ b/resources/views/components/modal.blade.php @@ -0,0 +1,47 @@ + diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php new file mode 100644 index 000000000..714136238 --- /dev/null +++ b/resources/views/dashboard.blade.php @@ -0,0 +1,13 @@ +@extends('root::app') + +{{-- Title --}} +@section('title', 'Dashboard') + +{{-- Content --}} +@section('content') +
+ @foreach($widgets as $widget) + {!! $widget !!} + @endforeach +
+@endsection diff --git a/resources/views/form/fields/boolean.blade.php b/resources/views/form/fields/boolean.blade.php new file mode 100644 index 000000000..427c985e7 --- /dev/null +++ b/resources/views/form/fields/boolean.blade.php @@ -0,0 +1,19 @@ +
+ +
+ +
+ @if($invalid) + {!! $error !!} + @endif + @if($help) + {!! $help !!} + @endif +
diff --git a/resources/views/form/fields/checkbox-option.blade.php b/resources/views/form/fields/checkbox-option.blade.php new file mode 100644 index 000000000..3b959e356 --- /dev/null +++ b/resources/views/form/fields/checkbox-option.blade.php @@ -0,0 +1,4 @@ + diff --git a/resources/views/form/fields/checkbox.blade.php b/resources/views/form/fields/checkbox.blade.php new file mode 100644 index 000000000..47b86b861 --- /dev/null +++ b/resources/views/form/fields/checkbox.blade.php @@ -0,0 +1,19 @@ +
+ +
+ @foreach($options as $option) + {!! $option !!} + @endforeach +
+ @if($invalid) + {!! $error !!} + @endif + @if($help) + {!! $help !!} + @endif +
diff --git a/resources/views/form/fields/dropdown-option.blade.php b/resources/views/form/fields/dropdown-option.blade.php new file mode 100644 index 000000000..afa00d014 --- /dev/null +++ b/resources/views/form/fields/dropdown-option.blade.php @@ -0,0 +1 @@ +{!! $label !!} diff --git a/resources/views/form/fields/dropdown.blade.php b/resources/views/form/fields/dropdown.blade.php new file mode 100644 index 000000000..34a4b24e5 --- /dev/null +++ b/resources/views/form/fields/dropdown.blade.php @@ -0,0 +1,95 @@ +
+ +
+
+ +
+
+ except('name') }} + aria-autocomplete="list" + aria-controls="{{ $attrs->get('id') }}-dropdown" + role="combobox" + x-model="search" + x-bind:aria-activedescendant="$refs.listbox.children[highlighted + 1]?.id || null" + x-bind:aria-expanded="open" + x-on:focus="open = true" + x-on:input="open = true" + > +
+
    + +
  • + {{ __('No results found.') }} +
  • +
+
+
+ +
+
+ +{{-- Script --}} +@pushOnce('scripts') + {{ + Vite::withEntryPoints('resources/js/dropdown.js') + ->useBuildDirectory('vendor/root/build') + ->useHotFile(public_path('vendor/root/hot')) + }} +@endpushOnce diff --git a/resources/views/form/fields/editor.blade.php b/resources/views/form/fields/editor.blade.php new file mode 100644 index 000000000..fd5696d2a --- /dev/null +++ b/resources/views/form/fields/editor.blade.php @@ -0,0 +1,46 @@ +
+ +
+ +
+ +
+ @if($invalid) + {!! $error !!} + @endif + @if($help) + {!! $help !!} + @endif +
+ +{{-- Modal --}} + +{{-- Script --}} +@pushOnce('scripts') + {{ + Vite::withEntryPoints('resources/js/editor.js') + ->useBuildDirectory('vendor/root/build') + ->useHotFile(public_path('vendor/root/hot')) + }} +@endpushOnce diff --git a/resources/views/form/fields/editor/align.blade.php b/resources/views/form/fields/editor/align.blade.php new file mode 100644 index 000000000..007686ce5 --- /dev/null +++ b/resources/views/form/fields/editor/align.blade.php @@ -0,0 +1,66 @@ +
+ + + + +
diff --git a/resources/views/form/fields/editor/blocks.blade.php b/resources/views/form/fields/editor/blocks.blade.php new file mode 100644 index 000000000..489b1e3f2 --- /dev/null +++ b/resources/views/form/fields/editor/blocks.blade.php @@ -0,0 +1,19 @@ +
+ + +
diff --git a/resources/views/form/fields/editor/format.blade.php b/resources/views/form/fields/editor/format.blade.php new file mode 100644 index 000000000..fdf12cdf3 --- /dev/null +++ b/resources/views/form/fields/editor/format.blade.php @@ -0,0 +1,55 @@ +
+ + + + + + +
diff --git a/resources/views/form/fields/editor/heading.blade.php b/resources/views/form/fields/editor/heading.blade.php new file mode 100644 index 000000000..ab04d6452 --- /dev/null +++ b/resources/views/form/fields/editor/heading.blade.php @@ -0,0 +1,17 @@ + diff --git a/resources/views/form/fields/editor/history.blade.php b/resources/views/form/fields/editor/history.blade.php new file mode 100644 index 000000000..c99ea457f --- /dev/null +++ b/resources/views/form/fields/editor/history.blade.php @@ -0,0 +1,20 @@ +
+ + +
diff --git a/resources/views/form/fields/editor/link.blade.php b/resources/views/form/fields/editor/link.blade.php new file mode 100644 index 000000000..b6508ae99 --- /dev/null +++ b/resources/views/form/fields/editor/link.blade.php @@ -0,0 +1,38 @@ +
+ + +
+ +{{-- Script --}} +@pushOnce('scripts') + +@endpushOnce diff --git a/resources/views/form/fields/editor/list.blade.php b/resources/views/form/fields/editor/list.blade.php new file mode 100644 index 000000000..1e51a8f8d --- /dev/null +++ b/resources/views/form/fields/editor/list.blade.php @@ -0,0 +1,20 @@ +
+ + +
diff --git a/resources/views/form/fields/editor/media.blade.php b/resources/views/form/fields/editor/media.blade.php new file mode 100644 index 000000000..63a63bf5c --- /dev/null +++ b/resources/views/form/fields/editor/media.blade.php @@ -0,0 +1,15 @@ +
+ + + @include('root::media.manager', [ + 'label' => $label, + 'modalKey' => $modalKey, + ]) +
diff --git a/resources/views/form/fields/fieldset.blade.php b/resources/views/form/fields/fieldset.blade.php new file mode 100644 index 000000000..04005f6ca --- /dev/null +++ b/resources/views/form/fields/fieldset.blade.php @@ -0,0 +1,6 @@ +
+ {{ $label }} + @foreach($fields as $field) + {!! $field->render() !!} + @endforeach +
diff --git a/resources/views/form/fields/file-option.blade.php b/resources/views/form/fields/file-option.blade.php new file mode 100644 index 000000000..b3eeb3fd3 --- /dev/null +++ b/resources/views/form/fields/file-option.blade.php @@ -0,0 +1,55 @@ +
+
+ @if($medium->isImage) + {{ $label }} + @else + + + + @endif + {{ $label }} + +
+
+ @if(! empty($fields)) + +
+
+ +@if(! empty($fields)) + + @foreach($fields as $field) + {!! $field !!} + @endforeach + + + + + +@endif diff --git a/resources/views/form/fields/file.blade.php b/resources/views/form/fields/file.blade.php new file mode 100644 index 000000000..e786ec674 --- /dev/null +++ b/resources/views/form/fields/file.blade.php @@ -0,0 +1,22 @@ +
+ + class(['form-file']) }}> + @if(! empty($options)) +
    + @foreach($options as $option) +
  • {!! $option !!}
  • + @endforeach +
+ @endif + @if($invalid) + {!! $error !!} + @endif + @if($help) + {!! $help !!} + @endif +
diff --git a/resources/views/form/fields/hidden.blade.php b/resources/views/form/fields/hidden.blade.php new file mode 100644 index 000000000..32efc4499 --- /dev/null +++ b/resources/views/form/fields/hidden.blade.php @@ -0,0 +1 @@ + diff --git a/resources/views/form/fields/image.blade.php b/resources/views/form/fields/image.blade.php new file mode 100644 index 000000000..196a1e313 --- /dev/null +++ b/resources/views/form/fields/image.blade.php @@ -0,0 +1,30 @@ +
+ +
+
+
+ +
+
+

Upload a product image

+
    +
  • Accepted formats: JPG, PNG
  • +
  • Maximum upload limit: 5 MB
  • +
+
+ + +
+
+
+
+
diff --git a/resources/views/form/fields/input.blade.php b/resources/views/form/fields/input.blade.php new file mode 100644 index 000000000..fafaa8548 --- /dev/null +++ b/resources/views/form/fields/input.blade.php @@ -0,0 +1,23 @@ +
+ +
+ @if($prefix) +
{!! $prefix !!}
+ @endif + + @if($suffix) +
{!! $suffix !!}
+ @endif +
+ @if($invalid) + {!! $error !!} + @endif + @if($help) + {!! $help !!} + @endif +
diff --git a/resources/views/form/fields/media.blade.php b/resources/views/form/fields/media.blade.php new file mode 100644 index 000000000..6b6423349 --- /dev/null +++ b/resources/views/form/fields/media.blade.php @@ -0,0 +1,26 @@ +
+ {{ $label }} +
+ +
    + +
+
+ + @include('root::media.manager', [ + 'label' => $label, + 'modalKey' => $modalKey, + 'config' => $config, + ]) +
diff --git a/resources/views/form/fields/optgroup.blade.php b/resources/views/form/fields/optgroup.blade.php new file mode 100644 index 000000000..6fd9b3e6b --- /dev/null +++ b/resources/views/form/fields/optgroup.blade.php @@ -0,0 +1,5 @@ + + @foreach($options as $option) + {!! $option->render() !!} + @endforeach + diff --git a/resources/views/form/fields/option.blade.php b/resources/views/form/fields/option.blade.php new file mode 100644 index 000000000..aa626279f --- /dev/null +++ b/resources/views/form/fields/option.blade.php @@ -0,0 +1 @@ + diff --git a/resources/views/form/fields/pending-file-option.blade.php b/resources/views/form/fields/pending-file-option.blade.php new file mode 100644 index 000000000..e69de29bb diff --git a/resources/views/form/fields/range.blade.php b/resources/views/form/fields/range.blade.php new file mode 100644 index 000000000..6449ff0b7 --- /dev/null +++ b/resources/views/form/fields/range.blade.php @@ -0,0 +1,40 @@ +
+ +
+
+ + class(['form-range', 'range-group__control']) }} value="{{ $value }}" x-model="value"> + +
+ + @if($prefix) + {!! $prefix !!} + @endif + {{ $value }} + @if($suffix) + {!! $suffix !!} + @endif + +
+
diff --git a/resources/views/form/fields/repeater-option.blade.php b/resources/views/form/fields/repeater-option.blade.php new file mode 100644 index 000000000..5c077ba32 --- /dev/null +++ b/resources/views/form/fields/repeater-option.blade.php @@ -0,0 +1,65 @@ +
+
+
+ +

+ # + {{ $label }} +

+
+
+ + + +
+
+
+
+
+ @foreach($fields as $field) + {!! $field !!} + @endforeach +
+
+
+
diff --git a/resources/views/form/fields/repeater.blade.php b/resources/views/form/fields/repeater.blade.php new file mode 100644 index 000000000..c0baf6b37 --- /dev/null +++ b/resources/views/form/fields/repeater.blade.php @@ -0,0 +1,28 @@ +
+ {{ $label }} +
+ +
+
+ +
+
+ +{{-- Script --}} +@pushOnce('scripts') + {{ + Vite::withEntryPoints('resources/js/repeater.js') + ->useBuildDirectory('vendor/root/build') + ->useHotFile(public_path('vendor/root/hot')) + }} +@endpushOnce diff --git a/resources/views/form/fields/select.blade.php b/resources/views/form/fields/select.blade.php new file mode 100644 index 000000000..e04d9b0d6 --- /dev/null +++ b/resources/views/form/fields/select.blade.php @@ -0,0 +1,16 @@ +
+ + +
diff --git a/resources/views/form/fields/textarea.blade.php b/resources/views/form/fields/textarea.blade.php new file mode 100644 index 000000000..6bd586c9d --- /dev/null +++ b/resources/views/form/fields/textarea.blade.php @@ -0,0 +1,10 @@ +
+ + + @if($invalid) + {!! $error !!} + @endif + @if($help) + {!! $help !!} + @endif +
diff --git a/resources/views/form/form.blade.php b/resources/views/form/form.blade.php new file mode 100644 index 000000000..32e2c87cd --- /dev/null +++ b/resources/views/form/form.blade.php @@ -0,0 +1,27 @@ +@if($errors->isNotEmpty()) + + {{ __('Some error occurred when submitting the form!') }} + +@endif + +
+ @csrf + @method($method) + +
+
+
+
+

General

+
+
+
+ @foreach($fields as $field) + {!! $field !!} + @endforeach +
+
+
+
+
+
diff --git a/resources/views/form/panel.blade.php b/resources/views/form/panel.blade.php new file mode 100644 index 000000000..906493fe4 --- /dev/null +++ b/resources/views/form/panel.blade.php @@ -0,0 +1,10 @@ +
+
+

General

+
+
+
+ +
+
+
diff --git a/resources/views/icons.blade.php b/resources/views/icons.blade.php deleted file mode 100644 index a836cb8b3..000000000 --- a/resources/views/icons.blade.php +++ /dev/null @@ -1,166 +0,0 @@ - diff --git a/resources/views/icons/archive.blade.php b/resources/views/icons/archive.blade.php new file mode 100644 index 000000000..b299fb5f7 --- /dev/null +++ b/resources/views/icons/archive.blade.php @@ -0,0 +1,18 @@ + diff --git a/resources/views/icons/arrow-outward.blade.php b/resources/views/icons/arrow-outward.blade.php new file mode 100644 index 000000000..3d9f4473a --- /dev/null +++ b/resources/views/icons/arrow-outward.blade.php @@ -0,0 +1,13 @@ + diff --git a/resources/views/icons/bar-chart.blade.php b/resources/views/icons/bar-chart.blade.php new file mode 100644 index 000000000..76d9a84bc --- /dev/null +++ b/resources/views/icons/bar-chart.blade.php @@ -0,0 +1,18 @@ + diff --git a/resources/views/icons/check.blade.php b/resources/views/icons/check.blade.php new file mode 100644 index 000000000..9608b761c --- /dev/null +++ b/resources/views/icons/check.blade.php @@ -0,0 +1,16 @@ + diff --git a/resources/views/icons/chevron-down.blade.php b/resources/views/icons/chevron-down.blade.php new file mode 100644 index 000000000..bafbc9977 --- /dev/null +++ b/resources/views/icons/chevron-down.blade.php @@ -0,0 +1,16 @@ + diff --git a/resources/views/icons/chevron-left.blade.php b/resources/views/icons/chevron-left.blade.php new file mode 100644 index 000000000..b55ce02c7 --- /dev/null +++ b/resources/views/icons/chevron-left.blade.php @@ -0,0 +1,16 @@ + diff --git a/resources/views/icons/chevron-right.blade.php b/resources/views/icons/chevron-right.blade.php new file mode 100644 index 000000000..550235c22 --- /dev/null +++ b/resources/views/icons/chevron-right.blade.php @@ -0,0 +1,16 @@ + diff --git a/resources/views/icons/chevron-up-down.blade.php b/resources/views/icons/chevron-up-down.blade.php new file mode 100644 index 000000000..ee9976131 --- /dev/null +++ b/resources/views/icons/chevron-up-down.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/chevron-up.blade.php b/resources/views/icons/chevron-up.blade.php new file mode 100644 index 000000000..06b8a7cc4 --- /dev/null +++ b/resources/views/icons/chevron-up.blade.php @@ -0,0 +1,16 @@ + diff --git a/resources/views/icons/close.blade.php b/resources/views/icons/close.blade.php new file mode 100644 index 000000000..061aaeb72 --- /dev/null +++ b/resources/views/icons/close.blade.php @@ -0,0 +1,17 @@ + diff --git a/resources/views/icons/dark-mode.blade.php b/resources/views/icons/dark-mode.blade.php new file mode 100644 index 000000000..691ac6b25 --- /dev/null +++ b/resources/views/icons/dark-mode.blade.php @@ -0,0 +1,13 @@ + diff --git a/resources/views/icons/document.blade.php b/resources/views/icons/document.blade.php new file mode 100644 index 000000000..8612c9f9d --- /dev/null +++ b/resources/views/icons/document.blade.php @@ -0,0 +1,20 @@ + diff --git a/resources/views/icons/download.blade.php b/resources/views/icons/download.blade.php new file mode 100644 index 000000000..0bd908559 --- /dev/null +++ b/resources/views/icons/download.blade.php @@ -0,0 +1,14 @@ + + + diff --git a/resources/views/icons/edit.blade.php b/resources/views/icons/edit.blade.php new file mode 100644 index 000000000..b363026fe --- /dev/null +++ b/resources/views/icons/edit.blade.php @@ -0,0 +1,17 @@ + diff --git a/resources/views/icons/eye.blade.php b/resources/views/icons/eye.blade.php new file mode 100644 index 000000000..c00a8396e --- /dev/null +++ b/resources/views/icons/eye.blade.php @@ -0,0 +1,17 @@ + diff --git a/resources/views/icons/filter.blade.php b/resources/views/icons/filter.blade.php new file mode 100644 index 000000000..edc1bfc4a --- /dev/null +++ b/resources/views/icons/filter.blade.php @@ -0,0 +1,16 @@ + diff --git a/resources/views/icons/format-align-center.blade.php b/resources/views/icons/format-align-center.blade.php new file mode 100644 index 000000000..aa559eeba --- /dev/null +++ b/resources/views/icons/format-align-center.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-align-justify.blade.php b/resources/views/icons/format-align-justify.blade.php new file mode 100644 index 000000000..296634ae2 --- /dev/null +++ b/resources/views/icons/format-align-justify.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-align-left.blade.php b/resources/views/icons/format-align-left.blade.php new file mode 100644 index 000000000..1a848d8d7 --- /dev/null +++ b/resources/views/icons/format-align-left.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-align-right.blade.php b/resources/views/icons/format-align-right.blade.php new file mode 100644 index 000000000..ac70d0446 --- /dev/null +++ b/resources/views/icons/format-align-right.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-bold.blade.php b/resources/views/icons/format-bold.blade.php new file mode 100644 index 000000000..6a9883807 --- /dev/null +++ b/resources/views/icons/format-bold.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-bullet-list.blade.php b/resources/views/icons/format-bullet-list.blade.php new file mode 100644 index 000000000..af961ec8c --- /dev/null +++ b/resources/views/icons/format-bullet-list.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-clear.blade.php b/resources/views/icons/format-clear.blade.php new file mode 100644 index 000000000..683f1c471 --- /dev/null +++ b/resources/views/icons/format-clear.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-highlight.blade.php b/resources/views/icons/format-highlight.blade.php new file mode 100644 index 000000000..05a3ed477 --- /dev/null +++ b/resources/views/icons/format-highlight.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-italic.blade.php b/resources/views/icons/format-italic.blade.php new file mode 100644 index 000000000..a8bbf3385 --- /dev/null +++ b/resources/views/icons/format-italic.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-line.blade.php b/resources/views/icons/format-line.blade.php new file mode 100644 index 000000000..e2c9849d9 --- /dev/null +++ b/resources/views/icons/format-line.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-link.blade.php b/resources/views/icons/format-link.blade.php new file mode 100644 index 000000000..80f91ec45 --- /dev/null +++ b/resources/views/icons/format-link.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-ordered-list.blade.php b/resources/views/icons/format-ordered-list.blade.php new file mode 100644 index 000000000..9ce6fa93b --- /dev/null +++ b/resources/views/icons/format-ordered-list.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-strike.blade.php b/resources/views/icons/format-strike.blade.php new file mode 100644 index 000000000..6d78d2374 --- /dev/null +++ b/resources/views/icons/format-strike.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/format-underline.blade.php b/resources/views/icons/format-underline.blade.php new file mode 100644 index 000000000..b3a47f056 --- /dev/null +++ b/resources/views/icons/format-underline.blade.php @@ -0,0 +1,14 @@ + + + diff --git a/resources/views/icons/format-unlink.blade.php b/resources/views/icons/format-unlink.blade.php new file mode 100644 index 000000000..f33803c21 --- /dev/null +++ b/resources/views/icons/format-unlink.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/history-do.blade.php b/resources/views/icons/history-do.blade.php new file mode 100644 index 000000000..78803720b --- /dev/null +++ b/resources/views/icons/history-do.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/history-undo.blade.php b/resources/views/icons/history-undo.blade.php new file mode 100644 index 000000000..1608d3d53 --- /dev/null +++ b/resources/views/icons/history-undo.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/icons/home.blade.php b/resources/views/icons/home.blade.php new file mode 100644 index 000000000..c103e0411 --- /dev/null +++ b/resources/views/icons/home.blade.php @@ -0,0 +1,17 @@ + diff --git a/resources/views/icons/image.blade.php b/resources/views/icons/image.blade.php new file mode 100644 index 000000000..975e1b6fc --- /dev/null +++ b/resources/views/icons/image.blade.php @@ -0,0 +1,14 @@ + + + diff --git a/resources/views/icons/light-mode.blade.php b/resources/views/icons/light-mode.blade.php new file mode 100644 index 000000000..98af9ccca --- /dev/null +++ b/resources/views/icons/light-mode.blade.php @@ -0,0 +1,13 @@ + diff --git a/resources/views/icons/menu-open.blade.php b/resources/views/icons/menu-open.blade.php new file mode 100644 index 000000000..ab4cd2077 --- /dev/null +++ b/resources/views/icons/menu-open.blade.php @@ -0,0 +1,13 @@ + diff --git a/resources/views/icons/menu.blade.php b/resources/views/icons/menu.blade.php new file mode 100644 index 000000000..28181f418 --- /dev/null +++ b/resources/views/icons/menu.blade.php @@ -0,0 +1,13 @@ + diff --git a/resources/views/icons/minus.blade.php b/resources/views/icons/minus.blade.php new file mode 100644 index 000000000..c91a3bcfd --- /dev/null +++ b/resources/views/icons/minus.blade.php @@ -0,0 +1,16 @@ + diff --git a/resources/views/icons/notifications.blade.php b/resources/views/icons/notifications.blade.php new file mode 100644 index 000000000..2d123c3f8 --- /dev/null +++ b/resources/views/icons/notifications.blade.php @@ -0,0 +1,17 @@ + diff --git a/resources/views/icons/pie-chart.blade.php b/resources/views/icons/pie-chart.blade.php new file mode 100644 index 000000000..9fb99dfeb --- /dev/null +++ b/resources/views/icons/pie-chart.blade.php @@ -0,0 +1,17 @@ + diff --git a/resources/views/icons/plus.blade.php b/resources/views/icons/plus.blade.php new file mode 100644 index 000000000..3ac3a3c00 --- /dev/null +++ b/resources/views/icons/plus.blade.php @@ -0,0 +1,17 @@ + diff --git a/resources/views/icons/search.blade.php b/resources/views/icons/search.blade.php new file mode 100644 index 000000000..e3d5bac20 --- /dev/null +++ b/resources/views/icons/search.blade.php @@ -0,0 +1,13 @@ + diff --git a/resources/views/icons/shopping-bag.blade.php b/resources/views/icons/shopping-bag.blade.php new file mode 100644 index 000000000..e5c6b3c86 --- /dev/null +++ b/resources/views/icons/shopping-bag.blade.php @@ -0,0 +1,18 @@ + diff --git a/resources/views/icons/shopping-cart.blade.php b/resources/views/icons/shopping-cart.blade.php new file mode 100644 index 000000000..9250fbb74 --- /dev/null +++ b/resources/views/icons/shopping-cart.blade.php @@ -0,0 +1,18 @@ + diff --git a/resources/views/icons/star.blade.php b/resources/views/icons/star.blade.php new file mode 100644 index 000000000..fecdf050a --- /dev/null +++ b/resources/views/icons/star.blade.php @@ -0,0 +1,16 @@ + diff --git a/resources/views/icons/system-mode.blade.php b/resources/views/icons/system-mode.blade.php new file mode 100644 index 000000000..5ee07cb6e --- /dev/null +++ b/resources/views/icons/system-mode.blade.php @@ -0,0 +1,13 @@ + diff --git a/resources/views/icons/trash.blade.php b/resources/views/icons/trash.blade.php new file mode 100644 index 000000000..d0082d5bf --- /dev/null +++ b/resources/views/icons/trash.blade.php @@ -0,0 +1,19 @@ + diff --git a/resources/views/icons/trending-down.blade.php b/resources/views/icons/trending-down.blade.php new file mode 100644 index 000000000..6ccd453f9 --- /dev/null +++ b/resources/views/icons/trending-down.blade.php @@ -0,0 +1,17 @@ + diff --git a/resources/views/icons/trending-up.blade.php b/resources/views/icons/trending-up.blade.php new file mode 100644 index 000000000..545a4769f --- /dev/null +++ b/resources/views/icons/trending-up.blade.php @@ -0,0 +1,17 @@ + diff --git a/resources/views/icons/users.blade.php b/resources/views/icons/users.blade.php new file mode 100644 index 000000000..ddb2c7af4 --- /dev/null +++ b/resources/views/icons/users.blade.php @@ -0,0 +1,19 @@ + diff --git a/resources/views/media/filters.blade.php b/resources/views/media/filters.blade.php new file mode 100644 index 000000000..8614525ab --- /dev/null +++ b/resources/views/media/filters.blade.php @@ -0,0 +1,9 @@ + diff --git a/resources/views/media/manager.blade.php b/resources/views/media/manager.blade.php new file mode 100644 index 000000000..3a6cf2f3e --- /dev/null +++ b/resources/views/media/manager.blade.php @@ -0,0 +1,58 @@ + + + @include('root::media.filters') + + +
    + + +
+ + + + +
+ +{{-- Script --}} +@pushOnce('scripts') + {{ + Vite::withEntryPoints('resources/js/media-manager.js') + ->useBuildDirectory('vendor/root/build') + ->useHotFile(public_path('vendor/root/hot')) + }} +@endpushOnce diff --git a/resources/views/media/medium.blade.php b/resources/views/media/medium.blade.php new file mode 100644 index 000000000..2d0ce59e2 --- /dev/null +++ b/resources/views/media/medium.blade.php @@ -0,0 +1,28 @@ + diff --git a/resources/views/media/queue.blade.php b/resources/views/media/queue.blade.php new file mode 100644 index 000000000..e69de29bb diff --git a/resources/views/media/queued-medium.blade.php b/resources/views/media/queued-medium.blade.php new file mode 100644 index 000000000..16d58d86f --- /dev/null +++ b/resources/views/media/queued-medium.blade.php @@ -0,0 +1,21 @@ +
  • + +
    +
    +
    +
    +
    +
    +
    +
  • diff --git a/resources/views/resources/form.blade.php b/resources/views/resources/form.blade.php new file mode 100644 index 000000000..ce0adcd03 --- /dev/null +++ b/resources/views/resources/form.blade.php @@ -0,0 +1,25 @@ +@extends('root::app') + +{{-- Title --}} +@section('title', $title) + +{{-- Content --}} +@section('content') +{!! $form !!} + +
    +
    + + +
    + @if($form->model->exists) +
    +
    + @csrf + @method('DELETE') + +
    +
    + @endif +
    +@endsection diff --git a/resources/views/resources/index.blade.php b/resources/views/resources/index.blade.php new file mode 100644 index 000000000..2d372c7f3 --- /dev/null +++ b/resources/views/resources/index.blade.php @@ -0,0 +1,17 @@ +@extends('root::app') + +{{-- Title --}} +@section('title', $title) + +{{-- Content --}} +@section('content') +@if(! empty($widgets)) +
    + @foreach($widgets as $widget) + {!! $widget !!} + @endforeach +
    +@endif + +{!! $table !!} +@endsection diff --git a/resources/views/table/actions.blade.php b/resources/views/table/actions.blade.php new file mode 100644 index 000000000..c1bd66abc --- /dev/null +++ b/resources/views/table/actions.blade.php @@ -0,0 +1,39 @@ +
    + {{ __('items selected.') }} +
    +
    + + +
    +
    + + + @foreach($actions as $action) + {!! $action !!} + @endforeach +
    +
    +
    diff --git a/resources/views/table/actions/action.blade.php b/resources/views/table/actions/action.blade.php new file mode 100644 index 000000000..4271ce1a0 --- /dev/null +++ b/resources/views/table/actions/action.blade.php @@ -0,0 +1,12 @@ + + {!! $form !!} + + + + + + diff --git a/resources/views/table/actions/form.blade.php b/resources/views/table/actions/form.blade.php new file mode 100644 index 000000000..7e00a040f --- /dev/null +++ b/resources/views/table/actions/form.blade.php @@ -0,0 +1,9 @@ +
    + @csrf + @method($method) +
    + @foreach($fields as $field) + {!! $field !!} + @endforeach +
    +
    diff --git a/resources/views/table/cells/row-actions.blade.php b/resources/views/table/cells/row-actions.blade.php new file mode 100644 index 000000000..61cf1f9a4 --- /dev/null +++ b/resources/views/table/cells/row-actions.blade.php @@ -0,0 +1,18 @@ + +
    + @can('update', $model) + + + + @endcan + @can('delete', $model) +
    + @csrf + @method('DELETE') + +
    + @endcan +
    + diff --git a/resources/views/table/cells/row-select.blade.php b/resources/views/table/cells/row-select.blade.php new file mode 100644 index 000000000..291bd8ec4 --- /dev/null +++ b/resources/views/table/cells/row-select.blade.php @@ -0,0 +1,5 @@ + + + diff --git a/resources/views/table/cells/text.blade.php b/resources/views/table/cells/text.blade.php new file mode 100644 index 000000000..69bb48070 --- /dev/null +++ b/resources/views/table/cells/text.blade.php @@ -0,0 +1 @@ +{!! $formattedValue !!} diff --git a/resources/views/table/columns/actions.blade.php b/resources/views/table/columns/actions.blade.php new file mode 100644 index 000000000..38d2ac524 --- /dev/null +++ b/resources/views/table/columns/actions.blade.php @@ -0,0 +1,3 @@ + + {{ $label }} + diff --git a/resources/views/table/columns/column.blade.php b/resources/views/table/columns/column.blade.php new file mode 100644 index 000000000..bd4c0697b --- /dev/null +++ b/resources/views/table/columns/column.blade.php @@ -0,0 +1,12 @@ + + @if($sortable) +
    + {{ $label }} + +
    + @else + {{ $label }} + @endif + diff --git a/resources/views/table/columns/select-all.blade.php b/resources/views/table/columns/select-all.blade.php new file mode 100644 index 000000000..dd5a64283 --- /dev/null +++ b/resources/views/table/columns/select-all.blade.php @@ -0,0 +1,6 @@ + + {{ __('Select') }} + + diff --git a/resources/views/table/filters/form.blade.php b/resources/views/table/filters/form.blade.php new file mode 100644 index 000000000..767c953dd --- /dev/null +++ b/resources/views/table/filters/form.blade.php @@ -0,0 +1,35 @@ +
    + @if($search) + {!! $search !!} + @endif + @if(! empty($fields)) +
    + +
    +
    + @foreach($fields as $field) + {!! $field !!} + @endforeach +
    + + +
    +
    +
    +
    + @endif +
    diff --git a/resources/views/table/filters/search.blade.php b/resources/views/table/filters/search.blade.php new file mode 100644 index 000000000..e621d1bc9 --- /dev/null +++ b/resources/views/table/filters/search.blade.php @@ -0,0 +1,7 @@ +
    + class(['form-control search-form__control']) }} value="{{ $value }}"> + +
    diff --git a/resources/views/table/pagination.blade.php b/resources/views/table/pagination.blade.php new file mode 100644 index 000000000..930189336 --- /dev/null +++ b/resources/views/table/pagination.blade.php @@ -0,0 +1,43 @@ +@if ($paginator->hasPages()) + +@endif diff --git a/resources/views/table/table.blade.php b/resources/views/table/table.blade.php new file mode 100644 index 000000000..bcbd73998 --- /dev/null +++ b/resources/views/table/table.blade.php @@ -0,0 +1,59 @@ +
    +
    +

    {{ $title }}

    + {!! $form !!} +
    +
    +
    + @includeWhen(! empty($actions), 'root::table.actions') +
    + + + + @foreach($columns as $column) + {!! $column !!} + @endforeach + + + + @foreach($items as $item) + + @foreach($item['cells'] as $cell) + {!! $cell !!} + @endforeach + + @endforeach + +
    +
    + +
    +
    +
    diff --git a/resources/views/widgets/trend.blade.php b/resources/views/widgets/trend.blade.php new file mode 100644 index 000000000..e499053ea --- /dev/null +++ b/resources/views/widgets/trend.blade.php @@ -0,0 +1,13 @@ +
    +
    +

    {{ $name }}

    +

    65

    + +
    +
    +
    +
    +
    diff --git a/resources/views/widgets/widget.blade.php b/resources/views/widgets/widget.blade.php new file mode 100644 index 000000000..dead391ff --- /dev/null +++ b/resources/views/widgets/widget.blade.php @@ -0,0 +1 @@ +
    diff --git a/routes/api.php b/routes/api.php new file mode 100644 index 000000000..073ffe148 --- /dev/null +++ b/routes/api.php @@ -0,0 +1,11 @@ +except(['store']); + +// Resource Fields +Route::any('/{resource}/form/fields/{field}', ResourceFieldController::class)->where('field', '.*'); diff --git a/routes/auth.php b/routes/auth.php new file mode 100644 index 000000000..2a20318c9 --- /dev/null +++ b/routes/auth.php @@ -0,0 +1,8 @@ +name('login'); +Route::post('login', [LoginController::class, 'login']); +Route::post('logout', [LoginController::class, 'logout'])->name('logout'); diff --git a/routes/web.php b/routes/web.php index 4dab2a769..c0c5a8a68 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,14 +1,17 @@ name('dashboard'); -// API Routes -Route::prefix('api')->as('api.')->group(static function (): void { - // Notifications - Route::apiResource('notifications', NotificationsController::class)->except(['store']); -}); +// Resource +Route::get('/{resource}', [ResourceController::class, 'index'])->name('resource.index'); +Route::get('/{resource}/create', [ResourceController::class, 'create'])->name('resource.create'); +Route::post('/{resource}', [ResourceController::class, 'store'])->name('resource.store'); +Route::get('/{resource}/{resourceModel}', [ResourceController::class, 'edit'])->name('resource.edit'); +Route::patch('/{resource}/{resourceModel}', [ResourceController::class, 'update'])->name('resource.update'); +Route::delete('/{resource}/{resourceModel}', [ResourceController::class, 'destroy'])->name('resource.delete'); +Route::post('/{resource}/{resourceModel}/restore', [ResourceController::class, 'restore'])->name('resource.restore'); diff --git a/src/Actions/Action.php b/src/Actions/Action.php deleted file mode 100644 index 486932750..000000000 --- a/src/Actions/Action.php +++ /dev/null @@ -1,240 +0,0 @@ -classBasename()->kebab()->value(); - } - - /** - * Get the URI key. - */ - public function getUriKey(): string - { - return $this->getKey(); - } - - /** - * Get the name. - */ - public function getName(): string - { - return __(Str::of(static::class)->classBasename()->headline()->value()); - } - - /** - * Set the destructive property. - */ - public function destructive(bool $value = true): static - { - $this->destructive = $value; - - return $this; - } - - /** - * Determine if the action is destructive. - */ - public function isDestructive(): bool - { - return $this->destructive; - } - - /** - * Set the confirmable property. - */ - public function confirmable(bool $value = true): static - { - $this->confirmable = $value; - - return $this; - } - - /** - * Determine if the action is confirmable. - */ - public function isConfirmable(): bool - { - return $this->confirmable; - } - - /** - * Perform the action. - */ - public function perform(Request $request): Response - { - $query = $this->resolveQuery($request); - - $model = $query->getModel(); - - $request->validate( - $this->resolveFields($request) - ->authorized($request, $model) - ->mapToValidate($request, $model) - ); - - $this->handle( - $request, - $request->boolean('all') ? $query->get() : $query->findMany($request->input('models', [])) - ); - - return $this->toResponse($request); - } - - /** - * Set the query resolver. - * - * @return $this - */ - public function withQuery(Closure $callback): static - { - $this->queryResolver = $callback; - - return $this; - } - - /** - * Resolve the query for the extract. - */ - public function resolveQuery(Request $request): Builder - { - if (is_null($this->queryResolver)) { - throw new QueryResolutionException(); - } - - return call_user_func_array($this->queryResolver, [$request]); - } - - /** - * Handle the resolving event on the field instance. - */ - protected function resolveField(Request $request, Field $field): void - { - $field->mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - }); - } - - /** - * Register the action routes. - */ - public function registerRoutes(Router $router): void - { - $this->__registerRoutes($router); - - $request = App::make('request'); - - $router->prefix($this->getUriKey())->group(function (Router $router) use ($request): void { - $this->resolveFields($request)->registerRoutes($router); - }); - } - - /** - * The routes that should be registered. - */ - public function routes(Router $router): void - { - $router->post('/', ActionController::class); - } - - /** - * Get the instance as an array. - */ - public function toArray(): array - { - return [ - 'confirmable' => $this->isConfirmable(), - 'destructive' => $this->isDestructive(), - 'key' => $this->getKey(), - 'name' => $this->getName(), - 'url' => $this->getUri(), - ]; - } - - /** - * Get the form representation of the action. - */ - public function toForm(Request $request, Model $model): array - { - $fields = $this->resolveFields($request) - ->authorized($request, $model) - ->mapToForm($request, $model); - - return array_merge($this->toArray(), [ - 'data' => array_reduce($fields, static function (array $data, array $field): array { - return array_replace_recursive($data, [$field['name'] => $field['value']]); - }, []), - 'fields' => $fields, - ]); - } - - /** - * Create an HTTP response that represents the object. - * - * @param \Illuminate\Http\Request $request - */ - public function toResponse($request): Response - { - return Redirect::back()->with( - sprintf('alerts.action-%s', $this->getKey()), - Alert::info(__(':action was successful!', ['action' => $this->getName()])) - ); - } -} diff --git a/src/Console/Commands/ClearChunks.php b/src/Console/Commands/ClearChunks.php index 0a192ad15..edd903cc0 100644 --- a/src/Console/Commands/ClearChunks.php +++ b/src/Console/Commands/ClearChunks.php @@ -32,15 +32,19 @@ public function handle(): int $expiration = Config::get('root.media.chunk_expiration', 1440) * 60; - foreach (Storage::disk('local')->allFiles('root-chunks') as $file) { + $count = 0; + + foreach (Storage::disk('local')->allFiles(Config::get('root.media.upload_dir')) as $file) { $info = new SplFileInfo(Storage::disk('local')->path($file)); if ($now - $info->getMTime() >= $expiration) { Storage::disk('local')->delete($file); + + $count++; } } - $this->info('File chunks are cleared!'); + $this->info(sprintf('%d chunks are cleared!', $count)); return Command::SUCCESS; } diff --git a/src/Console/Commands/ExtractMake.php b/src/Console/Commands/ExtractMake.php deleted file mode 100644 index 831c600be..000000000 --- a/src/Console/Commands/ExtractMake.php +++ /dev/null @@ -1,47 +0,0 @@ -replaceComponent($class); + return $this->replaceTemplate($class); } /** - * Replace the component related code. + * Replace the template related code. */ - protected function replaceComponent(string $class): string + protected function replaceTemplate(string $class): string { - if ($component = $this->option('component')) { + if ($template = $this->option('template')) { return str_replace( - [PHP_EOL.'%%component%%', '%%/component%%', '{{ component }}'], - ['', '', $component], + [PHP_EOL.'%%template%%', '%%/template%%', '{{ template }}'], + ['', '', $template], $class ); } - return preg_replace('/\n%%component%%.*%%\/component%%/s', '', $class); + return preg_replace('/\n%%template%%.*%%\/template%%/s', '', $class); } /** @@ -80,7 +80,7 @@ protected function replaceComponent(string $class): string protected function getOptions(): array { return [ - ['component', null, InputOption::VALUE_OPTIONAL, 'The Vue component'], + ['template', null, InputOption::VALUE_OPTIONAL, 'The Blade template'], ]; } } diff --git a/src/Console/Commands/FilterMake.php b/src/Console/Commands/FilterMake.php index 4c9b1fa36..2107823b0 100644 --- a/src/Console/Commands/FilterMake.php +++ b/src/Console/Commands/FilterMake.php @@ -33,7 +33,9 @@ class FilterMake extends GeneratorCommand */ protected function getStub(): string { - return __DIR__.'/../../../stubs/Filter.stub'; + return match ($this->option('type')) { + default => __DIR__.'/../../../stubs/SelectFilter.stub', + }; } /** @@ -55,27 +57,9 @@ protected function buildClass($name): string { $class = parent::buildClass($name); - $class = $this->replaceComponent($class); - return $this->replaceMultiple($class); } - /** - * Replace the component related code. - */ - protected function replaceComponent(string $class): string - { - if ($component = $this->option('component')) { - return str_replace( - [PHP_EOL.'%%component%%', '%%/component%%', '{{ component }}'], - ['', '', $component], - $class - ); - } - - return preg_replace('/\s%%component%%.*%%\/component%%/s', '', $class); - } - /** * Replace the multiple related code. */ @@ -94,7 +78,7 @@ protected function replaceMultiple(string $class): string protected function getOptions(): array { return [ - ['component', null, InputOption::VALUE_OPTIONAL, 'The Vue component'], + ['type', null, InputOption::VALUE_OPTIONAL, 'The filter type', 'select'], ['multiple', null, InputOption::VALUE_NONE, 'Mark the filter as multiple'], ]; } diff --git a/src/Console/Commands/Install.php b/src/Console/Commands/Install.php index fb5364b14..c9101c764 100644 --- a/src/Console/Commands/Install.php +++ b/src/Console/Commands/Install.php @@ -4,8 +4,8 @@ use Cone\Root\Database\Seeders\RootTestDataSeeder; use Illuminate\Console\Command; +use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\File; -use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; class Install extends Command @@ -31,7 +31,7 @@ public function handle(): int { $status = $this->call('migrate'); - File::ensureDirectoryExists(Storage::disk('local')->path('root-chunks')); + File::ensureDirectoryExists(Config::get('root.media.tmp_dir')); if ($this->option('seed')) { $status = $this->call('db:seed', ['--class' => RootTestDataSeeder::class]); diff --git a/src/Console/Commands/RelationMake.php b/src/Console/Commands/RelationMake.php deleted file mode 100644 index cb9b12878..000000000 --- a/src/Console/Commands/RelationMake.php +++ /dev/null @@ -1,47 +0,0 @@ -replaceAsync($class); + $class = $this->replaceTemplate($class); - $class = $this->replaceComponent($class); + $this->makeView(); - return $this->replaceTemplate($class); + return $class; } /** - * Replace the async related code. + * Replace the template related code. */ - protected function replaceAsync(string $class): string + protected function replaceTemplate(string $class): string { - if ($this->option('async')) { - $class = str_replace([PHP_EOL.'%%async%%', '%%/async%%'], '', $class); - } - - return preg_replace('/\n%%async%%.*%%\/async%%/s', '', $class); + return str_replace('{{ template }}', $this->getView(), $class); } /** - * Replace the component related code. + * Make the view for the component. */ - protected function replaceComponent(string $class): string + protected function makeView(): void { - if ($component = $this->option('component')) { - return str_replace( - [PHP_EOL.'%%component%%', '%%/component%%', '{{ component }}'], - ['', '', $component], - $class - ); + $path = $this->viewPath(str_replace('.', '/', $this->getView()).'.blade.php'); + + if (! $this->files->isDirectory(dirname($path))) { + $this->files->makeDirectory(dirname($path), 0777, true, true); + } + + if ($this->files->exists($path) && ! $this->option('force')) { + $this->components->error('View already exists.'); + + return; } - return preg_replace('/\n%%component%%.*%%\/component%%/s', '', $class); + file_put_contents($path, '
    '); } /** - * Replace the template related code. + * Get the view name relative to the components directory. */ - protected function replaceTemplate(string $class): string + protected function getView(): string { - $template = $this->option('template') ?: 'widgets.'.Str::kebab($this->getNameInput()); + if ($this->option('template')) { + return $this->option('template'); + } + + $name = str_replace('\\', '/', $this->getNameInput()); - return str_replace('{{ template }}', $template, $class); + return 'widgets.'.implode('.', array_map([Str::class, 'kebab'], explode('/', $name))); } /** @@ -107,8 +111,7 @@ protected function replaceTemplate(string $class): string protected function getOptions(): array { return [ - ['async', null, InputOption::VALUE_NONE, 'Mark the widget as async'], - ['component', null, InputOption::VALUE_OPTIONAL, 'The Vue component'], + ['force', 'f', InputOption::VALUE_NONE, 'Create the class even if the component already exists'], ['template', null, InputOption::VALUE_OPTIONAL, 'The Blade template'], ]; } diff --git a/src/Conversion/GdDriver.php b/src/Conversion/GdDriver.php index 94d169ff2..63824e164 100644 --- a/src/Conversion/GdDriver.php +++ b/src/Conversion/GdDriver.php @@ -4,8 +4,8 @@ use Closure; use Cone\Root\Models\Medium; +use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\File; -use Illuminate\Support\Facades\Storage; class GdDriver extends Driver { @@ -14,7 +14,7 @@ class GdDriver extends Driver */ public function perform(Medium $medium): void { - File::ensureDirectoryExists(Storage::disk('local')->path('root-tmp')); + File::ensureDirectoryExists(Config::get('root.media.tmp_dir')); parent::perform($medium); } diff --git a/src/Conversion/Image.php b/src/Conversion/Image.php index 42df64247..c1e15e160 100644 --- a/src/Conversion/Image.php +++ b/src/Conversion/Image.php @@ -96,7 +96,7 @@ public function setQuality(int $quality): static * * @return $this */ - public function crop(?int $width = null, ?int $height = null): static + public function crop(int $width = null, int $height = null): static { $this->resize($width, $height, true); @@ -106,7 +106,7 @@ public function crop(?int $width = null, ?int $height = null): static /** * Resize the image. */ - public function resize(?int $width = null, ?int $height = null, bool $crop = false): static + public function resize(int $width = null, int $height = null, bool $crop = false): static { $x = $y = 0; [$originalWidth, $originalHeight] = getimagesize($this->medium->getAbsolutePath()); @@ -137,7 +137,18 @@ public function resize(?int $width = null, ?int $height = null, bool $crop = fal imagefill($resource, 0, 0, imagecolorallocatealpha($resource, 0, 0, 0, 127)); } - imagecopyresampled($resource, $this->resource, 0, 0, (int) $x, (int) $y, (int) $width, (int) $height, $originalWidth, $originalHeight); + imagecopyresampled( + $resource, + $this->resource, + 0, + 0, + (int) $x, + (int) $y, + (int) $width, + (int) $height, + $originalWidth, + $originalHeight + ); imagedestroy($this->resource); $this->resource = $resource; @@ -169,11 +180,11 @@ public function save(): void } } - /** - * Create the resource. - */ - protected function create(): void - { + /** + * Create the resource. + */ + protected function create(): void + { switch ($this->type) { case IMAGETYPE_GIF: $this->resource = imagecreatefromgif($this->medium->getAbsolutePath()); @@ -190,7 +201,7 @@ protected function create(): void default: throw new Exception("The file type [{$this->type}] is not supported."); } - } + } /** * Destroy the resource. diff --git a/src/Enums/AlertType.php b/src/Enums/AlertType.php deleted file mode 100644 index 84a6d7bfe..000000000 --- a/src/Enums/AlertType.php +++ /dev/null @@ -1,11 +0,0 @@ -classBasename()->kebab()->value(); - } - - /** - * Get the URI key. - */ - public function getUriKey(): string - { - return $this->getKey(); - } - - /** - * Get the name. - */ - public function getName(): string - { - return __(Str::of(static::class)->classBasename()->headline()->value()); - } - - /** - * Set the query resolver. - */ - public function withQuery(Closure $callback): static - { - $this->queryResolver = $callback; - - return $this; - } - - /** - * Resolve the query for the extract. - */ - public function resolveQuery(Request $request): Builder - { - if (is_null($this->queryResolver)) { - throw new QueryResolutionException(); - } - - return call_user_func_array($this->queryResolver, [$request]); - } - - /** - * Define the filters for the extract. - */ - public function filters(Request $request): array - { - $fields = $this->resolveFields($request)->authorized($request); - - $searchables = $fields->searchable($request); - - $sortables = $fields->sortable($request); - - return array_values(array_filter([ - $searchables->isNotEmpty() ? Search::make($searchables) : null, - $sortables->isNotEmpty() ? Sort::make($sortables) : null, - ])); - } - - /** - * Handle the resolving event on the field instance. - */ - protected function resolveField(Request $request, Field $field): void - { - $field->mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - }); - } - - /** - * Handle the resolving event on the filter instance. - */ - protected function resolveFilter(Request $request, Filter $filter): void - { - $filter->mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - }); - } - - /** - * Handle the resolving event on the action instance. - */ - protected function resolveAction(Request $request, Action $action): void - { - $action->mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - })->withQuery(function (Request $request): Builder { - return $this->resolveFilters($request) - ->authorized($request) - ->apply($request, $this->resolveQuery($request)); - }); - } - - /** - * Handle the resolving event on the widget instance. - */ - protected function resolveWidget(Request $request, Widget $widget): void - { - $widget->mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - }); - } - - /** - * Map the items. - */ - public function mapItems(Request $request): array - { - $query = $this->resolveQuery($request); - - $filters = $this->resolveFilters($request)->authorized($request); - - $items = $filters->apply($request, $query) - ->latest() - ->paginate($request->input('per_page')) - ->withQueryString() - ->setPath($this->getUri()) - ->through(function (Model $model) use ($request): array { - return $request->route('rootResource') - ->newItem($model) - ->toDisplay( - $request, - $this->resolveFields($request)->authorized($request, $model) - ); - }) - ->toArray(); - - return array_merge($items, [ - 'query' => $filters->mapToQuery($request, $query), - ]); - } - - /** - * Register the routes using the given router. - */ - public function registerRoutes(Router $router): void - { - $this->__registerRoutes($router); - - $request = App::make('request'); - - $router->prefix($this->getUriKey())->group(function (Router $router) use ($request): void { - $this->resolveFields($request)->registerRoutes($router); - $this->resolveActions($request)->registerRoutes($router); - $this->resolveWidgets($request)->registerRoutes($router); - }); - } - - /** - * Handle the routes registered event. - */ - public function routesRegistered(Router $router): void - { - App::make(Root::class)->breadcrumbs->pattern($this->getUri(), $this->getName()); - } - - /** - * The routes that should be registered. - */ - public function routes(Router $router): void - { - $router->get('/', ExtractController::class); - } - - /** - * Get the instance as an array. - */ - public function toArray(): array - { - return [ - 'key' => $this->getKey(), - 'name' => $this->getName(), - 'url' => $this->getUri(), - ]; - } - - /** - * Get the index representation of the extract. - */ - public function toIndex(Request $request): array - { - return [ - 'actions' => $this->resolveActions($request) - ->authorized($request) - ->mapToForm($request, $this->resolveQuery($request)->getModel()), - 'filters' => $this->resolveFilters($request) - ->authorized($request) - ->mapToForm($request), - 'items' => $this->mapItems($request), - 'title' => $this->getName(), - 'widgets' => $this->resolveWidgets($request)->authorized($request)->toArray(), - ]; - } -} diff --git a/src/Fields/BelongsToMany.php b/src/Fields/BelongsToMany.php deleted file mode 100644 index 1d92f624a..000000000 --- a/src/Fields/BelongsToMany.php +++ /dev/null @@ -1,61 +0,0 @@ -withPivot($relation->newPivot()->getKeyName()); - } - - /** - * {@inheritdoc} - */ - public function persist(Request $request, Model $model, mixed $value): void - { - $model->saved(function (Model $model) use ($request, $value): void { - $this->resolveHydrate($request, $model, $value); - - $this->getRelation($model)->sync($value); - }); - } - - /** - * {@inheritdoc} - */ - public function resolveHydrate(Request $request, Model $model, mixed $value): void - { - if (is_null($this->hydrateResolver)) { - $this->hydrateResolver = function (Request $request, Model $model, mixed $value): void { - $relation = $this->getRelation($model); - - $results = $this->resolveRelatableQuery($request, $model)->findMany((array) $value); - - $model->setRelation($relation->getRelationName(), $results); - }; - } - - parent::resolveHydrate($request, $model, $value); - } - - /** - * {@inheritdoc} - */ - public function toInput(Request $request, Model $model): array - { - return array_merge(parent::toInput($request, $model), [ - 'multiple' => true, - 'relatedName' => $this->getRelatedName(), - ]); - } -} diff --git a/src/Fields/Boolean.php b/src/Fields/Boolean.php deleted file mode 100644 index 95c6e7e3d..000000000 --- a/src/Fields/Boolean.php +++ /dev/null @@ -1,21 +0,0 @@ -type('checkbox'); - } -} diff --git a/src/Fields/Checkbox.php b/src/Fields/Checkbox.php deleted file mode 100644 index 581e0d02a..000000000 --- a/src/Fields/Checkbox.php +++ /dev/null @@ -1,21 +0,0 @@ -type('checkbox'); - } -} diff --git a/src/Fields/Color.php b/src/Fields/Color.php deleted file mode 100644 index db3809b8f..000000000 --- a/src/Fields/Color.php +++ /dev/null @@ -1,16 +0,0 @@ -type('color'); - } -} diff --git a/src/Fields/Computed.php b/src/Fields/Computed.php deleted file mode 100644 index fbfe9875d..000000000 --- a/src/Fields/Computed.php +++ /dev/null @@ -1,53 +0,0 @@ -value($callback); - } - - /** - * {@inheritdoc} - */ - public function sortable(bool|Closure $value = true): static - { - return $this; - } - - /** - * {@inheritdoc} - */ - public function searchable(bool|Closure $value = true): static - { - return $this; - } - - /** - * {@inheritdoc} - */ - public function persist(Request $request, Model $model, mixed $value): void - { - // - } - - /** - * {@inheritdoc} - */ - public function resolveHydrate(Request $request, Model $model, mixed $value): void - { - // - } -} diff --git a/src/Fields/Date.php b/src/Fields/Date.php deleted file mode 100644 index 9763ce0fd..000000000 --- a/src/Fields/Date.php +++ /dev/null @@ -1,103 +0,0 @@ -type('date'); - } - - /** - * Set the "min" attribute. - */ - public function min(string|DateTimeInterface $value): static - { - return $this->setAttribute('min', (string) $value); - } - - /** - * Set the "max" attribute. - */ - public function max(string|DateTimeInterface $value): static - { - return $this->setAttribute('max', (string) $value); - } - - /** - * Set the with time attribute. - */ - public function withTime(bool $value = true): static - { - $this->format = $value ? 'Y-m-d H:i:s' : 'Y-m-d'; - - $this->withTime = $value; - - return $this; - } - - /** - * Set the timezone. - */ - public function timezone(?string $value = null): static - { - $this->timezone = $value; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function resolveFormat(Request $request, Model $model): mixed - { - if (is_null($this->formatResolver)) { - $this->formatResolver = function (Request $request, Model $model, mixed $value): ?string { - return is_null($value) ? $value : BaseDate::parse($value)->tz($this->timezone)->format($this->format); - }; - } - - return parent::resolveFormat($request, $model); - } - - /** - * Get the input representation of the field. - */ - public function toInput(Request $request, Model $model): array - { - return array_merge(parent::toInput($request, $model), [ - 'with_time' => $this->withTime, - ]); - } -} diff --git a/src/Fields/Editor.php b/src/Fields/Editor.php deleted file mode 100644 index 975f88a7e..000000000 --- a/src/Fields/Editor.php +++ /dev/null @@ -1,132 +0,0 @@ -config = Config::get('root.editor', []); - $this->height('350px'); - } - - /** - * Set the height style attribute. - */ - public function height(string $value): static - { - return $this->setAttribute('style.height', $value); - } - - /** - * Set the configuration. - */ - public function withConfig(Closure $callback): static - { - $this->config = call_user_func_array($callback, [$this->config]); - - return $this; - } - - /** - * Get the editor configuration. - */ - public function getConfig(): array - { - return $this->config; - } - - /** - * Configure the media field. - */ - public function withMedia(?Closure $callback = null): static - { - if (is_null($this->media)) { - $this->media = Media::make(__('Media'), 'media', static function (): MorphToMany { - return new MorphToMany( - Medium::proxy()->newQuery(), - User::proxy(), - 'media', - 'root_media', - 'medium_id', - 'user_id', - 'id', - 'id' - ); - }); - } - - if (! is_null($callback)) { - call_user_func_array($callback, [$this->media]); - } - - return $this; - } - - /** - * Get the media field. - */ - public function getMedia(): ?Media - { - return $this->media; - } - - /** - * Register the routes using the given router. - */ - public function registerRoutes(Router $router): void - { - $this->__registerRoutes($router); - - if (! is_null($this->media)) { - $router->prefix($this->getUriKey())->group(function (Router $router): void { - $this->media->registerRoutes($router); - }); - } - } - - /** - * Get the input representation of the field. - */ - public function toInput(Request $request, Model $model): array - { - return array_merge(parent::toInput($request, $model), [ - 'config' => $this->config, - 'media' => is_null($this->media) ? null : $this->media->toInput($request, $model), - ]); - } -} diff --git a/src/Fields/Field.php b/src/Fields/Field.php deleted file mode 100644 index 691af1b50..000000000 --- a/src/Fields/Field.php +++ /dev/null @@ -1,451 +0,0 @@ - [], - 'create' => [], - 'update' => [], - ]; - - /** - * The Vue component. - */ - protected string $component = 'Input'; - - /** - * The help text for the field. - */ - protected ?string $help = null; - - /** - * Create a new field instance. - */ - public function __construct(string $label, string $name = null) - { - $this->label($label); - $this->name($name ??= Str::of($label)->lower()->snake()->value()); - $this->id($name); - } - - /** - * Get the key. - */ - public function getKey(): string - { - return $this->name; - } - - /** - * Get the URI key. - */ - public function getUriKey(): string - { - return $this->getKey(); - } - - /** - * Get the Vue component. - */ - public function getComponent(): string - { - return $this->component; - } - - /** - * Set the label attribute. - */ - public function label(string|Closure $value): static - { - return $this->setAttribute('label', $value); - } - - /** - * Set the name attribute. - */ - public function name(string|Closure $value): static - { - return $this->setAttribute('name', $value); - } - - /** - * Set the id attribute. - */ - public function id(string|Closure $value): static - { - return $this->setAttribute('id', $value); - } - - /** - * Set the readonly attribute. - */ - public function readonly(bool|Closure $value = true): static - { - return $this->setAttribute('readonly', $value); - } - - /** - * Set the disabled attribute. - */ - public function disabled(bool|Closure $value = true): static - { - return $this->setAttribute('disabled', $value); - } - - /** - * Set the required attribute. - */ - public function required(bool|Closure $value = true): static - { - return $this->setAttribute('required', $value); - } - - /** - * Set the type attribute. - */ - public function type(string|Closure $value): static - { - return $this->setAttribute('type', $value); - } - - /** - * Set the placeholder attribute. - */ - public function placeholder(string|Closure $value): static - { - return $this->setAttribute('placeholder', $value); - } - - /** - * Set the sortable attribute. - */ - public function sortable(bool|Closure $value = true): static - { - $this->sortable = $value; - - return $this; - } - - /** - * Determine if the field is sortable. - */ - public function isSortable(Request $request): bool - { - if ($this->sortable instanceof Closure) { - return call_user_func_array($this->sortable, [$request]); - } - - return $this->sortable; - } - - /** - * Set the searachable attribute. - */ - public function searchable(bool|Closure $value = true): static - { - $this->searchable = $value; - - return $this; - } - - /** - * Determine if the field is searchable. - */ - public function isSearchable(Request $request): bool - { - if ($this->searchable instanceof Closure) { - return call_user_func_array($this->searchable, [$request]); - } - - return $this->searchable; - } - - /** - * Set the help attribute. - */ - public function help(?string $value = null): static - { - $this->help = $value; - - return $this; - } - - /** - * Set the value resolver. - */ - public function value(Closure $callback): static - { - $this->valueResolver = $callback; - - return $this; - } - - /** - * Resolve the value. - */ - public function resolveValue(Request $request, Model $model): mixed - { - $value = $this->getValue($request, $model); - - if (is_null($this->valueResolver)) { - return $value; - } - - return call_user_func_array($this->valueResolver, [$request, $model, $value]); - } - - /** - * Get the default value from the model. - */ - public function getValue(Request $request, Model $model): mixed - { - return $model->getAttribute($this->getKey()); - } - - /** - * Set the format resolver. - */ - public function format(Closure $callback): static - { - $this->formatResolver = $callback; - - return $this; - } - - /** - * Format the value. - */ - public function resolveFormat(Request $request, Model $model): mixed - { - $value = $this->resolveValue($request, $model); - - if (is_null($this->formatResolver)) { - return $value; - } - - return call_user_func_array($this->formatResolver, [$request, $model, $value]); - } - - /** - * Persist the request value on the model. - */ - public function persist(Request $request, Model $model, mixed $value): void - { - $model->saving(function (Model $model) use ($request, $value): void { - $this->resolveHydrate($request, $model, $value); - }); - } - - /** - * Get the value for hydrating the model. - */ - public function getValueForHydrate(Request $request, Model $model): mixed - { - return $request->input([$this->getKey()]); - } - - /** - * Set the hydrate resolver. - */ - public function hydrate(Closure $callback): static - { - $this->hydrateResolver = $callback; - - return $this; - } - - /** - * Hydrate the model. - */ - public function resolveHydrate(Request $request, Model $model, mixed $value): void - { - if (is_null($this->hydrateResolver)) { - $this->hydrateResolver = function () use ($model, $value): void { - $model->setAttribute($this->getKey(), $value); - }; - } - - call_user_func_array($this->hydrateResolver, [$request, $model, $value]); - } - - /** - * Set the validation rules. - */ - public function rules(array|Closure $rules, string $context = '*'): static - { - $this->rules[$context] = $rules; - - return $this; - } - - /** - * Set the create validation rules. - */ - public function createRules(array|Closure $rules): static - { - return $this->rules($rules, 'create'); - } - - /** - * Set the update validation rules. - */ - public function updateRules(array|Closure $rules): static - { - return $this->rules($rules, 'update'); - } - - /** - * Resolve the attributes. - */ - public function resolveAttributes(Request $request, Model $model): array - { - return array_reduce( - array_keys($this->attributes), - function (array $attributes, string $key) use ($request, $model): mixed { - return array_merge($attributes, [$key => $this->resolveAttribute($request, $model, $key)]); - }, - [] - ); - } - - /** - * Resolve the given attribute. - */ - public function resolveAttribute(Request $request, Model $model, string $key): mixed - { - $value = $this->getAttribute($key); - - return $value instanceof Closure - ? call_user_func_array($value, [$request, $model]) - : $value; - } - - /** - * Get the instance as an array. - */ - public function toArray(): array - { - return $this->getAttributes(); - } - - /** - * Get the display representation of the field. - */ - public function toDisplay(Request $request, Model $model): array - { - return array_merge($this->resolveAttributes($request, $model), [ - 'formattedValue' => $this->resolveFormat($request, $model), - 'searchable' => $this->isSearchable($request), - 'sortable' => $this->isSortable($request), - 'value' => $this->resolveValue($request, $model), - ]); - } - - /** - * Get the input representation of the field. - */ - public function toInput(Request $request, Model $model): array - { - return array_merge($this->resolveAttributes($request, $model), [ - 'component' => $this->getComponent(), - 'formattedValue' => $this->resolveFormat($request, $model), - 'help' => $this->help, - 'value' => $this->resolveValue($request, $model), - ]); - } - - /** - * Get the validation representation of the field. - */ - public function toValidate(Request $request, Model $model): array - { - $key = $model->exists ? 'update' : 'create'; - - $rules = array_map( - static function (array|Closure $rule) use ($request, $model): array { - return is_array($rule) ? $rule : call_user_func_array($rule, [$request, $model]); - }, - Arr::only($this->rules, array_unique(['*', $key])) - ); - - return [$this->getKey() => Arr::flatten($rules, 1)]; - } - - /** - * Set the given attribute. - */ - public function __set(string $key, mixed $value): void - { - $this->setAttribute($key, $value); - } - - /** - * Get the given attribute. - */ - public function __get(string $key): mixed - { - return $this->getAttribute($key); - } - - /** - * Determine if the given attribute exists. - */ - public function __isset(string $key): bool - { - return $this->hasAttribute($key); - } - - /** - * Remove the given attribute. - */ - public function __unset(string $key): void - { - $this->removeAttribute($key); - } -} diff --git a/src/Fields/Fieldset.php b/src/Fields/Fieldset.php deleted file mode 100644 index 11d037cd0..000000000 --- a/src/Fields/Fieldset.php +++ /dev/null @@ -1,106 +0,0 @@ -mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - }); - } - - /** - * Register the routes using the given router. - */ - public function registerRoutes(Router $router): void - { - $request = App::make('request'); - - $router->prefix($this->getUriKey())->group(function (Router $router) use ($request): void { - $this->resolveFields($request)->registerRoutes($router); - }); - } - - /** - * {@inheritdoc} - */ - public function persist(Request $request, Model $model, mixed $value): void - { - $this->resolveFields($request) - ->authorized($request, $model) - ->each(static function (Field $field) use ($request, $model, $value): void { - $field->persist($request, $model, $value[$field->getKey()] ?? null); - }); - } - - /** - * {@inheritdoc} - */ - public function resolveHydrate(Request $request, Model $model, mixed $value): void - { - $this->resolveFields($request) - ->authorized($request, $model) - ->each(static function (Field $field) use ($request, $model, $value): void { - $field->resolveHydrate($request, $model, $value[$field->getKey()] ?? null); - }); - } - - /** - * {@inheritdoc} - */ - public function toInput(Request $request, Model $model): array - { - $fields = $this->resolveFields($request) - ->authorized($request, $model) - ->mapToForm($request, $model); - - return array_replace_recursive(parent::toInput($request, $model), [ - 'fields' => $fields, - 'formattedValue' => array_column($fields, 'formattedValue', 'name'), - 'value' => array_column($fields, 'value', 'name'), - ]); - } - - /** - * {@inheritdoc} - */ - public function toValidate(Request $request, Model $model): array - { - $rules = $this->resolveFields($request) - ->authorized($request, $model) - ->mapToValidate($request, $model); - - return array_merge( - parent::toValidate($request, $model), - Collection::make($rules) - ->mapWithKeys(function (array $rules, string $key): array { - return [sprintf('%s.%s', $this->getKey(), $key) => $rules]; - }) - ->toArray(), - ); - } -} diff --git a/src/Fields/HasMany.php b/src/Fields/HasMany.php deleted file mode 100644 index 27796e78d..000000000 --- a/src/Fields/HasMany.php +++ /dev/null @@ -1,36 +0,0 @@ - true, - ]); - } -} diff --git a/src/Fields/HasOne.php b/src/Fields/HasOne.php deleted file mode 100644 index cd071702f..000000000 --- a/src/Fields/HasOne.php +++ /dev/null @@ -1,17 +0,0 @@ -type('hidden'); - } -} diff --git a/src/Fields/ID.php b/src/Fields/ID.php deleted file mode 100644 index 02047cee6..000000000 --- a/src/Fields/ID.php +++ /dev/null @@ -1,37 +0,0 @@ -uuid = $value; - - return $this; - } - - /** - * Determine if the field is UUID. - */ - public function isUuid(): bool - { - return $this->uuid; - } -} diff --git a/src/Fields/Json.php b/src/Fields/Json.php deleted file mode 100644 index 5b97764b3..000000000 --- a/src/Fields/Json.php +++ /dev/null @@ -1,92 +0,0 @@ -mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - }); - } - - /** - * Register the routes using the given router. - */ - public function registerRoutes(Router $router): void - { - $this->__registerRoutes($router); - - $request = App::make('request'); - - $router->prefix($this->getUriKey())->group(function (Router $router) use ($request): void { - $this->resolveFields($request)->registerRoutes($router); - }); - } - - /** - * {@inheritdoc} - */ - public function toInput(Request $request, Model $model): array - { - $data = parent::toInput($request, $model); - - $data['value'] = (array) $data['value']; - - $json = FieldsetModel::make() - ->setRelation('parent', $model) - ->forceFill($data['value']); - - $fields = $this->resolveFields($request) - ->authorized($request, $model) - ->mapToForm($request, $json); - - return array_replace_recursive($data, [ - 'fields' => $fields, - 'formattedValue' => array_column($fields, 'formattedValue', 'name'), - 'value' => array_column($fields, 'value', 'name'), - ]); - } - - /** - * Get the validation representation of the field. - */ - public function toValidate(Request $request, Model $model): array - { - $rules = $this->resolveFields($request) - ->authorized($request, $model) - ->mapToValidate($request, $model); - - return array_merge( - parent::toValidate($request, $model), - Collection::make($rules) - ->mapWithKeys(function (array $rules, string $key): array { - return [sprintf('%s.%s', $this->getKey(), $key) => $rules]; - }) - ->toArray(), - ); - } -} diff --git a/src/Fields/Media.php b/src/Fields/Media.php deleted file mode 100644 index 3bec3b701..000000000 --- a/src/Fields/Media.php +++ /dev/null @@ -1,302 +0,0 @@ -multiple = $value; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function searchable(bool|Closure $value = true, array $columns = ['id']): static - { - $this->searchableColumns = $columns; - - return parent::searchable(false); - } - - /** - * Set the storing resolver callback. - */ - public function storeUsing(Closure $callback): static - { - $this->storingResolver = $callback; - - return $this; - } - - /** - * Store the file using the given path and request. - */ - public function store(Request $request, string $path): Medium - { - $medium = (Medium::proxy())::makeFrom($path); - - if (! is_null($this->storingResolver)) { - call_user_func_array($this->storingResolver, [$request, $medium, $path]); - } - - $request->user()->uploads()->save($medium); - - return $medium; - } - - /** - * {@inheritdoc} - */ - public function persist(Request $request, Model $model, mixed $value): void - { - $model->saved(function (Model $model) use ($request, $value): void { - $this->resolveHydrate($request, $model, $value); - - $this->getRelation($model)->sync($value); - }); - } - - /** - * {@inheritdoc} - */ - public function resolveHydrate(Request $request, Model $model, mixed $value): void - { - if (is_null($this->hydrateResolver)) { - $this->hydrateResolver = function (Request $request, Model $model, mixed $value): void { - $relation = $this->getRelation($model); - - $results = $this->resolveRelatableQuery($request, $model) - ->findMany(array_keys($value)) - ->each(static function (Model $related) use ($relation, $value): void { - $related->setRelation( - $relation->getPivotAccessor(), - $relation->newPivot($value[$related->getKey()]) - ); - }); - - $model->setRelation($relation->getRelationName(), $results); - }; - } - - parent::resolveHydrate($request, $model, $value); - } - - /** - * {@inheritdoc} - */ - public function fields(Request $request): array - { - return []; - } - - /** - * {@inheritdoc} - */ - public function filters(Request $request): array - { - $fields = new Fields(array_map(static function (string $column): Field { - return new Text($column, $column); - }, $this->getSearchableColumns())); - - return array_values(array_filter([ - $fields->isNotEmpty() ? Search::make($fields) : null, - ])); - } - - /** - * {@inheritdoc} - */ - public function resolveOptions(Request $request, Model $model): array - { - return []; - } - - /** - * {@inheritdoc} - */ - public function resolveValue(Request $request, Model $model): mixed - { - if (is_null($this->valueResolver)) { - $this->valueResolver = function (Request $request, Model $model, mixed $value): array { - return $value->mapWithKeys(function (Model $related) use ($request, $model): array { - return [ - $related->getKey() => $this->mapPivotValues($request, $model, $related), - ]; - })->toArray(); - }; - } - - return parent::resolveValue($request, $model); - } - - /** - * Map the pivot values. - */ - protected function mapPivotValues(Request $request, Model $model, Model $related): array - { - $relation = $this->getRelation($model); - - return $this->resolveFields($request) - ->authorized($request, $related) - ->mapWithKeys(static function (Field $field) use ($request, $related, $relation): array { - return [ - $field->name => $field->resolveValue( - $request, $related->getRelation($relation->getPivotAccessor()) - ), - ]; - }) - ->toArray(); - } - - /** - * {@inheritdoc} - */ - public function mapOption(Request $request, Model $model, Model $related): array - { - $relation = $this->getRelation($model); - - $pivot = $related->relationLoaded($relation->getPivotAccessor()) - ? $related->getRelation($relation->getPivotAccessor()) - : $relation->newPivot(); - - return array_merge( - parent::mapOption($request, $model, $related), - $related->append(['dimensions', 'formatted_size'])->toArray(), - [ - 'fields' => $this->resolveFields($request) - ->authorized($request, $related) - ->mapToForm($request, $pivot), - 'formatted_created_at' => $related->created_at->format('Y-m-d H:i'), - ], - ); - } - - /** - * Map the items. - */ - public function mapItems(Request $request, Model $model): array - { - $filters = $this->resolveFilters($request)->authorized($request); - - $query = $this->resolveRelatableQuery($request, $model); - - $items = $filters->apply($request, $query) - ->latest() - ->paginate($request->input('per_page')) - ->withQueryString() - ->setPath($this->replaceRoutePlaceholders($request->route())) - ->through(function (Model $related) use ($request, $model): array { - return $this->mapOption($request, $model, $related); - }) - ->toArray(); - - return array_merge($items, [ - 'query' => $filters->mapToQuery($request, $this->resolveRelatableQuery($request, $model)), - ]); - } - - /** - * {@inheritdoc} - */ - public function routes(Router $router): void - { - $router->get('/', [MediaController::class, 'index']); - $router->post('/', [MediaController::class, 'store']); - $router->delete('/', [MediaController::class, 'destroy']); - } - - /** - * {@inheritdoc} - */ - public function toInput(Request $request, Model $model): array - { - $relation = $this->getRelation($model); - - $models = $this->getValue($request, $model); - - return array_merge(parent::toInput($request, $model), [ - 'fields' => $models->mapWithKeys(function (Model $related) use ($request, $relation): array { - return [ - $related->getKey() => $this->resolveFields($request) - ->authorized($request, $related) - ->mapToForm($request, $related->getRelation($relation->getPivotAccessor())), - ]; - }), - 'filters' => $this->resolveFilters($request)->authorized($request)->mapToForm($request), - 'multiple' => $this->multiple, - ]); - } - - /** - * {@inheritdoc} - */ - public function toValidate(Request $request, Model $model): array - { - $pivotRules = $this->resolveFields($request) - ->authorized($request, $model) - ->mapToValidate($request, $model); - - return array_merge( - parent::toValidate($request, $model), - Collection::make($pivotRules) - ->mapWithKeys(function (array $rules, string $key): array { - return [sprintf('%s.*.%s', $this->name, $key) => $rules]; - }) - ->toArray(), - ); - } -} diff --git a/src/Fields/MorphMany.php b/src/Fields/MorphMany.php deleted file mode 100644 index 2fa0385e2..000000000 --- a/src/Fields/MorphMany.php +++ /dev/null @@ -1,17 +0,0 @@ - true, - ]); - } -} diff --git a/src/Fields/MorphTo.php b/src/Fields/MorphTo.php deleted file mode 100644 index 36a155e6d..000000000 --- a/src/Fields/MorphTo.php +++ /dev/null @@ -1,17 +0,0 @@ -setAttributes([ - 'formattedValue' => $label, - 'value' => $value, - ]); - } - - /** - * Set the label attribute. - */ - public function label(string $value): static - { - return $this->setAttribute('label', $value); - } - - /** - * Set the disabled attribute. - */ - public function disabled(bool $value = true): static - { - return $this->setAttribute('disabled', $value); - } - - /** - * Get the instance as an array. - */ - public function toArray(): array - { - return $this->getAttributes(); - } -} diff --git a/src/Fields/Radio.php b/src/Fields/Radio.php deleted file mode 100644 index 2885b0532..000000000 --- a/src/Fields/Radio.php +++ /dev/null @@ -1,21 +0,0 @@ -type('radio'); - } -} diff --git a/src/Fields/Range.php b/src/Fields/Range.php deleted file mode 100644 index 97f238238..000000000 --- a/src/Fields/Range.php +++ /dev/null @@ -1,21 +0,0 @@ -type('range')->step(1)->min(0)->max(100); - } -} diff --git a/src/Fields/Relation.php b/src/Fields/Relation.php deleted file mode 100644 index 3db18ea69..000000000 --- a/src/Fields/Relation.php +++ /dev/null @@ -1,394 +0,0 @@ -relation = $relation ?: $this->name; - } - - /** - * Add a new scope for the relation query. - */ - public static function scopeQuery(Closure $callback): void - { - static::$scopes[static::class][] = $callback; - } - - /** - * Get the relation instance. - */ - public function getRelation(Model $model): EloquentRelation - { - if ($this->relation instanceof Closure) { - return call_user_func_array($this->relation, [$model]); - } - - return call_user_func([$model, $this->relation]); - } - - /** - * Get the related model name. - */ - public function getRelatedName(): string - { - return __(Str::of($this->name)->singular()->headline()->value()); - } - - /** - * Get the relation name. - */ - public function getRelationName(): string - { - return $this->relation instanceof Closure - ? $this->name - : $this->relation; - } - - /** - * Get the route key name. - */ - public function getRouteKeyName(): string - { - return Str::of($this->getKey())->singular()->prepend('field_')->value(); - } - - /** - * Set the nullable attribute. - */ - public function nullable(bool $value = true): static - { - $this->nullable = $value; - - return $this; - } - - /** - * Determine if the field is nullable. - */ - public function isNullable(): bool - { - return $this->nullable; - } - - /** - * Set the searachable attribute. - */ - public function searchable(bool|Closure $value = true, array $columns = ['id']): static - { - $this->searchableColumns = $columns; - - return parent::searchable($value); - } - - /** - * Get the searchable columns. - */ - public function getSearchableColumns(): array - { - return $this->searchableColumns; - } - - /** - * Set the sortable attribute. - */ - public function sortable(bool|Closure $value = true, string $column = 'id'): static - { - $this->sortableColumn = $column; - - return parent::sortable($value); - } - - /** - * Get the sortable columns. - */ - public function getSortableColumn(): string - { - return $this->sortableColumn; - } - - /** - * Set the display resolver. - */ - public function display(Closure|string $callback): static - { - if (is_string($callback)) { - $callback = static function (Request $request, Model $model) use ($callback) { - return $model->getAttribute($callback); - }; - } - - $this->displayResolver = $callback; - - return $this; - } - - /** - * Resolve the display format or the query result. - */ - public function resolveDisplay(Request $request, Model $related): mixed - { - if (is_null($this->displayResolver)) { - $this->display($related->getKeyName()); - } - - return call_user_func_array($this->displayResolver, [$request, $related]); - } - - /** - * Set the async attribute. - */ - public function async(bool $value = true): static - { - $this->async = $value; - - $this->component = $value ? 'AsyncSelect' : 'Select'; - - return $this; - } - - /** - * Determine if the field is asnyc. - */ - public function isAsync(): bool - { - return $this->async; - } - - /** - * {@inheritdoc} - */ - public function resolveValue(Request $request, Model $model): mixed - { - if (is_null($this->valueResolver)) { - $this->valueResolver = static function (Request $request, Model $model, mixed $value): mixed { - if ($value instanceof Model) { - return $value->getKey(); - } elseif ($value instanceof Collection) { - return $value->map->getKey()->toArray(); - } - - return $value; - }; - } - - return parent::resolveValue($request, $model); - } - - /** - * {@inheritdoc} - */ - public function getValue(Request $request, Model $model): mixed - { - $name = $this->getRelationName(); - - if ($this->relation instanceof Closure && ! $model->relationLoaded($name)) { - $model->setRelation($name, call_user_func_array($this->relation, [$model])->getResults()); - } - - return $model->getAttribute($name); - } - - /** - * {@inheritdoc} - */ - public function resolveFormat(Request $request, Model $model): mixed - { - if (is_null($this->formatResolver)) { - $this->formatResolver = function (Request $request, Model $model): mixed { - $default = $this->getValue($request, $model); - - if ($default instanceof Model) { - return $this->resolveDisplay($request, $default); - } elseif ($default instanceof Collection) { - $value = $default->map(function (Model $related) use ($request): mixed { - return $this->resolveDisplay($request, $related); - }); - - return $this->isAsync() ? $value->toArray() : $value->join(', '); - } - - return $default; - }; - } - - return parent::resolveFormat($request, $model); - } - - /** - * Set the query resolver. - */ - public function withRelatableQuery(Closure $callback): static - { - $this->queryResolver = $callback; - - return $this; - } - - /** - * Resolve the related model's eloquent query. - */ - public function resolveRelatableQuery(Request $request, Model $model): Builder - { - $query = $this->getRelation($model)->getRelated()->newQuery(); - - foreach (static::$scopes[static::class] ?? [] as $scope) { - $query = call_user_func_array($scope, [$request, $query, $model]); - } - - if (! is_null($this->queryResolver)) { - $query = call_user_func_array($this->queryResolver, [$request, $query, $model]); - } - - return $query; - } - - /** - * Set the group resolver attribute. - */ - public function groupOptionsBy(string|Closure $key): static - { - $this->groupResolver = $key; - - return $this; - } - - /** - * Resolve the options for the field. - */ - public function resolveOptions(Request $request, Model $model): array - { - return $this->resolveRelatableQuery($request, $model) - ->get() - ->when(! is_null($this->groupResolver), function (Collection $collection) use ($request, $model): Collection { - return $collection->groupBy($this->groupResolver)->map(function ($group, $key) use ($request, $model): OptGroup { - $options = $group->map(function (Model $related) use ($request, $model): array { - return $this->mapOption($request, $model, $related); - }); - - return (new OptGroup($key))->options($options->toArray()); - }); - }, function (Collection $collection) use ($request, $model): Collection { - return $collection->map(function (Model $related) use ($request, $model): array { - return $this->mapOption($request, $model, $related); - }); - }) - ->toArray(); - } - - /** - * Map the given option. - */ - public function mapOption(Request $request, Model $model, Model $related): array - { - return [ - 'value' => $related->getKey(), - 'formattedValue' => $this->resolveDisplay($request, $related), - ]; - } - - /** - * Get the route parameter name. - */ - public function getParameterName(): string - { - return 'rootField'; - } - - /** - * The routes that should be registered. - */ - public function routes(Router $router): void - { - if ($this->isAsync()) { - $router->get('/', RelationFieldController::class); - } - } - - /** - * {@inheritdoc} - */ - public function toInput(Request $request, Model $model): array - { - return array_merge(parent::toInput($request, $model), [ - 'async' => $this->isAsync(), - 'nullable' => $this->isNullable(), - 'options' => $this->isAsync() ? [] : $this->resolveOptions($request, $model), - 'url' => $this->isAsync() ? $this->replaceRoutePlaceholders($request->route()) : null, - 'selection' => $this->isAsync() ? $this->getValue($request, $model)->map(function (Model $related) use ($request, $model): array { - return $this->mapOption($request, $model, $related); - })->toArray() : [], - ]); - } -} diff --git a/src/Fields/Select.php b/src/Fields/Select.php deleted file mode 100644 index 68395d054..000000000 --- a/src/Fields/Select.php +++ /dev/null @@ -1,130 +0,0 @@ -nullable = $value; - - return $this; - } - - /** - * Determine if the field is nullable. - */ - public function isNullable(): bool - { - return $this->nullable; - } - - /** - * Set the multiple attribute. - */ - public function multiple(bool $value = true): static - { - return $this->setAttribute('multiple', $value); - } - - /** - * Set the size attribute. - */ - public function size(int $value): static - { - return $this->setAttribute('size', $value); - } - - /** - * Set the options attribute. - */ - public function options(array|Closure $value): static - { - if (is_array($value)) { - $value = static function () use ($value): array { - return $value; - }; - } - - $this->optionsResolver = $value; - - return $this; - } - - /** - * Resolve the options for the field. - */ - public function resolveOptions(Request $request, Model $model): array - { - if (is_null($this->optionsResolver)) { - return []; - } - - $options = call_user_func_array($this->optionsResolver, [$request, $model]); - - return array_map(static function (mixed $formattedValue, int|string $value): array { - return $formattedValue instanceof Option - ? $formattedValue->toArray() - : ['value' => $value, 'formattedValue' => $formattedValue]; - }, $options, array_keys($options)); - } - - /** - * Format the value. - */ - public function resolveFormat(Request $request, Model $model): mixed - { - if (is_null($this->formatResolver)) { - $this->formatResolver = function (Request $request, Model $model, mixed $value): mixed { - $options = array_column( - $this->resolveOptions($request, $model), 'formattedValue', 'value' - ); - - $value = array_map(static function (mixed $value) use ($options): mixed { - $value = $value instanceof UnitEnum ? $value->value : $value; - - return $options[$value] ?? $value; - }, Arr::wrap($value)); - - return implode(', ', $value); - }; - } - - return parent::resolveFormat($request, $model); - } - - /** - * {@inheritdoc} - */ - public function toInput(Request $request, Model $model): array - { - return array_merge(parent::toInput($request, $model), [ - 'nullable' => $this->isNullable(), - 'options' => $this->resolveOptions($request, $model), - ]); - } -} diff --git a/src/Fields/Tag.php b/src/Fields/Tag.php deleted file mode 100644 index e4a1ee26f..000000000 --- a/src/Fields/Tag.php +++ /dev/null @@ -1,30 +0,0 @@ -formatResolver)) { - $this->formatResolver = function (Request $request, Model $model): mixed { - $default = $this->getValue($request, $model); - - return implode(', ', (array) $default); - }; - } - - return parent::resolveFormat($request, $model); - } -} diff --git a/src/Filters/Filter.php b/src/Filters/Filter.php deleted file mode 100644 index c30e4d9cb..000000000 --- a/src/Filters/Filter.php +++ /dev/null @@ -1,133 +0,0 @@ -classBasename()->kebab()->value(); - } - - /** - * Get the name. - */ - public function getName(): string - { - return __(Str::of(static::class)->classBasename()->headline()->value()); - } - - /** - * Get the Vue component. - */ - public function getComponent(): ?string - { - return $this->component; - } - - /** - * The default value of the filter. - */ - public function default(Request $request): mixed - { - $default = $request->query($this->getKey()); - - return $this->multiple ? Arr::wrap($default) : $default; - } - - /** - * Determine if the filter is active. - */ - public function active(Request $request): bool - { - return ! empty($request->query($this->getKey())); - } - - /** - * Determine if the filter is functional. - */ - public function functional(): bool - { - return is_null($this->getComponent()); - } - - /** - * Get the filter options. - */ - public function options(Request $request): array - { - return []; - } - - /** - * Set the multiple attribute. - */ - public function multiple(bool $value = true): static - { - $this->multiple = $value; - - return $this; - } - - /** - * Get the instance as an array. - */ - public function toArray(): array - { - return [ - 'key' => $this->getKey(), - 'name' => $this->getName(), - 'component' => $this->getComponent(), - ]; - } - - /** - * Get the input representation of the filter. - */ - public function toInput(Request $request): array - { - $options = $this->options($request); - - return array_merge($this->toArray(), [ - 'active' => $this->active($request), - 'default' => $this->default($request), - 'nullable' => true, - 'multiple' => $this->multiple, - 'options' => array_map(static function (mixed $value, mixed $key): array { - return [ - 'value' => $key, - 'formattedValue' => $value, - ]; - }, $options, array_keys($options)), - ]); - } -} diff --git a/src/Filters/Search.php b/src/Filters/Search.php deleted file mode 100644 index b9d487a80..000000000 --- a/src/Filters/Search.php +++ /dev/null @@ -1,84 +0,0 @@ -fields = $fields; - } - - /** - * Apply the filter on the query. - */ - public function apply(Request $request, Builder $query, mixed $value): Builder - { - $attributes = $this->mapColumns(); - - if (empty($value) || empty($attributes)) { - return $query; - } - - return $query->where(static function (Builder $query) use ($attributes, $value): void { - foreach ($attributes as $attribute => $columns) { - $boolean = array_key_first($attributes) === $attribute ? 'and' : 'or'; - - if (is_array($columns)) { - $query->has($attribute, '>=', 1, $boolean, static function (Builder $query) use ($columns, $value): Builder { - foreach ($columns as $column) { - $boolean = $columns[0] === $column ? 'and' : 'or'; - - $query->where($query->qualifyColumn($column), 'like', "%{$value}%", $boolean); - } - - return $query; - }); - } else { - $query->where($query->qualifyColumn($attribute), 'like', "%{$value}%", $boolean); - } - } - }); - } - - /** - * Map the searchable columns. - */ - protected function mapColumns(): array - { - return $this->fields->mapWithKeys(static function (Field $field): array { - return [ - $field->getKey() => $field instanceof Relation ? $field->getSearchableColumns() : null, - ]; - })->toArray(); - } - - /** - * {@inheritdoc} - */ - public function toInput(Request $request): array - { - return array_merge(parent::toInput($request), [ - 'debounce' => 1000, - ]); - } -} diff --git a/src/Filters/Sort.php b/src/Filters/Sort.php deleted file mode 100644 index 720b305f8..000000000 --- a/src/Filters/Sort.php +++ /dev/null @@ -1,94 +0,0 @@ -fields = $fields; - } - - /** - * Apply the filter on the query. - */ - public function apply(Request $request, Builder $query, mixed $value): Builder - { - $value = array_replace(['by' => 'id', 'order' => 'desc'], (array) $value); - - $columns = $this->mapColumns(); - - if (! array_key_exists($value['by'], $columns)) { - return $query; - } - - if ($value['by'] === 'id') { - $value['by'] = $query->getModel()->getKeyName(); - } - - if (is_null($columns[$value['by']])) { - return $query->orderBy($query->qualifyColumn($value['by']), $value['order']); - } - - $relation = EloquentRelation::noConstraints(static function () use ($query, $value): EloquentRelation { - $relation = call_user_func([$query->getModel(), $value['by']]); - - $key = $relation instanceof BelongsTo - ? $relation->getQualifiedOwnerKeyName() - : $relation->getQualifiedParentKeyName(); - - return $relation->whereColumn($relation->getQualifiedForeignKeyName(), '=', $key); - }); - - return $query->orderBy( - $relation->getQuery()->select($relation->qualifyColumn($columns[$value['by']])), $value['order'] - ); - } - - /** - * The default value of the filter. - */ - public function default(Request $request): mixed - { - return [ - 'by' => $request->query('sort.by', Model::CREATED_AT), - 'order' => $request->query('sort.order', 'desc'), - ]; - } - - /** - * Map the sortable columns. - */ - protected function mapColumns(): array - { - return $this->fields->mapWithKeys(static function (Field $field): array { - return [ - $field->getKey() => $field instanceof Relation ? $field->getSortableColumn() : null, - ]; - })->toArray(); - } -} diff --git a/src/Fields/BelongsTo.php b/src/Form/Fields/BelongsTo.php similarity index 57% rename from src/Fields/BelongsTo.php rename to src/Form/Fields/BelongsTo.php index 4fd871e0e..3d2bde028 100644 --- a/src/Fields/BelongsTo.php +++ b/src/Form/Fields/BelongsTo.php @@ -1,6 +1,6 @@ hydrateResolver)) { $this->hydrateResolver = function (Request $request, Model $model, mixed $value): void { - $this->getRelation($model)->associate($value); + $this->getRelation()->associate($value); }; } - parent::resolveHydrate($request, $model, $value); + parent::resolveHydrate($request, $value); } } diff --git a/src/Form/Fields/BelongsToMany.php b/src/Form/Fields/BelongsToMany.php new file mode 100644 index 000000000..f4543c189 --- /dev/null +++ b/src/Form/Fields/BelongsToMany.php @@ -0,0 +1,180 @@ +setAttribute('multiple', true); + } + + /** + * {@inheritdoc} + */ + public function getRelation(): EloquentRelation + { + $relation = parent::getRelation(); + + return $relation->withPivot($relation->newPivot()->getKeyName()); + } + + /** + * Create a new fields collection. + */ + public function newFieldsCollection(): Fields + { + return new Fields($this->form); + } + + /** + * Handle the callback for the field resolution. + */ + protected function resolveField(Request $request, Field $field): void + { + if (! is_null($this->apiUri)) { + $field->setApiUri(sprintf('%s/%s', $this->apiUri, $field->getUriKey())); + } + + $field->setModelAttribute( + sprintf('%s.*.%s', $this->getModelAttribute(), $field->getModelAttribute()) + ); + } + + /** + * Set the pivot field resolver. + */ + public function withPivotFields(Closure $callback): static + { + $this->withFields($callback); + + $this->pivotFieldsResolver = function (Model $related) use ($callback): Fields { + $fields = new Fields($this->form); + + App::call(static function (Request $request) use ($callback, $fields): void { + call_user_func_array($callback, [$request, $fields]); + }); + + $fields->each(function (Field $field) use ($related): void { + $attribute = sprintf( + '%s.%s.%s', + $this->getModelAttribute(), + $related->getKey(), + $key = $field->getModelAttribute() + ); + + $field->setModelAttribute($attribute) + ->name($attribute) + ->id($attribute) + ->value(function () use ($related, $key): mixed { + return $related->getRelation($this->getRelation()->getPivotAccessor())->getAttribute($key); + }); + }); + + return $fields; + }; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function toOption(Model $related): RelationOption + { + $relation = $this->getRelation(); + + if (! $related->relationLoaded($relation->getPivotAccessor())) { + $related->setRelation($relation->getPivotAccessor(), $relation->newPivot()); + } + + $option = parent::toOption($related); + + if (! is_null($this->pivotFieldsResolver)) { + $option->withPivotFields(call_user_func_array($this->pivotFieldsResolver, [$related])); + } + + return $option; + } + + /** + * {@inheritdoc} + */ + public function persist(Request $request, mixed $value): void + { + $this->getModel()->saved(function () use ($request, $value): void { + $this->resolveHydrate($request, $value); + + $this->getRelation()->sync($value); + }); + } + + /** + * {@inheritdoc} + */ + public function resolveHydrate(Request $request, mixed $value): void + { + if (is_null($this->hydrateResolver)) { + $this->hydrateResolver = function (Request $request, Model $model, mixed $value): void { + $value = (array) $value; + + $relation = $this->getRelation(); + + $results = $this->resolveRelatableQuery($request) + ->findMany(array_keys($value)) + ->each(static function (Model $related) use ($relation, $value): void { + $related->setRelation( + $relation->getPivotAccessor(), + $relation->newPivot($value[$related->getKey()]) + ); + }); + + $model->setRelation($relation->getRelationName(), $results); + }; + } + + parent::resolveHydrate($request, $value); + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + return array_merge(parent::toArray(), [ + 'relatedName' => $this->getRelatedName(), + ]); + } + + /** + * {@inheritdoc} + */ + public function toValidate(Request $request): array + { + return array_merge( + parent::toValidate($request), + $this->resolveFields($request)->mapToValidate($request) + ); + } +} diff --git a/src/Form/Fields/Boolean.php b/src/Form/Fields/Boolean.php new file mode 100644 index 000000000..7ef5fc889 --- /dev/null +++ b/src/Form/Fields/Boolean.php @@ -0,0 +1,54 @@ +type('checkbox'); + } + + /** + * {@inheritdoc} + */ + public function getValueForHydrate(Request $request): mixed + { + return $request->boolean([$this->getRequestKey()]); + } + + /** + * Set the "checked" HTML attribute. + */ + public function checked(bool $value = true): static + { + $this->setAttribute('checked', $value); + + return $this; + } + + /** + * Create a new method. + */ + public function resolveValue(Request $request): mixed + { + $value = parent::resolveValue($request); + + $this->checked(filter_var($value, FILTER_VALIDATE_BOOL)); + + return $value; + } +} diff --git a/src/Form/Fields/Checkbox.php b/src/Form/Fields/Checkbox.php new file mode 100644 index 000000000..b1774daea --- /dev/null +++ b/src/Form/Fields/Checkbox.php @@ -0,0 +1,21 @@ +name(sprintf('%s[]', $this->getModelAttribute())); + } +} diff --git a/src/Form/Fields/Color.php b/src/Form/Fields/Color.php new file mode 100644 index 000000000..829086d4a --- /dev/null +++ b/src/Form/Fields/Color.php @@ -0,0 +1,18 @@ +type('color'); + } +} diff --git a/src/Form/Fields/Date.php b/src/Form/Fields/Date.php new file mode 100644 index 000000000..67c0e8b64 --- /dev/null +++ b/src/Form/Fields/Date.php @@ -0,0 +1,82 @@ +type('date')->step(1); + } + + /** + * Set the "min" HTML attribute. + */ + public function min(string|DateTimeInterface $value): static + { + return $this->setAttribute('min', (string) $value); + } + + /** + * Set the "max" HTML attribute. + */ + public function max(string|DateTimeInterface $value): static + { + return $this->setAttribute('max', (string) $value); + } + + /** + * Set the "step" HTML attribute. + */ + public function step(int $value): static + { + return $this->setAttribute('step', $value); + } + + /** + * Set the with time attribute. + */ + public function withTime(bool $value = true): static + { + $this->format = $value ? 'Y-m-d H:i:s' : 'Y-m-d'; + + $this->withTime = $value; + + $this->type($value ? 'datetime-local' : 'date'); + + return $this; + } + + /** + * Set the timezone. + */ + public function timezone(string $value = null): static + { + $this->timezone = $value; + + return $this; + } +} diff --git a/src/Form/Fields/Dropdown.php b/src/Form/Fields/Dropdown.php new file mode 100644 index 000000000..fcfda0123 --- /dev/null +++ b/src/Form/Fields/Dropdown.php @@ -0,0 +1,59 @@ +setAttribute('class', 'form-control combobox__control'); + } + + /** + * Make a new option instance. + */ + public function newOption(mixed $value, string $label): DropdownOption + { + return new DropdownOption($value, $label); + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + $data = parent::toArray(); + + return array_merge($data, [ + 'options' => array_map(static function (DropdownOption $option): array { + return $option->toRenderedArray(); + }, $data['options']), + 'selection' => Collection::make($data['options']) + ->filter(function (DropdownOption $option): bool { + return $option->getAttribute('selected'); + }) + ->values() + ->map(function (DropdownOption $option): array { + return $option->toRenderedArray(); + }) + ->toArray(), + 'config' => [ + 'multiple' => $this->getAttribute('multiple'), + ], + ]); + } +} diff --git a/src/Form/Fields/Editor.php b/src/Form/Fields/Editor.php new file mode 100644 index 000000000..58558e888 --- /dev/null +++ b/src/Form/Fields/Editor.php @@ -0,0 +1,162 @@ +config = Config::get('root.editor', []); + $this->height('350px'); + } + + /** + * {@inheritdoc} + */ + public function setApiUri(string $apiUri): static + { + if (! is_null($this->media)) { + $this->media->setApiUri( + sprintf('%s/%s', $apiUri, $this->media->getUriKey()) + ); + } + + return parent::setApiUri($apiUri); + } + + /** + * Set the height style HTML attribute. + */ + public function height(string $value): static + { + return $this->setAttribute('style.height', $value); + } + + /** + * Set the configuration. + */ + public function withConfig(Closure $callback): static + { + $this->config = call_user_func_array($callback, [$this->config]); + + return $this; + } + + /** + * Get the editor configuration. + */ + public function getConfig(): array + { + return $this->config; + } + + /** + * Create a new fields collection. + */ + protected function newFieldsCollection(): Fields + { + return new Fields($this->form); + } + + /** + * Configure the media field. + */ + public function withMedia(Closure $callback = null): static + { + if (is_null($this->fields)) { + $this->fields = $this->newFieldsCollection(); + } + + if (is_null($this->media)) { + $this->media = $this->newMediaField(); + + $this->fields->push($this->media); + } + + if (! is_null($callback)) { + call_user_func_array($callback, [$this->media]); + } + + return $this; + } + + /** + * Get the media field. + */ + public function getMedia(): ?Media + { + return $this->media; + } + + /** + * Make a custom media field. + */ + protected function newMediaField(): Media + { + return new class($this->form, $this->getModelAttribute()) extends Media + { + public function __construct(Form $form, string $modelAttribute) + { + parent::__construct($form, __('Media'), $modelAttribute.'-media', static function (): MorphToMany { + return new MorphToMany( + Medium::proxy()->newQuery(), + new class() extends Model + { + }, + 'media', + 'root_mediables', + 'medium_id', + '_model_id', + 'id', + 'id' + ); + }); + + $this->template = 'root::form.fields.editor.media'; + + $this->multiple(); + } + }; + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + return array_merge(parent::toArray(), [ + 'config' => $this->config, + 'media' => $this->media, + ]); + } +} diff --git a/src/Form/Fields/Email.php b/src/Form/Fields/Email.php new file mode 100644 index 000000000..602b84bb7 --- /dev/null +++ b/src/Form/Fields/Email.php @@ -0,0 +1,18 @@ +type('email'); + } +} diff --git a/src/Form/Fields/Field.php b/src/Form/Fields/Field.php new file mode 100644 index 000000000..ed89d03db --- /dev/null +++ b/src/Form/Fields/Field.php @@ -0,0 +1,448 @@ + [], + 'create' => [], + 'update' => [], + ]; + + /** + * The field label. + */ + protected string $label; + + /** + * The associated model attribute. + */ + protected string $modelAttribute; + + /** + * The field help text. + */ + protected ?string $help = null; + + /** + * The field prefix. + */ + protected ?string $prefix = null; + + /** + * The field suffix. + */ + protected ?string $suffix = null; + + /** + * The field model. + */ + protected ?Model $model = null; + + /** + * Indicates if the field should use the old value. + */ + protected bool $withOldValue = true; + + /** + * The API URI. + */ + protected ?string $apiUri = null; + + /** + * Create a new field instance. + */ + public function __construct(Form $form, string $label, string $modelAttribute = null) + { + $this->modelAttribute = $modelAttribute ?: Str::of($label)->lower()->snake()->value(); + $this->form = $form; + + $this->label($label); + $this->name($this->modelAttribute); + $this->id($this->modelAttribute); + $this->setAttribute('class', 'form-control'); + $this->setAttribute('form', $form->getAttribute('id')); + } + + /** + * Get the model. + */ + public function getModel(): Model + { + return $this->model ?: $this->form->model; + } + + /** + * Set the model. + */ + public function setModel(Model $model): static + { + $this->model = $model; + + return $this; + } + + /** + * Get the model attribute. + */ + public function getModelAttribute(): string + { + return $this->modelAttribute; + } + + /** + * Set the model attribute. + */ + public function setModelAttribute(string $value): static + { + $this->modelAttribute = $value; + + return $this; + } + + /** + * Get the request key. + */ + public function getRequestKey(): string + { + return str_replace('->', '.', $this->getModelAttribute()); + } + + /** + * Get the validation key. + */ + public function getValidationKey(): string + { + return $this->getRequestKey(); + } + + /** + * Get the URI key. + */ + public function getUriKey(): string + { + return str_replace('.', '-', $this->getRequestKey()); + } + + /** + * Set the API URI. + */ + public function setApiUri(string $apiUri): static + { + $this->apiUri = $apiUri; + + return $this; + } + + /** + * Get the API URI. + */ + public function getApiUri(): ?string + { + return $this->apiUri; + } + + /** + * Set the label attribute. + */ + public function label(string $value): static + { + $this->label = $value; + + return $this; + } + + /** + * Set the "name" HTML attribute attribute. + */ + public function name(string|Closure $value): static + { + $value = $value instanceof Closure ? call_user_func_array($value, [$this]) : $value; + + $value = preg_replace('/(?:\->|\.)(.+?)(?=(?:\->|\.)|$)/', '[$1]', $value); + + return $this->setAttribute('name', $value); + } + + /** + * Set the readonly attribute. + */ + public function readonly(bool|Closure $value = true): static + { + return $this->setAttribute('readonly', $value); + } + + /** + * Set the "disabled" HTML attribute. + */ + public function disabled(bool|Closure $value = true): static + { + return $this->setAttribute('disabled', $value); + } + + /** + * Set the "required" HTML attribute. + */ + public function required(bool|Closure $value = true): static + { + return $this->setAttribute('required', $value); + } + + /** + * Set the "type" HTML attribute. + */ + public function type(string|Closure $value): static + { + return $this->setAttribute('type', $value); + } + + /** + * Set the "placeholder" HTML attribute. + */ + public function placeholder(string|Closure $value): static + { + return $this->setAttribute('placeholder', $value); + } + + /** + * Set the help attribute. + */ + public function help(string $value = null): static + { + $this->help = $value; + + return $this; + } + + /** + * Set the prefix attribute. + */ + public function prefix(string $value): static + { + $this->prefix = $value; + + return $this; + } + + /** + * Set the suffix attribute. + */ + public function suffix(string $value): static + { + $this->suffix = $value; + + return $this; + } + + /** + * Resolve the value. + */ + public function resolveValue(Request $request): mixed + { + $value = $this->withOldValue && $request->session()->hasOldInput($this->getRequestKey()) + ? $this->getOldValue($request) + : $this->getValue(); + + if (is_null($this->valueResolver)) { + return $value; + } + + return call_user_func_array($this->valueResolver, [$request, $this->getModel(), $value]); + } + + /** + * Get the old value from the request. + */ + public function getOldValue(Request $request): mixed + { + return $request->old($this->getRequestKey()); + } + + /** + * Set the with old value attribute. + */ + public function withOldValue(bool $value = true): static + { + $this->withOldValue = $value; + + return $this; + } + + /** + * Set the with old value attribute to false. + */ + public function withoutOldValue(): mixed + { + return $this->withOldValue(false); + } + + /** + * Persist the request value on the model. + */ + public function persist(Request $request, mixed $value): void + { + $this->getModel()->saving(function () use ($request, $value): void { + $this->resolveHydrate($request, $value); + }); + } + + /** + * Get the value for hydrating the model. + */ + public function getValueForHydrate(Request $request): mixed + { + return $request->input($this->getRequestKey()); + } + + /** + * Set the hydrate resolver. + */ + public function hydrate(Closure $callback): static + { + $this->hydrateResolver = $callback; + + return $this; + } + + /** + * Hydrate the model. + */ + public function resolveHydrate(Request $request, mixed $value): void + { + if (is_null($this->hydrateResolver)) { + $this->hydrateResolver = function () use ($value): void { + $this->getModel()->setAttribute($this->getModelAttribute(), $value); + }; + } + + call_user_func_array($this->hydrateResolver, [$request, $this->getModel(), $value]); + } + + /** + * Set the validation rules. + */ + public function rules(array|Closure $rules, string $context = '*'): static + { + $this->rules[$context] = $rules; + + return $this; + } + + /** + * Set the create validation rules. + */ + public function createRules(array|Closure $rules): static + { + return $this->rules($rules, 'create'); + } + + /** + * Set the update validation rules. + */ + public function updateRules(array|Closure $rules): static + { + return $this->rules($rules, 'update'); + } + + /** + * Determine if the field is invalid. + */ + public function invalid(Request $request): bool + { + return $this->form->errors($request)->has($this->getValidationKey()); + } + + /** + * Get the validation error from the request. + */ + public function error(Request $request): ?string + { + return $this->form->errors($request)->first($this->getValidationKey()) ?: null; + } + + /** + * Convert the field to an array. + */ + public function toArray(): array + { + return App::call(function (Request $request): array { + return [ + 'attribute' => $this->getModelAttribute(), + 'attrs' => $this->newAttributeBag()->class([ + 'form-control--invalid' => $this->invalid($request), + ]), + 'error' => $this->error($request), + 'help' => $this->help, + 'invalid' => $this->invalid($request), + 'label' => $this->label, + 'prefix' => $this->prefix, + 'suffix' => $this->suffix, + 'value' => $this->resolveValue($request), + ]; + }); + } + + /** + * Get the validation representation of the field. + */ + public function toValidate(Request $request): array + { + $model = $this->getModel(); + + $key = $model->exists ? 'update' : 'create'; + + $rules = array_map( + static function (array|Closure $rule) use ($request, $model): array { + return is_array($rule) ? $rule : call_user_func_array($rule, [$request, $model]); + }, + Arr::only($this->rules, array_unique(['*', $key])) + ); + + return [$this->getValidationKey() => Arr::flatten($rules, 1)]; + } + + /** + * Create an HTTP response that represents the object. + */ + public function toResponse($request): JsonResponse + { + return new JsonResponse($this->toArray()); + } +} diff --git a/src/Form/Fields/Fields.php b/src/Form/Fields/Fields.php new file mode 100644 index 000000000..107036e46 --- /dev/null +++ b/src/Form/Fields/Fields.php @@ -0,0 +1,296 @@ +form = $form; + $this->fields = new Collection($fields); + } + + /** + * Register the given fields. + */ + public function register(array|Field $fields): static + { + foreach (Arr::wrap($fields) as $field) { + $this->fields->push($field); + } + + return $this; + } + + /** + * Add a new field to the collection. + */ + public function field(string $field, string $label, string $modelAttribute = null, ...$params): Field + { + $instance = new $field($this->form, $label, $modelAttribute, ...$params); + + $this->register($field); + + return $instance; + } + + /** + * Make a new text field. + */ + public function text(string $label, string $modelAttribute = null): Text + { + return $this->field(Text::class, $label, $modelAttribute); + } + + /** + * Make a new email field. + */ + public function email(string $label, string $modelAttribute = null): Email + { + return $this->field(Email::class, $label, $modelAttribute); + } + + /** + * Make a new textarea field. + */ + public function textarea(string $label, string $modelAttribute = null): Textarea + { + return $this->field(Textarea::class, $label, $modelAttribute); + } + + /** + * Make a new number field. + */ + public function number(string $label, string $modelAttribute = null): Number + { + return $this->field(Number::class, $label, $modelAttribute); + } + + /** + * Make a new range field. + */ + public function range(string $label, string $modelAttribute = null): Range + { + return $this->field(Range::class, $label, $modelAttribute); + } + + /** + * Make a new select field. + */ + public function select(string $label, string $modelAttribute = null): Select + { + return $this->field(Select::class, $label, $modelAttribute); + } + + /** + * Make a new boolean field. + */ + public function boolean(string $label, string $modelAttribute = null): Boolean + { + return $this->field(Boolean::class, $label, $modelAttribute); + } + + /** + * Make a new checkbox field. + */ + public function checkbox(string $label, string $modelAttribute = null): Checkbox + { + return $this->field(Checkbox::class, $label, $modelAttribute); + } + + /** + * Make a new tag field. + */ + public function tag(string $label, string $modelAttribute = null): Tag + { + return $this->field(Tag::class, $label, $modelAttribute); + } + + /** + * Make a new date field. + */ + public function date(string $label, string $modelAttribute = null): Date + { + return $this->field(Date::class, $label, $modelAttribute); + } + + /** + * Make a new radio field. + */ + public function radio(string $label, string $modelAttribute = null): Radio + { + return $this->field(Radio::class, $label, $modelAttribute); + } + + /** + * Make a new hidden field. + */ + public function hidden(string $label, string $modelAttribute = null): Hidden + { + return $this->field(Hidden::class, $label, $modelAttribute); + } + + /** + * Make a new editor field. + */ + public function editor(string $label, string $modelAttribute = null): Editor + { + return $this->field(Editor::class, $label, $modelAttribute); + } + + /** + * Make a new file field. + */ + public function file(string $label, string $modelAttribute = null, Closure|string $relation = null): File + { + return $this->field(File::class, $label, $modelAttribute, $relation); + } + + /** + * Make a new media field. + */ + public function media(string $label, string $modelAttribute = null, Closure|string $relation = null): Media + { + return $this->field(Media::class, $label, $modelAttribute, $relation); + } + + /** + * Make a new fieldset field. + */ + public function fieldset(string $label, string $modelAttribute = null): Fieldset + { + return $this->field(Fieldset::class, $label, $modelAttribute); + } + + /** + * Make a new repeater field. + */ + public function repeater(string $label, string $modelAttribute = null): Repeater + { + return $this->field(Repeater::class, $label, $modelAttribute); + } + + /** + * Make a new repeater field. + */ + public function dropdown(string $label, string $modelAttribute = null): Dropdown + { + return $this->field(Dropdown::class, $label, $modelAttribute); + } + + /** + * Make a new has one field. + */ + public function hasOne(string $label, string $modelAttribute = null, Closure|string $relation = null): HasOne + { + return $this->field(HasOne::class, $label, $modelAttribute, $relation); + } + + /** + * Make a new has many field. + */ + public function hasMany(string $label, string $modelAttribute = null, Closure|string $relation = null): HasMany + { + return $this->field(HasMany::class, $label, $modelAttribute, $relation); + } + + /** + * Make a new belongs to field. + */ + public function belongsTo(string $label, string $modelAttribute = null, Closure|string $relation = null): BelongsTo + { + return $this->field(BelongsTo::class, $label, $modelAttribute, $relation); + } + + /** + * Make a new belongs to many field. + */ + public function belongsToMany(string $label, string $modelAttribute = null, Closure|string $relation = null): BelongsToMany + { + return $this->field(BelongsToMany::class, $label, $modelAttribute, $relation); + } + + /** + * Make a new morph one field. + */ + public function morphOne(string $label, string $modelAttribute = null, Closure|string $relation = null): MorphOne + { + return $this->field(MorphOne::class, $label, $modelAttribute, $relation); + } + + /** + * Make a new morph many field. + */ + public function morphMany(string $label, string $modelAttribute = null, Closure|string $relation = null): MorphMany + { + return $this->field(MorphMany::class, $label, $modelAttribute, $relation); + } + + /** + * Make a new morph to field. + */ + public function morphTo(string $label, string $modelAttribute = null, Closure|string $relation = null): MorphTo + { + return $this->field(MorphTo::class, $label, $modelAttribute, $relation); + } + + /** + * Make a new morph to many field. + */ + public function morphToMany(string $label, string $modelAttribute = null, Closure|string $relation = null): MorphToMany + { + return $this->field(MorphToMany::class, $label, $modelAttribute, $relation); + } + + /** + * Persist the request value on the model. + */ + public function persist(Request $request): void + { + $this->fields->each(static function (Field $field) use ($request): void { + $field->persist( + $request, $field->getValueForHydrate($request) + ); + }); + } + + /** + * Map the fields to validate. + */ + public function mapToValidate(Request $request): array + { + return $this->fields->reduce(static function (array $rules, Field $field) use ($request): array { + return array_merge_recursive($rules, $field->toValidate($request)); + }, []); + } + + /** + * Handle the dynamic method call. + */ + public function __call($method, $parameters): mixed + { + return $this->forwardCallTo($this->fields, $method, $parameters); + } +} diff --git a/src/Form/Fields/Fieldset.php b/src/Form/Fields/Fieldset.php new file mode 100644 index 000000000..34d458e9a --- /dev/null +++ b/src/Form/Fields/Fieldset.php @@ -0,0 +1,90 @@ +form); + } + + /** + * Handle the callback for the field resolution. + */ + protected function resolveField(Request $request, Field $field): void + { + if (! is_null($this->apiUri)) { + $field->setApiUri(sprintf('%s/%s', $this->apiUri, $field->getUriKey())); + } + } + + /** + * {@inheritdoc} + */ + public function persist(Request $request, mixed $value): void + { + $this->resolveFields($request)->each(static function (Field $field) use ($request): void { + $field->persist($request, $field->getValueForHydrate($request)); + }); + } + + /** + * {@inheritdoc} + */ + public function resolveHydrate(Request $request, mixed $value): void + { + $this->resolveFields($request)->each(static function (Field $field) use ($request): void { + $field->resolveHydrate($request, $field->getValueForHydrate($request)); + }); + } + + /** + * {@inheritdoc} + */ + public function invalid(Request $request): bool + { + return parent::invalid($request) + || $this->resolveFields($request)->some(fn (Field $field): bool => $field->invalid($request)); + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + return array_merge( + parent::toArray(), + App::call(function (Request $request): array { + return [ + 'fields' => $this->resolveFields($request)->all(), + ]; + }) + ); + } + + /** + * {@inheritdoc} + */ + public function toValidate(Request $request): array + { + return array_merge( + parent::toValidate($request), + $this->resolveFields($request)->mapToValidate($request) + ); + } +} diff --git a/src/Form/Fields/File.php b/src/Form/Fields/File.php new file mode 100644 index 000000000..37ae5190e --- /dev/null +++ b/src/Form/Fields/File.php @@ -0,0 +1,239 @@ +type('file')->multiple(false); + + $this->disk(Config::get('root.media.disk', 'public')); + } + + /** + * Set the "multiple" HTML attribute. + */ + public function multiple(bool $value = true): static + { + $this->setAttribute('multiple', $value); + + return $this; + } + + /** + * Set the "accept" HTML attribute. + */ + public function accept(string $value): static + { + $this->setAttribute('accept', $value); + + return $this; + } + + /** + * Set the disk attribute. + */ + public function disk(string $value): static + { + $this->disk = $value; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function resolveDisplay(Model $related): mixed + { + if (is_null($this->displayResolver)) { + $this->display('file_name'); + } + + return parent::resolveDisplay($related); + } + + /** + * {@inheritdoc} + */ + public function resolveOptions(Request $request): array + { + return $this->resolveValue($request) + ->map(function (Medium $medium): FileOption { + return $this->toOption($medium)->selected(); + }) + ->all(); + } + + /** + * {@inheritdoc} + */ + public function newOption(Model $value, string $label): FileOption + { + $name = sprintf( + '%s[%s][%s]', + $this->getAttribute('name'), + $value->getKey(), + $this->getRelation()->getRelatedPivotKeyName() + ); + + return FileOption::make($value, $label)->setAttribute('name', $name); + } + + /** + * Set the storage resolver callback. + */ + public function storeUsing(Closure $callback): static + { + $this->storageResolver = $callback; + + return $this; + } + + /** + * Store the uploaded file. + */ + public function store(Request $request, UploadedFile $file): FileOption + { + $disk = Storage::build([ + 'driver' => 'local', + 'root' => Config::get('root.media.tmp_dir'), + ]); + + $disk->put($file->getClientOriginalName(), $file); + + return $this->stored($request, $disk->path($file->getClientOriginalName())); + } + + /** + * Handle the stored event. + */ + protected function stored(Request $request, string $path): FileOption + { + $target = str_replace($request->header('X-Chunk-Hash', ''), '', $path); + + $medium = (Medium::proxy())::makeFromPath($path, [ + 'disk' => $this->disk, + 'file_name' => $name = basename($target), + 'name' => pathinfo($name, PATHINFO_FILENAME), + ]); + + if (! is_null($this->storageResolver)) { + call_user_func_array($this->storageResolver, [$request, $medium, $path]); + } + + $request->user()->uploads()->save($medium); + + MoveFile::withChain($medium->convertible() ? [new PerformConversions($medium)] : []) + ->dispatch($medium, $path, false); + + return $this->toOption($medium); + } + + /** + * Set the prunable attribute. + */ + public function prunable(bool $value = true): static + { + $this->prunable = $value; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function persist(Request $request, mixed $value): void + { + $this->getModel()->saved(function () use ($request, $value): void { + $files = Arr::wrap($request->file($this->getRequestKey(), [])); + + $ids = array_map(function (UploadedFile $file) use ($request): int { + return $this->store($request, $file)->model->getKey(); + }, $files); + + $value = array_merge((array) $value, $ids); + + $this->resolveHydrate($request, $value); + + $keys = $this->getRelation()->sync($value); + + if ($this->prunable && ! empty($keys['detached'])) { + $this->prune($request, $keys['detached']); + } + }); + } + + /** + * Prune the related models. + */ + protected function prune(Request $request, array $keys): int + { + $count = 0; + + $this->resolveRelatableQuery($request) + ->whereIn('id', $keys) + ->cursor() + ->each(static function (Medium $medium) use (&$count): void { + $medium->delete(); + + $count++; + }); + + return $count; + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + return array_merge( + parent::toArray(), + App::call(function (Request $request): array { + return [ + 'options' => $this->resolveOptions($request), + ]; + }) + ); + } +} diff --git a/src/Form/Fields/HasMany.php b/src/Form/Fields/HasMany.php new file mode 100644 index 000000000..c495dbabd --- /dev/null +++ b/src/Form/Fields/HasMany.php @@ -0,0 +1,28 @@ +setAttribute('multiple', true); + } + + /** + * {@inheritdoc} + */ + public function getRelation(): EloquentRelation + { + return parent::getRelation(); + } +} diff --git a/src/Form/Fields/HasOne.php b/src/Form/Fields/HasOne.php new file mode 100644 index 000000000..0de50dc9e --- /dev/null +++ b/src/Form/Fields/HasOne.php @@ -0,0 +1,16 @@ +saved(function (Model $model) use ($request, $value): void { - $relation = $this->getRelation($model); + $this->getModel()->saved(function (Model $model) use ($request, $value): void { + $relation = $this->getRelation(); - $this->resolveHydrate($request, $model, $value); + $this->resolveHydrate($request, $value); $models = $model->getRelation($this->getRelationName()); @@ -40,16 +40,16 @@ public function persist(Request $request, Model $model, mixed $value): void /** * {@inheritdoc} */ - public function resolveHydrate(Request $request, Model $model, mixed $value): void + public function resolveHydrate(Request $request, mixed $value): void { if (is_null($this->hydrateResolver)) { $this->hydrateResolver = function (Request $request, Model $model, mixed $value): void { - $related = $this->resolveRelatableQuery($request, $model)->find($value); + $related = $this->resolveRelatableQuery($request)->find($value); $model->setRelation($this->getRelationName(), $related); }; } - parent::resolveHydrate($request, $model, $value); + parent::resolveHydrate($request, $value); } } diff --git a/src/Form/Fields/Hidden.php b/src/Form/Fields/Hidden.php new file mode 100644 index 000000000..74885e0b3 --- /dev/null +++ b/src/Form/Fields/Hidden.php @@ -0,0 +1,23 @@ +type('hidden'); + } +} diff --git a/src/Form/Fields/Media.php b/src/Form/Fields/Media.php new file mode 100644 index 000000000..411f4dc36 --- /dev/null +++ b/src/Form/Fields/Media.php @@ -0,0 +1,151 @@ +form->getAttribute('id'), $this->getModelAttribute()); + } + + /** + * Set the multiple attribute. + */ + public function multiple(bool $value = true): static + { + $this->multiple = $value; + + return $this; + } + + /** + * Paginate the results. + */ + public function paginate(Request $request): array + { + return $this->resolveRelatableQuery($request) + ->latest() + ->paginate($request->input('per_page')) + ->withQueryString() + ->setPath($this->apiUri) + ->through(function (Medium $related): array { + return $this->toOption($related)->toRenderedArray(); + }) + ->toArray(); + } + + /** + * {@inheritdoc} + */ + public function persist(Request $request, mixed $value): void + { + $this->getModel()->saved(function () use ($request, $value): void { + $this->resolveHydrate($request, $value); + + $keys = $this->getRelation()->sync($value); + + if ($this->prunable && ! empty($keys['detached'])) { + $this->prune($request, $keys['detached']); + } + }); + } + + /** + * Handle the file upload. + */ + public function upload(Request $request): JsonResponse + { + $accept = $this->getAttribute('accept'); + + $data = $request->validate(['file' => [ + 'required', + 'file', + Rule::when(! is_null($accept), ['mimetypes:'.$accept]), + ]]); + + $option = $this->store($request, $data['file']); + + return new JsonResponse($option->toRenderedArray(), JsonResponse::HTTP_CREATED); + } + + /** + * {@inheritdoc} + */ + public function store(Request $request, UploadedFile $file): FileOption + { + $disk = Storage::build([ + 'driver' => 'local', + 'root' => Config::get('root.media.tmp_dir'), + ]); + + $disk->append($file->getClientOriginalName(), $file->get()); + + if ($request->header('X-Chunk-Index') !== $request->header('X-Chunk-Total')) { + return new PendingFileOption(new Medium(), ''); + } + + return $this->stored($request, $disk->path($file->getClientOriginalName())); + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + $data = parent::toArray(); + + return array_merge($data, [ + 'modalKey' => $this->getModalKey(), + 'config' => [ + 'accept' => $this->getAttribute('accept', '*'), + 'multiple' => $this->multiple, + 'chunk_size' => Config::get('root.media.chunk_size'), + ], + 'selection' => array_map(function (FileOption $option): array { + return $option->toRenderedArray(); + }, $data['options'] ?? []), + ]); + } + + /** + * {@inheritdoc} + */ + public function toResponse($request): JsonResponse + { + return match ($request->method()) { + 'POST' => $this->upload($request), + 'DELETE' => new JsonResponse(['deleted' => $this->prune($request, $request->input('ids', []))]), + default => new JsonResponse($this->paginate($request)), + }; + } +} diff --git a/src/Fields/Meta.php b/src/Form/Fields/Meta.php similarity index 69% rename from src/Fields/Meta.php rename to src/Form/Fields/Meta.php index 369947db6..0d62cf246 100644 --- a/src/Fields/Meta.php +++ b/src/Form/Fields/Meta.php @@ -1,8 +1,10 @@ metaData()->getRelated(); @@ -27,15 +29,17 @@ public function __construct(string $label, string $name = null, Closure|string $ ->one() ->ofMany( [$related->getCreatedAtColumn() => 'MAX'], - fn (Builder $query): Builder => $query->where($related->qualifyColumn('key'), $this->name), + function (Builder $query) use ($related): Builder { + return $query->where($related->qualifyColumn('key'), $this->getModelAttribute()); + }, 'metaData' ) - ->withDefault(['key' => $this->name]); + ->withDefault(['key' => $this->getModelAttribute()]); }; - $this->field = new Text($label, $name); + $this->asText(); - parent::__construct($label, $name, $relation); + parent::__construct($form, $label, $modelAttribute, $relation); } /** @@ -44,7 +48,7 @@ public function __construct(string $label, string $name = null, Closure|string $ public function getRelationName(): string { return $this->relation instanceof Closure - ? sprintf('__root_%s', $this->name) + ? sprintf('__root_%s', $this->getModelAttribute()) : $this->relation; } @@ -53,12 +57,14 @@ public function getRelationName(): string */ public function as(string $field, Closure $callback = null): static { - $this->field = new $field($this->label, $this->name); + $this->field = new $field($this->label, $this->getModelAttribute()); if (! is_null($callback)) { call_user_func_array($callback, [$this->field]); } + $this->field->value(fn (Request $request): mixed => $this->resolveValue($request)); + return $this; } @@ -174,14 +180,6 @@ public function asTextarea(Closure $callback = null): static return $this->as(Textarea::class, $callback); } - /** - * {@inheritdoc} - */ - public function asSubResource(bool $value = true): static - { - return $this; - } - /** * {@inheritdoc} */ @@ -193,7 +191,7 @@ public function async(bool $value = true): static /** * {@inheritdoc} */ - public function resolveOptions(Request $request, Model $model): array + public function resolveOptions(Request $request): array { return []; } @@ -201,42 +199,50 @@ public function resolveOptions(Request $request, Model $model): array /** * {@inheritdoc} */ - public function getValue(Request $request, Model $model): mixed + public function getValue(): mixed { + $model = $this->getModel(); + $name = $this->getRelationName(); - if ($this->relation instanceof Closure + if ( + $this->relation instanceof Closure && $model->relationLoaded('metaData') && ! $model->relationLoaded($name) - && ! is_null($value = $model->getRelation('metaData')->sortByDesc('created_at')->firstWhere('key', $this->name))) { + && ! is_null( + $value = $model->getRelation('metaData') + ->sortByDesc('created_at') + ->firstWhere('key', $this->getModelAttribute()) + ) + ) { $model->setRelation($name, $value); } - return parent::getValue($request, $model); + return parent::getValue(); } /** * {@inheritdoc} */ - public function resolveValue(Request $request, Model $model): mixed + public function resolveValue(Request $request): mixed { if (is_null($this->valueResolver)) { - $this->valueResolver = static function (Request $request, Model $model, mixed $value): mixed { + $this->valueResolver = static function (Model $model, mixed $value): mixed { return $value?->value; }; } - return parent::resolveValue($request, $model); + return parent::resolveValue($request); } /** * {@inheritdoc} */ - public function resolveHydrate(Request $request, Model $model, mixed $value): void + public function resolveHydrate(Request $request, mixed $value): void { if (is_null($this->hydrateResolver)) { - $this->hydrateResolver = function () use ($request, $model, $value): void { - $related = $this->getValue($request, $model); + $this->hydrateResolver = function (Request $request, Model $model, mixed $value): void { + $related = $this->getValue(); $related->setAttribute('value', $value); @@ -244,34 +250,30 @@ public function resolveHydrate(Request $request, Model $model, mixed $value): vo }; } - parent::resolveHydrate($request, $model, $value); + parent::resolveHydrate($request, $value); } /** * {@inheritdoc} */ - public function toInput(Request $request, Model $model): array + public function render(): View { - $this->field->value(fn (): mixed => $this->resolveValue($request, $model)); - - return $this->field->toInput($request, $model); + return $this->field->render(); } /** * {@inheritdoc} */ - public function toDisplay(Request $request, Model $model): array + public function toArray(): array { - $this->field->format(fn (): mixed => $this->resolveFormat($request, $model)); - - return $this->field->toDisplay($request, $model); + return $this->field->toArray(); } /** * {@inheritdoc} */ - public function toValidate(Request $request, Model $model): array + public function toValidate(Request $request): array { - return $this->field->toValidate($request, $model); + return $this->field->toValidate($request); } } diff --git a/src/Form/Fields/MorphMany.php b/src/Form/Fields/MorphMany.php new file mode 100644 index 000000000..2e8443cfe --- /dev/null +++ b/src/Form/Fields/MorphMany.php @@ -0,0 +1,16 @@ +type('number'); } /** - * Set the "min" attribute. + * Set the "min" HTML attribute. */ public function min(int|float|Closure $value): static { @@ -25,7 +26,7 @@ public function min(int|float|Closure $value): static } /** - * Set the "max" attribute. + * Set the "max" HTML attribute. */ public function max(int|float|Closure $value): static { @@ -33,7 +34,7 @@ public function max(int|float|Closure $value): static } /** - * Set the "step" attribute. + * Set the "step" HTML attribute. */ public function step(int|float|Closure $value): static { diff --git a/src/Form/Fields/Options/CheckboxOption.php b/src/Form/Fields/Options/CheckboxOption.php new file mode 100644 index 000000000..344e31cc5 --- /dev/null +++ b/src/Form/Fields/Options/CheckboxOption.php @@ -0,0 +1,45 @@ +setAttribute('type', 'checkbox'); + } + + /** + * Set the "name" HTML attribute. + */ + public function name(string $value): static + { + return $this->setAttribute('name', $value); + } + + /** + * Set the "selected" HTML attribute. + */ + public function selected(bool $value = true): static + { + return $this->checked($value); + } + + /** + * Set the "checked" HTML attribute. + */ + public function checked(bool $value = true): static + { + return $this->setAttribute('checked', $value); + } +} diff --git a/src/Form/Fields/Options/DropdownOption.php b/src/Form/Fields/Options/DropdownOption.php new file mode 100644 index 000000000..acdf94e76 --- /dev/null +++ b/src/Form/Fields/Options/DropdownOption.php @@ -0,0 +1,11 @@ + $this->fields?->all() ?: [], + 'file_name' => $this->model->file_name, + 'is_image' => $this->model->isImage, + 'medium' => $this->model, + 'processing' => false, + 'url' => $this->model->getUrl('thumbnail') ?: $this->model->getUrl('original'), + 'uuid' => $this->model->uuid, + ]); + } +} diff --git a/src/Fields/OptGroup.php b/src/Form/Fields/Options/OptGroup.php similarity index 65% rename from src/Fields/OptGroup.php rename to src/Form/Fields/Options/OptGroup.php index a160791d9..5dc2672a6 100644 --- a/src/Fields/OptGroup.php +++ b/src/Form/Fields/Options/OptGroup.php @@ -1,16 +1,19 @@ setAttributes([ 'label' => $label, 'disabled' => false, ]); + + $this->options = $options; } /** @@ -38,7 +43,7 @@ public function options(array $value): static } /** - * Set the label attribute. + * Set the "label" HTML attribute. */ public function label(string $value): static { @@ -46,7 +51,7 @@ public function label(string $value): static } /** - * Set the disabled attribute. + * Set the "disabled" HTML attribute. */ public function disabled(bool $value = true): static { @@ -54,11 +59,11 @@ public function disabled(bool $value = true): static } /** - * Get the instance as an array. + * {@inheritdoc} */ public function toArray(): array { - return array_merge($this->getAttributes(), [ + return array_merge(parent::toArray(), [ 'options' => $this->options, ]); } diff --git a/src/Form/Fields/Options/Option.php b/src/Form/Fields/Options/Option.php new file mode 100644 index 000000000..51775ac98 --- /dev/null +++ b/src/Form/Fields/Options/Option.php @@ -0,0 +1,73 @@ +label = $label; + $this->setAttribute('value', $value); + $this->selected(false); + } + + /** + * Set the "disabled" HTML attribute. + */ + public function disabled(bool $value = true): static + { + return $this->setAttribute('disabled', $value); + } + + /** + * Set the "selected" HTML attribute. + */ + public function selected(bool $value = true): static + { + return $this->setAttribute('selected', $value); + } + + /** + * Get the array representation of the object. + */ + public function toArray(): array + { + return array_merge(parent::toArray(), [ + 'label' => $this->label, + 'selected' => $this->getAttribute('selected'), + 'value' => $this->getAttribute('value'), + ]); + } + + /** + * Get the array representation of the object that holds the rendered HTML. + */ + public function toRenderedArray(): array + { + $view = $this->render(); + + return array_merge($view->getData(), [ + 'html' => $view->render(), + ]); + } +} diff --git a/src/Form/Fields/Options/PendingFileOption.php b/src/Form/Fields/Options/PendingFileOption.php new file mode 100644 index 000000000..2cb796d95 --- /dev/null +++ b/src/Form/Fields/Options/PendingFileOption.php @@ -0,0 +1,22 @@ + true, + 'file_name' => null, + ]; + } +} diff --git a/src/Form/Fields/Options/RadioOption.php b/src/Form/Fields/Options/RadioOption.php new file mode 100644 index 000000000..208d8ecb0 --- /dev/null +++ b/src/Form/Fields/Options/RadioOption.php @@ -0,0 +1,16 @@ +setAttribute('type', 'radio'); + } +} diff --git a/src/Form/Fields/Options/RelationOption.php b/src/Form/Fields/Options/RelationOption.php new file mode 100644 index 000000000..8d72b3b16 --- /dev/null +++ b/src/Form/Fields/Options/RelationOption.php @@ -0,0 +1,44 @@ +model = $model; + + parent::__construct($model->getKey(), $label); + } + + /** + * Set the pivot fields. + */ + public function withPivotFields(Fields $fields): static + { + $this->fields = $fields; + + return $this; + } +} diff --git a/src/Form/Fields/Options/RepeaterOption.php b/src/Form/Fields/Options/RepeaterOption.php new file mode 100644 index 000000000..68560a1f2 --- /dev/null +++ b/src/Form/Fields/Options/RepeaterOption.php @@ -0,0 +1,78 @@ +model = $model; + + parent::__construct($model->getAttribute('_key'), $label); + } + + /** + * Set the open attribute. + */ + public function open(bool $value = true): static + { + $this->open = $value; + + return $this; + } + + /** + * Set the open attribute. + */ + public function closed(): static + { + return $this->open(false); + } + + /** + * Resolve the fields. + */ + public function withFields(Fields $fields): static + { + $this->fields = $fields; + + return $this; + } + + /** + * Get the array representation of the object. + */ + public function toArray(): array + { + return array_merge(parent::toArray(), [ + 'open' => $this->open, + 'fields' => $this->fields?->all() ?: [], + ]); + } +} diff --git a/src/Form/Fields/Radio.php b/src/Form/Fields/Radio.php new file mode 100644 index 000000000..05233a713 --- /dev/null +++ b/src/Form/Fields/Radio.php @@ -0,0 +1,16 @@ +name($this->getModelAttribute()); + } +} diff --git a/src/Form/Fields/Range.php b/src/Form/Fields/Range.php new file mode 100644 index 000000000..9cd9d8b29 --- /dev/null +++ b/src/Form/Fields/Range.php @@ -0,0 +1,23 @@ +type('range')->step(1)->min(0)->max(100); + } +} diff --git a/src/Form/Fields/Relation.php b/src/Form/Fields/Relation.php new file mode 100644 index 000000000..611544bd8 --- /dev/null +++ b/src/Form/Fields/Relation.php @@ -0,0 +1,301 @@ +relation = $relation ?: $this->getModelAttribute(); + } + + /** + * Add a new scope for the relation query. + */ + public static function scopeQuery(Closure $callback): void + { + static::$scopes[static::class][] = $callback; + } + + /** + * Get the relation instance. + */ + public function getRelation(): EloquentRelation + { + if ($this->relation instanceof Closure) { + return call_user_func_array($this->relation, [$this->getModel()]); + } + + return call_user_func([$this->getModel(), $this->relation]); + } + + /** + * Get the related model name. + */ + public function getRelatedName(): string + { + return __(Str::of($this->getModelAttribute())->singular()->headline()->value()); + } + + /** + * Get the relation name. + */ + public function getRelationName(): string + { + return $this->relation instanceof Closure + ? $this->getModelAttribute() + : $this->relation; + } + + /** + * Set the nullable attribute. + */ + public function nullable(bool $value = true): static + { + $this->nullable = $value; + + return $this; + } + + /** + * Determine if the field is nullable. + */ + public function isNullable(): bool + { + return $this->nullable; + } + + /** + * Set the display resolver. + */ + public function display(Closure|string $callback): static + { + if (is_string($callback)) { + $callback = static function (Model $model) use ($callback) { + return $model->getAttribute($callback); + }; + } + + $this->displayResolver = $callback; + + return $this; + } + + /** + * Resolve the display format or the query result. + */ + public function resolveDisplay(Model $related): mixed + { + if (is_null($this->displayResolver)) { + $this->display($related->getKeyName()); + } + + return call_user_func_array($this->displayResolver, [$related]); + } + + /** + * Set the async attribute. + */ + public function async(bool $value = true): static + { + $this->async = $value; + + // $this->template = $value ? 'root::form.fields.dropdown' : 'root::form.fields.select'; + + return $this; + } + + /** + * Determine if the field is asnyc. + */ + public function isAsync(): bool + { + return $this->async; + } + + /** + * {@inheritdoc} + */ + public function getValue(): mixed + { + $model = $this->getModel(); + + $name = $this->getRelationName(); + + if ($this->relation instanceof Closure && ! $model->relationLoaded($name)) { + $model->setRelation($name, call_user_func_array($this->relation, [$model])->getResults()); + } + + return $model->getAttribute($name); + } + + /** + * Set the query resolver. + */ + public function withRelatableQuery(Closure $callback): static + { + $this->queryResolver = $callback; + + return $this; + } + + /** + * Resolve the related model's eloquent query. + */ + public function resolveRelatableQuery(Request $request): Builder + { + $model = $this->getModel(); + + $query = $this->getRelation()->getRelated()->newQuery(); + + foreach (static::$scopes[static::class] ?? [] as $scope) { + $query = call_user_func_array($scope, [$request, $query, $model]); + } + + if (! is_null($this->queryResolver)) { + $query = call_user_func_array($this->queryResolver, [$request, $query, $model]); + } + + return $query; + } + + /** + * Set the group resolver attribute. + */ + public function groupOptionsBy(string|Closure $key): static + { + $this->groupResolver = $key; + + return $this; + } + + /** + * Resolve the options for the field. + */ + public function resolveOptions(Request $request): array + { + $value = $this->resolveValue($request); + + $mapCallback = function (Model $related) use ($value): RelationOption { + return $this->toOption($related) + ->selected($value instanceof Model ? $value->is($related) : $value->contains($related)); + }; + + return $this->resolveRelatableQuery($request) + ->get() + ->when(! is_null($this->groupResolver), function (Collection $collection) use ($mapCallback): Collection { + return $collection->groupBy($this->groupResolver) + ->map(function ($group, $key) use ($mapCallback): OptGroup { + return new OptGroup($key, $group->map($mapCallback)->all()); + }); + }, function (Collection $collection) use ($mapCallback): Collection { + return $collection->map($mapCallback); + }) + ->toArray(); + } + + /** + * Make a new option instance. + */ + public function newOption(Model $related, string $label): RelationOption + { + return new RelationOption($related, $label); + } + + /** + * Build the API URI. + */ + protected function buildApiUri(): ?string + { + if (is_null($this->apiUri)) { + return $this->apiUri; + } + + return sprintf('%s?%s', $this->apiUri, http_build_query([ + 'model' => $this->getModel()->getKey(), + ])); + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + return array_merge( + parent::toArray(), + App::call(function (Request $request): array { + return [ + 'async' => $this->isAsync(), + 'nullable' => $this->isNullable(), + 'options' => $this->isAsync() ? [] : $this->resolveOptions($request), + 'url' => $this->isAsync() ? $this->buildApiUri() : null, + ]; + }) + ); + } + + /** + * Convert the related model to an option. + */ + public function toOption(Model $related): RelationOption + { + return $this->newOption($related, $this->resolveDisplay($related)); + } +} diff --git a/src/Form/Fields/Repeater.php b/src/Form/Fields/Repeater.php new file mode 100644 index 000000000..586987961 --- /dev/null +++ b/src/Form/Fields/Repeater.php @@ -0,0 +1,224 @@ +max = $value; + + return $this; + } + + /** + * Get the option name. + */ + public function getOptionName(): string + { + return __(Str::singular($this->label)); + } + + /** + * Get the add new option label. + */ + public function getAddNewOptionLabel(): string + { + return __('Add :name', ['name' => $this->getOptionName()]); + } + + /** + * {@inheritdoc} + */ + public function getValueForHydrate(Request $request): mixed + { + return array_values((array) parent::getValueForHydrate($request)); + } + + /** + * {@inheritdoc} + */ + public function getOldValue(Request $request): mixed + { + return array_values((array) parent::getOldValue($request)); + } + + /** + * Create a new fields collection. + */ + public function newFieldsCollection(): Fields + { + return new Fields($this->form); + } + + /** + * Handle the callback for the field resolution. + */ + protected function resolveField(Request $request, Field $field): void + { + if (! is_null($this->apiUri)) { + $field->setApiUri(sprintf('%s/%s', $this->apiUri, $field->getUriKey())); + } + + $field->setModelAttribute( + sprintf('%s.*.%s', $this->getModelAttribute(), $field->getModelAttribute()) + ); + } + + /** + * {@inheritdoc} + */ + public function withFields(Closure $callback): static + { + $this->optionFieldsResolver = function (Model $tmpModel) use ($callback): Fields { + $fields = new Fields($this->form); + + $fields->hidden(__('Key'), '_key'); + + App::call(static function (Request $request) use ($callback, $fields): void { + call_user_func_array($callback, [$request, $fields]); + }); + + $fields->each(function (Field $field) use ($tmpModel): void { + $attribute = sprintf( + '%s.%s.%s', + $this->getModelAttribute(), + $tmpModel->getAttribute('_key'), + $key = $field->getModelAttribute() + ); + + $field->setModelAttribute($attribute) + ->name($attribute) + ->id($attribute) + ->value(function () use ($tmpModel, $key): mixed { + return $tmpModel->getAttribute($key); + }); + }); + + return $fields; + }; + + return $this->__withFields($callback); + } + + /** + * Make a new temporary model for the option. + */ + public function newTemporaryModel(array $attributes = []): Model + { + $model = new class() extends Model + { + }; + + return $model->forceFill(array_replace( + ['_key' => Str::uuid()], + $attributes + )); + } + + /** + * Resolve the repeater options. + */ + public function resolveOptions(Request $request): array + { + $value = (array) $this->resolveValue($request); + + return array_map(function (array $option): RepeaterOption { + return $this->newOption($option, $this->getOptionName()); + }, $value); + } + + /** + * Make a new option instance. + */ + public function newOption(array $value, string $label): mixed + { + return (new RepeaterOption($this->newTemporaryModel($value), $label)) + ->when(! is_null($this->optionFieldsResolver), function (RepeaterOption $option): void { + $option->withFields(call_user_func_array($this->optionFieldsResolver, [$option->model])); + }); + } + + /** + * Build a new option. + */ + public function buildOption(Request $request): JsonResponse + { + return new JsonResponse( + $this->newOption([], $this->getOptionName())->toRenderedArray() + ); + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + return array_merge( + parent::toArray(), + App::call(function (Request $request): array { + return [ + 'addNewLabel' => $this->getAddNewOptionLabel(), + 'max' => $this->max, + 'options' => array_map(static function (RepeaterOption $option): array { + return $option->toRenderedArray(); + }, $this->resolveOptions($request)), + 'url' => $this->getApiUri(), + ]; + }) + ); + } + + /** + * {@inheritdoc} + */ + public function toValidate(Request $request): array + { + return array_merge( + parent::toValidate($request), + $this->resolveFields($request)->mapToValidate($request) + ); + } + + /** + * {@inheritdoc} + */ + public function toResponse($request): JsonResponse + { + return match ($request->method()) { + 'POST' => $this->buildOption($request), + default => parent::toResponse($request), + }; + } +} diff --git a/src/Form/Fields/Select.php b/src/Form/Fields/Select.php new file mode 100644 index 000000000..c11a3fd2f --- /dev/null +++ b/src/Form/Fields/Select.php @@ -0,0 +1,123 @@ +nullable = $value; + + return $this; + } + + /** + * Determine if the field is nullable. + */ + public function isNullable(): bool + { + return $this->nullable; + } + + /** + * Set the "multiple" HTML attribute. + */ + public function multiple(bool $value = true): static + { + return $this->setAttribute('multiple', $value); + } + + /** + * Set the "size" HTML attribute. + */ + public function size(int $value): static + { + return $this->setAttribute('size', $value); + } + + /** + * Set the options attribute. + */ + public function options(array|Closure $value): static + { + if (is_array($value)) { + $value = static function () use ($value): array { + return $value; + }; + } + + $this->optionsResolver = $value; + + return $this; + } + + /** + * Resolve the options for the field. + */ + public function resolveOptions(Request $request): array + { + if (is_null($this->optionsResolver)) { + return []; + } + + $options = call_user_func_array($this->optionsResolver, [$request, $this->getModel()]); + + $value = Arr::wrap($this->resolveValue($request)); + + return array_map(function (mixed $label, mixed $option) use ($value): Option { + $option = $label instanceof Option ? $label : $this->newOption($option, $label); + + $option->selected(in_array($option->getAttribute('value'), $value)); + + return $option; + }, $options, array_keys($options)); + } + + /** + * Make a new option instance. + */ + public function newOption(mixed $value, string $label): Option + { + return new Option($value, $label); + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + return array_merge( + parent::toArray(), + App::call(function (Request $request): array { + return [ + 'nullable' => $this->isNullable(), + 'options' => $this->resolveOptions($request), + ]; + }) + ); + } +} diff --git a/src/Fields/Slug.php b/src/Form/Fields/Slug.php similarity index 56% rename from src/Fields/Slug.php rename to src/Form/Fields/Slug.php index 63b06515b..973cb7afc 100644 --- a/src/Fields/Slug.php +++ b/src/Form/Fields/Slug.php @@ -1,6 +1,6 @@ type('text'); } /** - * Set the size attribute. - * - * @return $this + * Set the "size" HTML attribute. */ public function size(int|Closure $value): static { @@ -27,9 +26,7 @@ public function size(int|Closure $value): static } /** - * Set the minlength attribute. - * - * @return $this + * Set the "minlength" HTML attribute. */ public function minlength(int|Closure $value): static { @@ -37,9 +34,7 @@ public function minlength(int|Closure $value): static } /** - * Set the maxlength attribute. - * - * @return $this + * Set the "maxlength" HTML attribute. */ public function maxlength(int|Closure $value): static { diff --git a/src/Fields/Textarea.php b/src/Form/Fields/Textarea.php similarity index 76% rename from src/Fields/Textarea.php rename to src/Form/Fields/Textarea.php index 30afe2b96..5060a9345 100644 --- a/src/Fields/Textarea.php +++ b/src/Form/Fields/Textarea.php @@ -1,15 +1,15 @@ model = $model; + $this->apiUri = $apiUri; + + $this->action($action); + $this->method($model->exists ? 'PATCH' : 'POST'); + $this->id(Str::of(get_class($model))->classBasename()->lower()->append('-form')->value()); + $this->autocomplete('off'); + } + + /** + * Set the "enctype" HTML attribute. + */ + public function enctype(string $value): static + { + return $this->setAttribute('enctype', $value); + } + + /** + * Set the "autocomplete" HTML attribute. + */ + public function autocomplete(string $value): static + { + return $this->setAttribute('autocomplete', $value); + } + + /** + * Set the "method" HTML attribute. + */ + public function method(string $value): static + { + $this->method = $value; + + return $this->setAttribute('method', $value === 'GET' ? 'GET' : 'POST'); + } + + /** + * Set the "action" HTML attribute. + */ + public function action(string $value): static + { + $this->method = $value; + + return $this->setAttribute('action', $value); + } + + /** + * Handle the incoming form request. + */ + public function handle(Request $request): void + { + $this->validate($request); + + $this->resolveFields($request)->persist($request); + + $this->model->save(); + } + + /** + * Validate the incoming request. + */ + public function validate(Request $request): array + { + return $request->validateWithBag( + $this->errorBag, + $this->resolveFields($request)->mapToValidate($request) + ); + } + + /** + * Set the validation error bag. + */ + public function errorBag(string $value): static + { + $this->errorBag = $value; + + return $this; + } + + /** + * Get the errors for the form. + */ + public function errors(Request $request): MessageBag + { + if (is_null($this->errors)) { + $this->errors = $request->session()->get('errors', new ViewErrorBag())->getBag($this->errorBag); + } + + return $this->errors; + } + + /** + * Handle the callback for the field resolution. + */ + protected function resolveField(Request $request, Field $field): void + { + if (! is_null($this->apiUri)) { + $field->setApiUri(sprintf('%s/%s', $this->apiUri, $field->getUriKey())); + } + } + + /** + * Create a new fields collection. + */ + protected function newFieldsCollection(): Fields + { + return new Fields($this); + } + + /** + * Convert the form to an array. + */ + public function toArray(): array + { + return array_merge( + parent::toArray(), + App::call(function (Request $request): array { + return [ + 'errors' => $this->errors($request), + 'fields' => $this->resolveFields($request)->all(), + 'method' => $this->method, + ]; + }) + ); + } +} diff --git a/src/Form/Panel.php b/src/Form/Panel.php new file mode 100644 index 000000000..7cf96d7be --- /dev/null +++ b/src/Form/Panel.php @@ -0,0 +1,74 @@ +title = $title; + $this->fields = $fields; + } + + /** + * Get the view data. + */ + public function data(Request $request): array + { + return [ + 'title' => $this->title, + 'fields' => $this->fields, + ]; + } + + /** + * Render the table. + */ + public function render(): View + { + return App::make('view')->make( + $this->template, + App::call([$this, 'data']) + ); + } + + /** + * Render the HTML string. + */ + public function toHtml(): string + { + return $this->render()->render(); + } + + /** + * Convert the panel to a string. + */ + public function __toString(): string + { + return $this->toHtml(); + } +} diff --git a/src/Http/Controllers/Auth/LoginController.php b/src/Http/Controllers/Auth/LoginController.php new file mode 100644 index 000000000..2291cbe62 --- /dev/null +++ b/src/Http/Controllers/Auth/LoginController.php @@ -0,0 +1,75 @@ +middleware('guest')->except('logout'); + } + + /** + * Show the application's login form. + */ + public function show(): Response + { + return ResponseFactory::view('root::auth.login'); + } + + /** + * Handle a login request to the application. + */ + public function login(Request $request): RedirectResponse + { + $validated = $request->validate([ + 'email' => ['required', 'string', 'email', 'max:256'], + 'password' => ['required', 'string'], + ]); + + if (! Auth::guard()->attempt($validated, $request->filled('remember'))) { + throw ValidationException::withMessages([ + 'email' => [__('auth.failed')], + ]); + } + + if (! Auth::guard()->user()->hasVerifiedEmail()) { + $this->logout($request); + + throw ValidationException::withMessages([ + 'email' => [__('auth.unverified')], + ]); + } + + $request->session()->regenerate(); + + return Redirect::intended(URL::route('root.dashboard')); + } + + /** + * Log the user out of the application. + */ + public function logout(Request $request): RedirectResponse + { + Auth::guard()->logout(); + + $request->session()->invalidate(); + + $request->session()->regenerateToken(); + + return Redirect::route('login'); + } +} diff --git a/src/Http/Controllers/DashboardController.php b/src/Http/Controllers/DashboardController.php index 5cc17a7c6..5026c6404 100644 --- a/src/Http/Controllers/DashboardController.php +++ b/src/Http/Controllers/DashboardController.php @@ -4,8 +4,8 @@ use Cone\Root\Root; use Illuminate\Http\Request; -use Inertia\Inertia; -use Inertia\Response; +use Illuminate\Http\Response; +use Illuminate\Support\Facades\Response as ResponseFactory; class DashboardController extends Controller { @@ -14,9 +14,8 @@ class DashboardController extends Controller */ public function __invoke(Request $request, Root $root): Response { - return Inertia::render('Dashboard', [ - 'title' => __('Dashboard'), - 'widgets' => $root->widgets->authorized($request)->toArray(), + return ResponseFactory::View('root::dashboard', [ + 'widgets' => $root->widgets->all(), ]); } } diff --git a/src/Http/Controllers/ExtractController.php b/src/Http/Controllers/ExtractController.php deleted file mode 100644 index a3fee32f7..000000000 --- a/src/Http/Controllers/ExtractController.php +++ /dev/null @@ -1,26 +0,0 @@ -route('rootExtract'); - - Gate::allowIf($extract->authorized($request)); - - return Inertia::render( - 'Extracts/Index', - $extract->toIndex($request) - ); - } -} diff --git a/src/Http/Controllers/MediaController.php b/src/Http/Controllers/MediaController.php deleted file mode 100644 index ecb7646c4..000000000 --- a/src/Http/Controllers/MediaController.php +++ /dev/null @@ -1,77 +0,0 @@ -route('rootField'); - - Gate::allowIf($field->authorized($request, $model)); - - $model ??= $request->route('rootResource')->getModelInstance(); - - return new JsonResponse($field->mapItems($request, $model)); - } - - /** - * Store a newly created resource in storage. - */ - public function store(Request $request, Model $model = null): JsonResponse - { - $field = $request->route('rootField'); - - Gate::allowIf($field->authorized($request, $model)); - - $request->validate(['file' => ['required', 'file']]); - - $model ??= $request->route('rootResource')->getModelInstance(); - - $file = $request->file('file'); - - $path = Storage::disk('local')->path("root-chunks/{$file->getClientOriginalName()}"); - - File::append($path, $file->get()); - - if ($request->header('X-Chunk-Index') !== $request->header('X-Chunk-Total')) { - return new JsonResponse('', JsonResponse::HTTP_NO_CONTENT); - } - - $medium = $field->store($request, $path); - - MoveFile::withChain($medium->convertible() ? [new PerformConversions($medium)] : []) - ->dispatch($medium, $path, false); - - return new JsonResponse($field->mapOption($request, $model, $medium), JsonResponse::HTTP_CREATED); - } - - /** - * Remove the specified resource from storage. - */ - public function destroy(Request $request, Model $model = null): JsonResponse - { - $field = $request->route('rootField'); - - Gate::allowIf($field->authorized($request, $model)); - - $field->resolveRelatableQuery($request, $model ?: $request->route('rootResource')->getModelInstance()) - ->find($request->input('models', [])) - ->each - ->delete(); - - return new JsonResponse('', JsonResponse::HTTP_NO_CONTENT); - } -} diff --git a/src/Http/Controllers/NotificationsController.php b/src/Http/Controllers/NotificationsController.php index b6a2051a3..ec6582e04 100644 --- a/src/Http/Controllers/NotificationsController.php +++ b/src/Http/Controllers/NotificationsController.php @@ -2,10 +2,8 @@ namespace Cone\Root\Http\Controllers; -use Cone\Root\Models\Notification; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Support\Facades\URL; class NotificationsController extends Controller { @@ -14,15 +12,13 @@ class NotificationsController extends Controller */ public function index(Request $request): JsonResponse { - $notifications = (Notification::proxy())::rootQuery($request) - ->filter($request) - ->latest() + $notifications = $request->user() + ->rootNotifications() ->paginate($request->input('per_page')) - ->setPath(URL::route('root.api.notifications.index', [], false)) ->withQueryString(); return new JsonResponse(array_merge($notifications->toArray(), [ - 'total_unread' => $request->user()->notifications()->unread()->count(), + 'total_unread' => $request->user()->rootNotifications()->unread()->count(), ])); } @@ -31,7 +27,7 @@ public function index(Request $request): JsonResponse */ public function show(Request $request, string $id): JsonResponse { - $notification = (Notification::proxy())::rootQuery($request)->findOrFail($id); + $notification = $request->user()->rootNotifications()->findOrFail($id); return new JsonResponse($notification); } @@ -41,7 +37,7 @@ public function show(Request $request, string $id): JsonResponse */ public function update(Request $request, string $id): JsonResponse { - $notification = (Notification::proxy())::rootQuery($request)->findOrFail($id); + $notification = $request->user()->rootNotifications()->findOrFail($id); $notification->markAsRead(); @@ -53,7 +49,7 @@ public function update(Request $request, string $id): JsonResponse */ public function destroy(Request $request, string $id): JsonResponse { - $notification = (Notification::proxy())::rootQuery($request)->findOrFail($id); + $notification = $request->user()->rootNotifications()->findOrFail($id); $notification->delete(); diff --git a/src/Http/Controllers/RelationController.php b/src/Http/Controllers/RelationController.php deleted file mode 100644 index ea47aa11c..000000000 --- a/src/Http/Controllers/RelationController.php +++ /dev/null @@ -1,143 +0,0 @@ -route('rootRelation'); - - Gate::allowIf($relation->getAbilities($model)['viewAny'] ?? false); - - return Inertia::render( - 'Relations/Index', - $relation->toIndex($request, $model) - ); - } - - /** - * Show the form for creating a new resource. - */ - public function create(Request $request, Model $model): Response - { - $relation = $request->route('rootRelation'); - - Gate::allowIf($relation->getAbilities($model)['create'] ?? false); - - return Inertia::render( - 'Resources/Form', - $relation->toCreate($request, $model) - ); - } - - /** - * Store a newly created resource in storage. - */ - public function store(Request $request, Model $model): RedirectResponse - { - $relation = $request->route('rootRelation'); - - Gate::allowIf($relation->getAbilities($model)['create'] ?? false); - - $item = $relation->newItem($model, $relation->getRelation($model)->getRelated()); - - $fields = $relation->resolveFields($request) - ->authorized($request, $item->model) - ->visible(ResourceContext::Create->value); - - $request->validate($fields->mapToValidate($request, $item->model)); - - $fields->persist($request, $item->model); - - $item->model->save(); - - return Redirect::to($item->resolveUrl($request)) - ->with('alerts.relation-created', Alert::success(__('The relation has been created!'))); - } - - /** - * Display the specified resource. - */ - public function show(Request $request, Model $model, Model $related): Response - { - $relation = $request->route('rootRelation'); - - Gate::allowIf($relation->newItem($model, $related)->getAbilities()['view'] ?? false); - - return Inertia::render( - 'Resources/Show', - $relation->toShow($request, $model, $related) - ); - } - - /** - * Show the form for editing the specified resource. - */ - public function edit(Request $request, Model $model, Model $related): Response - { - $relation = $request->route('rootRelation'); - - Gate::allowIf($relation->newItem($model, $related)->getAbilities()['update'] ?? false); - - return Inertia::render( - 'Resources/Form', - $relation->toEdit($request, $model, $related) - ); - } - - /** - * Update the specified resource in storage. - */ - public function update(Request $request, Model $model, Model $related): RedirectResponse - { - $relation = $request->route('rootRelation'); - - $item = $relation->newItem($model, $related); - - Gate::allowIf($item->getAbilities()['update'] ?? false); - - $fields = $relation->resolveFields($request) - ->authorized($request, $item->model) - ->visible(ResourceContext::Update->value); - - $request->validate($fields->mapToValidate($request, $item->model)); - - $fields->persist($request, $item->model); - - $item->model->save(); - - return Redirect::to($item->resolveUrl($request)) - ->with('alerts.relation-updated', Alert::success(__('The relation has been updated!'))); - } - - /** - * Remove the specified resource from storage. - */ - public function destroy(Request $request, Model $model, Model $related): RedirectResponse - { - $relation = $request->route('rootRelation'); - - $item = $relation->newItem($model, $related); - - Gate::allowIf($item->getAbilities()['delete'] ?? false); - - $item->model->delete(); - - return Redirect::to($item->resolveUrl($request)) - ->with('alerts.relation-deleted', Alert::success(__('The relation has been deleted!'))); - } -} diff --git a/src/Http/Controllers/RelationFieldController.php b/src/Http/Controllers/RelationFieldController.php deleted file mode 100644 index 0fb8201c9..000000000 --- a/src/Http/Controllers/RelationFieldController.php +++ /dev/null @@ -1,32 +0,0 @@ -route('rootField'); - - Gate::allowIf($field->authorized($request, $model)); - - $model ??= $request->route('rootResource')->getModelInstance(); - - $models = $field->resolveRelatableQuery($request, $model) - ->paginate() - ->setPath($field->getUri()) - ->through(static function (Model $related) use ($request, $model, $field): array { - return $field->mapOption($request, $model, $related); - }); - - return new JsonResponse($models); - } -} diff --git a/src/Http/Controllers/ResourceController.php b/src/Http/Controllers/ResourceController.php index 318023620..41c07b8cf 100644 --- a/src/Http/Controllers/ResourceController.php +++ b/src/Http/Controllers/ResourceController.php @@ -2,17 +2,16 @@ namespace Cone\Root\Http\Controllers; -use Cone\Root\Enums\ResourceContext; use Cone\Root\Http\Middleware\AuthorizeResource; +use Cone\Root\Resources\Resource; use Cone\Root\Support\Alert; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Redirect; -use Illuminate\Support\Facades\URL; -use Inertia\Inertia; -use Inertia\Response; +use Illuminate\Support\Facades\Response as ResponseFactory; class ResourceController extends Controller { @@ -27,16 +26,14 @@ public function __construct() /** * Display a listing of the resource. */ - public function index(Request $request): Response + public function index(Request $request, Resource $resource): Response { - $resource = $request->route('rootResource'); - if ($resource->getPolicy()) { $this->authorize('viewAny', $resource->getModel()); } - return Inertia::render( - 'Resources/Index', + return ResponseFactory::view( + 'root::resources.index', $resource->toIndex($request) ); } @@ -44,16 +41,14 @@ public function index(Request $request): Response /** * Show the form for creating a new resource. */ - public function create(Request $request): Response + public function create(Request $request, Resource $resource): Response { - $resource = $request->route('rootResource'); - if ($resource->getPolicy()) { $this->authorize('create', $resource->getModel()); } - return Inertia::render( - 'Resources/Form', + return ResponseFactory::view( + 'root::resources.form', $resource->toCreate($request) ); } @@ -61,62 +56,31 @@ public function create(Request $request): Response /** * Store a newly created resource in storage. */ - public function store(Request $request): RedirectResponse + public function store(Request $request, Resource $resource): RedirectResponse { - $resource = $request->route('rootResource'); - if ($resource->getPolicy()) { $this->authorize('create', $resource->getModel()); } $model = $resource->getModelInstance(); - $fields = $resource->resolveFields($request) - ->authorized($request, $model) - ->visible(ResourceContext::Update->value); - - $request->validate($fields->mapToValidate($request, $model)); - - $fields->persist($request, $model); - - $model->save(); - - $resource->created($request, $model); + $resource->form($model)->handle($request); - return Redirect::to(sprintf('%s/%s', $resource->getUri(), $model->getRouteKey())) + return Redirect::to($resource->modelUrl($model)) ->with('alerts.resource-created', Alert::success(__('The resource has been created!'))); } - /** - * Display the specified resource. - */ - public function show(Request $request, Model $model): Response - { - $resource = $request->route('rootResource'); - - if ($resource->getPolicy()) { - $this->authorize('view', $model); - } - - return Inertia::render( - 'Resources/Show', - $resource->toShow($request, $model) - ); - } - /** * Show the form for editing the specified resource. */ - public function edit(Request $request, Model $model): Response + public function edit(Request $request, Resource $resource, Model $model): Response { - $resource = $request->route('rootResource'); - if ($resource->getPolicy()) { $this->authorize('update', $model); } - return Inertia::render( - 'Resources/Form', + return ResponseFactory::view( + 'root::resources.form', $resource->toEdit($request, $model) ); } @@ -124,37 +88,23 @@ public function edit(Request $request, Model $model): Response /** * Update the specified resource in storage. */ - public function update(Request $request, Model $model): RedirectResponse + public function update(Request $request, Resource $resource, Model $model): RedirectResponse { - $resource = $request->route('rootResource'); - if ($resource->getPolicy()) { $this->authorize('update', $model); } - $fields = $resource->resolveFields($request) - ->authorized($request, $model) - ->visible(ResourceContext::Update->value); - - $request->validate($fields->mapToValidate($request, $model)); - - $fields->persist($request, $model); + $resource->toForm($request, $model)->handle($request); - $model->save(); - - $resource->updated($request, $model); - - return Redirect::to(sprintf('%s/%s/edit', $resource->getUri(), $model->getRouteKey())) + return Redirect::to($resource->modelUrl($model)) ->with('alerts.resource-updated', Alert::success(__('The resource has been updated!'))); } /** * Remove the specified resource from storage. */ - public function destroy(Request $request, Model $model): RedirectResponse + public function destroy(Request $request, Resource $resource, Model $model): RedirectResponse { - $resource = $request->route('rootResource'); - $trashed = in_array(SoftDeletes::class, class_uses_recursive($model)) && $model->trashed(); if ($resource->getPolicy()) { @@ -163,27 +113,21 @@ public function destroy(Request $request, Model $model): RedirectResponse $trashed ? $model->forceDelete() : $model->delete(); - $resource->deleted($request, $model); - - return Redirect::to(URL::previousPath() === $resource->getUri() ? URL::previous() : $resource->getUri()) + return Redirect::route('root.resource.index', $resource->getKey()) ->with('alerts.resource-deleted', Alert::success(__('The resource has been deleted!'))); } /** * Restore the specified resource in storage. */ - public function restore(Request $request, Model $model): RedirectResponse + public function restore(Request $request, Resource $resource, Model $model): RedirectResponse { - $resource = $request->route('rootResource'); - if ($resource->getPolicy()) { $this->authorize('restore', $model); } $model->restore(); - $resource->restored($request, $model); - return Redirect::back() ->with('alerts.resource-restored', Alert::success(__('The resource has been restored!'))); } diff --git a/src/Http/Controllers/ResourceFieldController.php b/src/Http/Controllers/ResourceFieldController.php new file mode 100644 index 000000000..88e1f608f --- /dev/null +++ b/src/Http/Controllers/ResourceFieldController.php @@ -0,0 +1,31 @@ +has('model') + ? $resource->resolveRouteBinding($request, $request->query('model')) + : $resource->getModelInstance(); + + $field = $resource->toForm($request, $model)->findField( + $request, $request->path() + ); + + if (is_null($field)) { + throw new NotFoundHttpException(); + } + + return $field->toResponse($request); + } +} diff --git a/src/Http/Middleware/Authenticate.php b/src/Http/Middleware/Authenticate.php new file mode 100644 index 000000000..d4ad2dd1c --- /dev/null +++ b/src/Http/Middleware/Authenticate.php @@ -0,0 +1,18 @@ +expectsJson() ? null : URL::route('root.auth.login'); + } +} diff --git a/src/Http/Middleware/AuthorizeResource.php b/src/Http/Middleware/AuthorizeResource.php index b2df419b8..e6dd049cb 100644 --- a/src/Http/Middleware/AuthorizeResource.php +++ b/src/Http/Middleware/AuthorizeResource.php @@ -3,6 +3,7 @@ namespace Cone\Root\Http\Middleware; use Closure; +use Cone\Root\Root; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; @@ -16,7 +17,7 @@ class AuthorizeResource */ public function handle(Request $request, Closure $next): mixed { - Gate::allowIf($request->route('rootResource')->authorized($request)); + // Gate::allowIf(Root::instance()->getCurrentResource()->authorized($request)); return $next($request); } diff --git a/src/Http/Middleware/HandleRootRequests.php b/src/Http/Middleware/HandleRootRequests.php index 8d1f7ea57..51e0a2b2a 100644 --- a/src/Http/Middleware/HandleRootRequests.php +++ b/src/Http/Middleware/HandleRootRequests.php @@ -2,38 +2,22 @@ namespace Cone\Root\Http\Middleware; +use Closure; use Cone\Root\Root; use Illuminate\Http\Request; -use Illuminate\Support\Arr; -use Illuminate\Support\Facades\App; -use Illuminate\Support\Str; -use Inertia\Middleware; +use Symfony\Component\HttpFoundation\Response; -class HandleRootRequests extends Middleware +class HandleRootRequests { /** - * The root template that's loaded on the first page visit. + * Handle an incoming request. * - * @var string + * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ - protected $rootView = 'root::app'; - - /** - * Defines the props that are shared by default. - */ - public function share(Request $request): array + public function handle(Request $request, Closure $next): Response { - return array_merge(parent::share($request), [ - 'alerts' => static function () use ($request): array { - return array_values(Arr::wrap($request->session()->get('alerts'))); - }, - 'csrf_token' => static function () use ($request): string { - return $request->session()->token(); - }, - 'url' => Str::start($request->path(), '/'), - 'breadcrumbs' => static function () use ($request): array { - return App::make(Root::class)->breadcrumbs->resolve($request); - }, - ]); + Root::instance()->boot(); + + return $next($request); } } diff --git a/src/Interfaces/AsForm.php b/src/Interfaces/AsForm.php new file mode 100644 index 000000000..94382942d --- /dev/null +++ b/src/Interfaces/AsForm.php @@ -0,0 +1,15 @@ + 'foo', + ]; + + /** + * The attributes that should be cast to native types. + * + * @var array + */ + protected $casts = [ + 'meta' => 'json', + ]; +} diff --git a/src/Models/FieldsetModel.php b/src/Models/FieldsetModel.php deleted file mode 100644 index 38d6a0417..000000000 --- a/src/Models/FieldsetModel.php +++ /dev/null @@ -1,30 +0,0 @@ -disk)->deleteDirectory($medium->id); + Storage::disk($medium->disk)->deleteDirectory($medium->uuid); }); } @@ -120,37 +115,31 @@ protected static function newFactory(): Factory /** * Make a new medium instance from the given path. */ - public static function makeFrom(string $path): static + public static function makeFromPath(string $path, array $attributes = []): static { - $name = preg_replace('/[\w]{5}__/iu', '', basename($path, '.chunk')); - $type = mime_content_type($path); if (! Str::is('image/svg*', $type) && Str::is('image/*', $type)) { [$width, $height] = getimagesize($path); } - return static::make([ - 'file_name' => $name, + return new static(array_merge([ + 'file_name' => $name = basename($path), 'mime_type' => $type, 'width' => isset($width) ? $width : null, 'height' => isset($height) ? $height : null, 'disk' => Config::get('root.media.disk', 'public'), 'size' => max(round(filesize($path) / 1024), 1), 'name' => pathinfo($name, PATHINFO_FILENAME), - ]); + ], $attributes)); } /** - * Create a new medium from the given path. + * Get the columns that should receive a unique identifier. */ - public static function createFrom(string $path): static + public function uniqueIds(): array { - $medium = static::makeFrom($path); - - $medium->save(); - - return $medium; + return ['uuid']; } /** @@ -158,7 +147,7 @@ public static function createFrom(string $path): static */ public function user(): BelongsTo { - return $this->belongsTo(User::getProxiedClass()); + return $this->belongsTo(get_class(App::make(User::class))); } /** @@ -179,16 +168,14 @@ protected function isImage(): Attribute protected function urls(): Attribute { return new Attribute( - get: function (mixed $value, array $attributes): array { - $urls = ['original' => $this->getUrl()]; - - if (! $this->convertible()) { - return $urls; - } - - return array_reduce($attributes['properties']['conversions'] ?? [], function (array $urls, string $conversion): array { - return array_merge($urls, [$conversion => $this->getUrl($conversion)]); - }, $urls); + get: function (): array { + return array_reduce( + $this->properties['conversions'] ?? [], + function (array $urls, string $conversion): array { + return array_merge($urls, [$conversion => $this->getUrl($conversion)]); + }, + ['original' => $this->getUrl()] + ); } ); } @@ -237,8 +224,6 @@ public function convertible(): bool /** * Perform the conversions on the medium. - * - * @return $this */ public function convert(): static { @@ -250,9 +235,9 @@ public function convert(): static /** * Get the path to the conversion. */ - public function getPath(?string $conversion = null, bool $absolute = false): string + public function getPath(string $conversion = null, bool $absolute = false): string { - $path = sprintf('%s/%s', $this->id, $this->file_name); + $path = sprintf('%s/%s', $this->uuid, $this->file_name); if (! is_null($conversion)) { $path = substr_replace( @@ -266,7 +251,7 @@ public function getPath(?string $conversion = null, bool $absolute = false): str /** * Get the full path to the conversion. */ - public function getAbsolutePath(?string $conversion = null): string + public function getAbsolutePath(string $conversion = null): string { return $this->getPath($conversion, true); } @@ -274,7 +259,7 @@ public function getAbsolutePath(?string $conversion = null): string /** * Get the url to the conversion. */ - public function getUrl(?string $conversion = null): string + public function getUrl(string $conversion = null): string { return URL::to(Storage::disk($this->disk)->url($this->getPath($conversion))); } @@ -282,7 +267,7 @@ public function getUrl(?string $conversion = null): string /** * Scope the query only to the given search term. */ - public function scopeSearch(Builder $query, ?string $value = null): Builder + public function scopeSearch(Builder $query, string $value = null): Builder { if (is_null($value)) { return $query; @@ -305,18 +290,4 @@ public function scopeType(Builder $query, string $value): Builder return $query; } } - - /** - * Sort the query by the given order. - */ - public function scopeSort(Builder $query, ?array $value = []): Builder - { - $value = array_replace(['by' => 'id', 'order' => 'desc'], (array) $value); - - if ($value['by'] === 'id') { - $value['by'] = $query->getModel()->getKeyName(); - } - - return $query->orderBy($query->qualifyColumn($value['by']), $value['order']); - } } diff --git a/src/Models/Meta.php b/src/Models/Meta.php index b8bf1a234..1fcd29b90 100644 --- a/src/Models/Meta.php +++ b/src/Models/Meta.php @@ -13,8 +13,8 @@ class Meta extends Model implements Contract { - use InteractsWithProxy; use HasFactory; + use InteractsWithProxy; /** * The attributes that are mass assignable. diff --git a/src/Models/Notification.php b/src/Models/Notification.php index d7e8ab40f..f3780000c 100644 --- a/src/Models/Notification.php +++ b/src/Models/Notification.php @@ -4,20 +4,15 @@ use Cone\Root\Database\Factories\NotificationFactory; use Cone\Root\Interfaces\Models\Notification as Contract; -use Cone\Root\Traits\Filterable; use Cone\Root\Traits\InteractsWithProxy; -use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Concerns\HasUuids; -use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Http\Request; use Illuminate\Notifications\DatabaseNotification; -use Illuminate\Support\Str; +use Illuminate\Support\Facades\URL; class Notification extends DatabaseNotification implements Contract { - use Filterable; use HasFactory; use HasUuids; use InteractsWithProxy; @@ -28,81 +23,72 @@ class Notification extends DatabaseNotification implements Contract * @var array */ protected $appends = [ - 'content', 'formatted_created_at', - 'formatted_type', - 'title', + 'is_read', + 'subject', + 'url', ]; /** - * Get the proxied interface. + * The table associated with the model. + * + * @var string */ - public static function getProxiedInterface(): string - { - return Contract::class; - } + protected $table = 'root_notifications'; /** * Create a new factory instance for the model. */ - protected static function newFactory(): Factory + protected static function newFactory(): NotificationFactory { return NotificationFactory::new(); } /** - * Create a new Eloquent query for the given Root request. + * Get the proxied interface. */ - public static function rootQuery(Request $request): Builder + public static function getProxiedInterface(): string { - return $request->user()->notifications()->getQuery(); + return Contract::class; } /** - * Get the formatted type attribute. + * Get the subject attribute. */ - protected function formattedType(): Attribute + protected function subject(): Attribute { return new Attribute( - get: static function (mixed $value, array $attributes): ?string { - return ! isset($attributes['type']) ? null : __(Str::headline(class_basename($attributes['type']))); - } + get: fn (): ?string => $this->data['subject'] ?? $this->getKey() ); } /** - * Get the title attribute. + * Get the formatted created at attribute. */ - protected function title(): Attribute + protected function formattedCreatedAt(): Attribute { return new Attribute( - get: function (mixed $value, array $attributes): ?string { - return $attributes['data']['title'] ?? $this->formattedType; - } + get: fn (): ?string => $this->created_at?->format('Y-m-d H:i'), ); } /** - * Get the content attribute. + * Get the formatted created at attribute. */ - protected function content(): Attribute + protected function isRead(): Attribute { return new Attribute( - get: static function (mixed $value, array $attributes): ?string { - return $attributes['data']['content'] ?? null; - } + get: fn (): bool => ! is_null($this->read_at), ); } /** - * Get the formatted created at attribute. + * Get the URL attribute. */ - protected function formattedCreatedAt(): Attribute + protected function url(): Attribute { return new Attribute( - get: function (): ?string { - return is_null($this->created_at) ? null : $this->created_at->diffForHumans(); - } + get: fn (): ?string => $this->exists ? URL::route('root.api.notifications.update', $this) : null, ); } } diff --git a/src/Models/Record.php b/src/Models/Record.php deleted file mode 100644 index 2b07a151b..000000000 --- a/src/Models/Record.php +++ /dev/null @@ -1,103 +0,0 @@ - - */ - protected $fillable = [ - 'description', - 'event', - 'properties', - ]; - - /** - * The attributes that should be cast to native types. - * - * @var array - */ - protected $casts = [ - 'properties' => 'json', - ]; - - /** - * The "type" of the primary key ID. - * - * @var string - */ - protected $keyType = 'string'; - - /** - * Indicates if the IDs are auto-incrementing. - * - * @var bool - */ - public $incrementing = false; - - /** - * The table associated with the model. - * - * @var string - */ - protected $table = 'root_records'; - - /** - * Create a new factory instance for the model. - */ - protected static function newFactory(): Factory - { - return RecordFactory::new(); - } - - /** - * Get the proxied interface. - */ - public static function getProxiedInterface(): string - { - return Contract::class; - } - - /** - * Get the user for the record. - */ - public function user(): BelongsTo - { - return $this->belongsTo(User::getProxiedClass()); - } - - /** - * Get the target for the record. - */ - public function target(): MorphTo - { - return $this->morphTo(); - } - - /** - * Get the resource representation of the model. - */ - public static function toResource(): RecordResource - { - return new RecordResource(static::class); - } -} diff --git a/src/Models/User.php b/src/Models/User.php deleted file mode 100644 index 9075f5413..000000000 --- a/src/Models/User.php +++ /dev/null @@ -1,150 +0,0 @@ - null, - 'email' => null, - ]; - - /** - * The attributes that should be cast to native types. - * - * @var array - */ - protected $casts = [ - 'deleted_at' => 'datetime', - 'email_verified_at' => 'datetime', - ]; - - /** - * The attributes that are mass assignable. - * - * @var array - */ - protected $fillable = [ - 'email', - 'name', - 'password', - ]; - - /** - * The attributes that should be hidden for arrays. - * - * @var array - */ - protected $hidden = [ - 'password', - 'remember_token', - ]; - - /** - * The "booted" method of the model. - */ - protected static function booted(): void - { - static::creating(static function (self $user): void { - $user->password = $user->password ?: Hash::make(Str::random(10)); - }); - } - - /** - * Create a new factory instance for the model. - */ - protected static function newFactory(): ?Factory - { - return get_called_class() === self::class ? UserFactory::new() : null; - } - - /** - * Get the proxied interface. - */ - public static function getProxiedInterface(): string - { - return Contract::class; - } - - /** - * Get the uploads for the user. - */ - public function uploads(): HasMany - { - return $this->hasMany(Medium::getProxiedClass()); - } - - /** - * Get the records for the user. - */ - public function records(): HasMany - { - return $this->hasMany(Record::getProxiedClass()); - } - - /** - * Get the notifications for the user. - */ - public function notifications(): MorphMany - { - return $this->morphMany(Notification::getProxiedClass(), 'notifiable')->latest(); - } - - /** - * Get the avatar attribute. - */ - protected function avatar(): Attribute - { - return new Attribute(get: static function (mixed $value, array $attributes): ?string { - return isset($attributes['email']) ? sprintf('https://www.gravatar.com/avatar/%s?d=mp', md5($attributes['email'])) : null; - }); - } - - /** - * Get the Root representation of the model. - */ - public function toRoot(): array - { - return array_merge($this->toArray(), [ - 'avatar' => $this->avatar, - ]); - } - - /** - * Get the resource representation of the model. - */ - public static function toResource(): Resource - { - return new Resource(static::class); - } -} diff --git a/src/Navigation/HasItems.php b/src/Navigation/HasItems.php new file mode 100644 index 000000000..928c615e9 --- /dev/null +++ b/src/Navigation/HasItems.php @@ -0,0 +1,66 @@ +add($item); + } + + /** + * Add new items. + */ + public function add(array|Item $items): static + { + foreach (Arr::wrap($items) as $item) { + $this->items[$item->url] = $item; + } + + return $this; + } + + /** + * Get the item. + */ + public function get(string $url): ?Item + { + return $this->items[$url] ?? null; + } + + /** + * Remove the item. + */ + public function remove(string $key): static + { + unset($this->items[$key]); + + return $this; + } + + /** + * Get the items. + */ + public function all(): array + { + return $this->items; + } +} diff --git a/src/Navigation/Item.php b/src/Navigation/Item.php new file mode 100644 index 000000000..76e68d8ab --- /dev/null +++ b/src/Navigation/Item.php @@ -0,0 +1,82 @@ +url($url); + $this->label($label); + $this->icon('archive'); + $this->group(__('General')); + $this->setAttributes($attributes); + } + + /** + * Set the item URL. + */ + public function url(string $url): static + { + return $this->setAttribute('url', URL::to($url)); + } + + /** + * Set the item label. + */ + public function label(string $label): static + { + return $this->setAttribute('label', $label); + } + + /** + * Set the item group. + */ + public function group(string $group): static + { + return $this->setAttribute('group', $group); + } + + /** + * Set the item icon. + */ + public function icon(string $icon): static + { + return $this->setAttribute('icon', $icon); + } + + /** + * Determine if the item URL matches the current URL. + */ + public function matched(): bool + { + return trim(URL::current(), '/') === trim($this->url, '/'); + } + + /** + * Determine if the item URL matches the current URL. + */ + public function partiallyMatched(): bool + { + return str_starts_with(URL::current(), $this->url); + } + + /** + * Get the given attribute. + */ + public function __get(string $key): mixed + { + return $this->getAttribute($key); + } +} diff --git a/src/Navigation/Location.php b/src/Navigation/Location.php new file mode 100644 index 000000000..d64778038 --- /dev/null +++ b/src/Navigation/Location.php @@ -0,0 +1,33 @@ +name = $name; + } + + /** + * Get the items by their groups. + */ + public function groups(): array + { + return array_reduce($this->items, static function (array $groups, Item $item): array { + $groups[$item->group][] = $item; + + return $groups; + }, []); + } +} diff --git a/src/Navigation/Manager.php b/src/Navigation/Manager.php new file mode 100644 index 000000000..0f992b4df --- /dev/null +++ b/src/Navigation/Manager.php @@ -0,0 +1,25 @@ +locations)) { + $this->locations[$name] = new Location($name); + } + + return $this->locations[$name]; + } +} diff --git a/src/Relations/BelongsTo.php b/src/Relations/BelongsTo.php deleted file mode 100644 index 959b63610..000000000 --- a/src/Relations/BelongsTo.php +++ /dev/null @@ -1,17 +0,0 @@ -relatableField = $this->newRelatableField(); - } - - /** - * {@inheritdoc} - */ - public function getRelation(Model $model): EloquentRelation - { - $relation = parent::getRelation($model); - - return $relation->withPivot($relation->newPivot()->getKeyName()); - } - - /** - * Get the relation abilities. - */ - public function getAbilities(Model $model): array - { - $name = Str::of($this->relation)->singular()->ucfirst()->value(); - - $policy = Gate::getPolicyFor($model); - - return [ - 'viewAny' => is_null($policy) || Gate::allows('viewAny'.$name.'Pivot', $model), - 'create' => is_null($policy) || Gate::allows('create'.$name.'Pivot', $model), - ]; - } - - /** - * Make a new item instance. - */ - public function newItem(Model $model, Model $related): PivotItem - { - $relation = $this->getRelation($model); - - $pivot = $related->relationLoaded($relation->getPivotAccessor()) - ? $related->getRelation($relation->getPivotAccessor()) - : $relation->newPivot(); - - $pivot->setRelation('parent', $model) - ->setRelation('related', $related) - ->setAttribute($pivot->getKeyName(), $pivot->getKey()) - ->setAttribute($relation->getForeignPivotKeyName(), $model->getKey()); - - return (new PivotItem($pivot, $this->relation))->url(function (Request $request) use ($pivot): string { - return $pivot->exists - ? sprintf('%s/%s', $this->replaceRoutePlaceholders($request->route()), $pivot->getRouteKey()) - : $this->replaceRoutePlaceholders($request->route()); - }); - } - - /** - * Make a new relatable field. - */ - public function newRelatableField(): BelongsTo - { - return BelongsTo::make($this->getRelatedName(), 'related', static function (Pivot $model): BelongsToRelation { - return $model->belongsTo( - get_class($model->getRelation('related')), - $model->getRelatedKey(), - $model->getForeignKey(), - 'related' - ); - }); - } - - /** - * Customize the relatable field. - */ - public function withRelatableField(Closure $callback): static - { - $this->relatableField = call_user_func_array($callback, [$this->relatableField]); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function fields(Request $request): array - { - return array_merge(parent::fields($request), [ - $this->relatableField, - ]); - } - - /** - * Resolve the resource model for a bound value. - */ - public function resolveRouteBinding(Request $request, string $id): Model - { - $relation = $this->getRelation($request->route()->parentOfParameter($this->getRouteKeyName())); - - return $relation->wherePivot($relation->newPivot()->getQualifiedKeyName(), $id)->firstOrFail(); - } -} diff --git a/src/Relations/HasMany.php b/src/Relations/HasMany.php deleted file mode 100644 index 88d21fb71..000000000 --- a/src/Relations/HasMany.php +++ /dev/null @@ -1,17 +0,0 @@ -relation = $relation; - } - - /** - * Get the policy for the model. - */ - public function getPolicy(): mixed - { - return Gate::getPolicyFor($this->model->getRelation('parent')); - } - - /** - * Resolve the abilities. - */ - public function getAbilities(): array - { - $policy = $this->getPolicy(); - - $parent = $this->model->getRelation('parent'); - - $relation = Str::of($this->relation)->singular()->ucfirst()->value(); - - return [ - 'view' => is_null($policy) || Gate::allows('view'.$relation, [$parent, $this->model]), - 'update' => is_null($policy) || Gate::allows('update'.$relation, [$parent, $this->model]), - 'delete' => is_null($policy) || Gate::allows('delete'.$relation, [$parent, $this->model]), - ]; - } -} diff --git a/src/Relations/MorphMany.php b/src/Relations/MorphMany.php deleted file mode 100644 index 0bba38201..000000000 --- a/src/Relations/MorphMany.php +++ /dev/null @@ -1,17 +0,0 @@ -getRelatedName(), 'related', static function (Pivot $model): MorphToRelation { - return $model->belongsTo( - get_class($model->getRelation('related')), - $model->getRelatedKey(), - $model->getForeignKey(), - 'related' - ); - }); - } -} diff --git a/src/Relations/PivotItem.php b/src/Relations/PivotItem.php deleted file mode 100644 index 6ca764f70..000000000 --- a/src/Relations/PivotItem.php +++ /dev/null @@ -1,29 +0,0 @@ -getPolicy(); - - $parent = $this->model->getRelation('parent'); - - $related = $this->model->getRelation('related'); - - $relation = Str::of($this->model->rootRelation)->singular()->ucfirst()->value(); - - return [ - 'view' => is_null($policy) || Gate::allows('view'.$relation.'Pivot', [$parent, $related]), - 'update' => is_null($policy) || Gate::allows('update'.$relation.'Pivot', [$parent, $related]), - 'delete' => is_null($policy) || Gate::allows('delete'.$relation.'Pivot', [$parent, $related]), - ]; - } -} diff --git a/src/Relations/Relation.php b/src/Relations/Relation.php deleted file mode 100644 index eb6afd84b..000000000 --- a/src/Relations/Relation.php +++ /dev/null @@ -1,327 +0,0 @@ -label = $label; - $this->relation = $relation; - } - - /** - * Get the URI key. - */ - public function getUriKey(): string - { - return $this->relation; - } - - /** - * Get the route key name. - */ - public function getRouteKeyName(): string - { - return Str::of($this->relation)->singular()->prepend('relation_')->value(); - } - - /** - * Get the relation instance. - */ - public function getRelation(Model $model): EloquentRelation - { - return call_user_func([$model, $this->relation]); - } - - /** - * Make a new related instance. - */ - public function newRelated(Model $model): Model - { - $relation = $this->getRelation($model); - - return $relation->getQuery()->newModelInstance()->setRelation('parent', $model); - } - - /** - * Get the relation abilities. - */ - public function getAbilities(Model $model): array - { - $name = Str::of($this->relation)->singular()->ucfirst()->value(); - - $policy = Gate::getPolicyFor($model); - - return [ - 'viewAny' => is_null($policy) || Gate::allows('viewAny'.$name, $model), - 'create' => is_null($policy) || Gate::allows('add'.$name, $model), - ]; - } - - /** - * Handle the resolving event on the field instance. - */ - protected function resolveField(Request $request, Field $field): void - { - $field->mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - }); - } - - /** - * Map the related models. - */ - public function mapItems(Request $request, Model $model): array - { - $filters = $this->resolveFilters($request)->authorized($request); - - $relation = $this->getRelation($model); - - $query = $filters->apply($request, $relation->getQuery())->latest(); - - $items = $relation->paginate($request->input('per_page')) - ->withQueryString() - ->setPath($this->replaceRoutePlaceholders($request->route())) - ->through(function (Model $related) use ($request, $model): array { - return $this->newItem($model, $related)->toDisplay( - $request, $this->resolveFields($request)->authorized($request, $related) - ); - }) - ->toArray(); - - return array_merge($items, [ - 'query' => $filters->mapToQuery($request, $query), - ]); - } - - /** - * Make a new item instance. - */ - public function newItem(Model $model, Model $related): Item - { - $related->setRelation('parent', $model); - - return (new Item($related, $this->relation))->url(function (Request $request) use ($related): string { - return $related->exists - ? sprintf('%s/%s', $this->replaceRoutePlaceholders($request->route()), $related->getRouteKey()) - : $this->replaceRoutePlaceholders($request->route()); - }); - } - - /** - * Resolve the resource model for a bound value. - */ - public function resolveRouteBinding(Request $request, string $id): Model - { - return $this->getRelation($request->route()->parentOfParameter($this->getRouteKeyName()))->findOrFail($id); - } - - /** - * Register the routes using the given router. - */ - public function registerRoutes(Router $router): void - { - $this->__registerRoutes($router); - - $request = App::make('request'); - - $router->prefix($this->getUriKey())->group(function (Router $router) use ($request): void { - $this->resolveFields($request)->registerRoutes($router); - $this->resolveActions($request)->registerRoutes($router); - $this->resolveWidgets($request)->registerRoutes($router); - }); - } - - /** - * The routes that should be registered. - */ - public function routes(Router $router): void - { - $router->get('/', [RelationController::class, 'index']); - $router->post('/', [RelationController::class, 'store']); - $router->get('/create', [RelationController::class, 'create']); - $router->get("/{{$this->getRouteKeyName()}}", [RelationController::class, 'show']); - $router->get("/{{$this->getRouteKeyName()}}/edit", [RelationController::class, 'edit']); - $router->patch("/{{$this->getRouteKeyName()}}", [RelationController::class, 'update']); - $router->delete("/{{$this->getRouteKeyName()}}", [RelationController::class, 'destroy']); - } - - /** - * Register the route constraints. - */ - public function registerRouteConstraints(Router $router): void - { - $router->bind($this->getRouteKeyName(), function (string $id) use ($router): Model { - return $this->resolveRouteBinding($router->getCurrentRequest(), $id); - }); - } - - /** - * Handle the routes registered event. - */ - public function routesRegistered(Router $router): void - { - App::make(Root::class)->breadcrumbs->patterns([ - $this->getUri() => $this->label, - sprintf('%s/create', $this->getUri()) => __('Create'), - sprintf('%s/{%s}', $this->getUri(), $this->getRouteKeyName()) => function (Request $request): string { - return $request->route()->originalParameter($this->getRouteKeyName()); - }, - sprintf('%s/{%s}/edit', $this->getUri(), $this->getRouteKeyName()) => __('Edit'), - ]); - } - - /** - * Get the related model name. - */ - public function getRelatedName(): string - { - return __(Str::of($this->relation)->singular()->headline()->value()); - } - - /** - * Get the instance as an array. - */ - public function toArray(): array - { - return [ - 'label' => $this->label, - 'relatedName' => $this->getRelatedName(), - ]; - } - - /** - * Get the table representation of the relation. - */ - public function toTable(Request $request, Model $model): array - { - return array_merge($this->toArray(), [ - 'url' => $this->replaceRoutePlaceholders($request->route()), - 'abilities' => $this->getAbilities($model), - 'items' => $this->getRelation($model) - ->latest() - ->paginate(5) - ->through(function (Model $related) use ($request, $model): array { - return $this->newItem($model, $related)->toDisplay( - $request, $this->resolveFields($request)->authorized($request, $related) - ); - }) - ->toArray(), - ]); - } - - /** - * Get the index representation of the relation. - */ - public function toIndex(Request $request, Model $model): array - { - $relation = $this->getRelation($model); - - return [ - 'actions' => $this->resolveActions($request) - ->authorized($request) - ->visible(ResourceContext::Index->value) - ->mapToForm($request, $relation->getRelated()), - 'filters' => $this->resolveFilters($request) - ->authorized($request) - ->mapToForm($request), - 'items' => $this->mapItems($request, $model), - 'title' => $this->label, - 'widgets' => $this->resolveWidgets($request)->authorized($request)->toArray(), - 'relation' => array_merge($this->toArray(), [ - 'url' => $this->replaceRoutePlaceholders($request->route()), - 'abilities' => $this->getAbilities($model), - ]), - ]; - } - - /** - * Get the index representation of the relation. - */ - public function toCreate(Request $request, Model $model): array - { - $related = $this->newRelated($model); - - return [ - 'model' => $this->newItem($model, $related)->toForm( - $request, - $this->resolveFields($request)->authorized($request, $model)->visible(ResourceContext::Create->value) - ), - 'title' => __('Create :model', ['model' => $this->getRelatedName()]), - ]; - } - - /** - * Get the index representation of the relation. - */ - public function toShow(Request $request, Model $model, Model $related): array - { - return [ - 'model' => ($item = $this->newItem($model, $related))->toDisplay( - $request, - $this->resolveFields($request)->authorized($request, $model)->visible(ResourceContext::Show->value) - ), - 'resource' => $request->route('rootResource')->toArray(), - 'title' => __(':model: :id', ['model' => $this->getRelatedName(), 'id' => $item->model->getKey()]), - ]; - } - - /** - * Get the index representation of the relation. - */ - public function toEdit(Request $request, Model $model, Model $related): array - { - return [ - 'model' => ($item = $this->newItem($model, $related))->toForm( - $request, - $this->resolveFields($request)->authorized($request, $model)->visible(ResourceContext::Update->value) - ), - 'title' => __('Edit :model: :id', ['model' => $this->getRelatedName(), 'id' => $item->model->getKey()]), - ]; - } -} diff --git a/src/Resources/Item.php b/src/Resources/Item.php deleted file mode 100644 index 2d2979351..000000000 --- a/src/Resources/Item.php +++ /dev/null @@ -1,124 +0,0 @@ -model = $model; - } - - /** - * Determine if the model is trashed. - */ - public function isTrashed(): bool - { - return in_array(SoftDeletes::class, class_uses_recursive($this->model)) - && $this->model->trashed(); - } - - /** - * Set the URL resolver callback. - */ - public function url(Closure $callback): static - { - $this->urlResolver = $callback; - - return $this; - } - - /** - * Resolve the URL for the item. - */ - public function resolveUrl(Request $request): string - { - return is_null($this->urlResolver) - ? sprintf('%s/%s', $request->url(), $this->model->getRouteKey()) - : call_user_func_array($this->urlResolver, [$request, $this->model]); - } - - /** - * Get the policy for the model. - */ - public function getPolicy(): mixed - { - return Gate::getPolicyFor($this->model); - } - - /** - * Resolve the abilities. - */ - public function getAbilities(): array - { - $policy = $this->getPolicy(); - - return [ - 'view' => is_null($policy) || Gate::allows('view', $this->model), - 'update' => is_null($policy) || Gate::allows('update', $this->model), - 'delete' => is_null($policy) || Gate::allows('delete', $this->model), - 'restore' => is_null($policy) || Gate::allows('restore', $this->model), - 'forceDelete' => is_null($policy) || Gate::allows('forceDelete', $this->model), - ]; - } - - /** - * Get the array representation of the object. - */ - public function toArray(): array - { - return [ - 'abilities' => $this->getAbilities(), - 'exists' => $this->model->exists, - 'id' => $this->model->getKey(), - 'trashed' => $this->isTrashed(), - ]; - } - - /** - * Get the displayable format of the object. - */ - public function toDisplay(Request $request, Fields $fields): array - { - return array_merge($this->toArray(), [ - 'fields' => $fields->mapToDisplay($request, $this->model), - 'url' => $this->resolveUrl($request), - ]); - } - - /** - * Get the from schema of the object. - */ - public function toForm(Request $request, Fields $fields): array - { - $fields = $fields->mapToForm($request, $this->model); - - return array_merge($this->toArray(), [ - 'data' => array_reduce($fields, static function (array $data, array $field): array { - return array_replace_recursive($data, [$field['name'] => $field['value']]); - }, []), - 'fields' => $fields, - 'url' => $this->resolveUrl($request), - ]); - } -} diff --git a/src/Resources/RecordResource.php b/src/Resources/RecordResource.php deleted file mode 100644 index 9faf7329b..000000000 --- a/src/Resources/RecordResource.php +++ /dev/null @@ -1,38 +0,0 @@ -display('name'), - Text::make(__('Target Type'), 'target_type'), - Text::make(__('Target ID'), 'target_id'), - Date::make(__('Created At'), 'created_at')->withTime(), - ]); - } -} diff --git a/src/Resources/Resource.php b/src/Resources/Resource.php index 1b00ef493..9466b9750 100644 --- a/src/Resources/Resource.php +++ b/src/Resources/Resource.php @@ -2,47 +2,25 @@ namespace Cone\Root\Resources; -use Cone\Root\Actions\Action; -use Cone\Root\Enums\ResourceContext; -use Cone\Root\Extracts\Extract; -use Cone\Root\Fields\Field; -use Cone\Root\Filters\Filter; -use Cone\Root\Filters\Search; -use Cone\Root\Filters\Sort; -use Cone\Root\Http\Controllers\ResourceController; -use Cone\Root\Interfaces\Routable; -use Cone\Root\Root; +use Cone\Root\Form\Form; +use Cone\Root\Interfaces\AsForm; +use Cone\Root\Interfaces\AsTable; +use Cone\Root\Table\Table; use Cone\Root\Traits\Authorizable; -use Cone\Root\Traits\RegistersRoutes; -use Cone\Root\Traits\ResolvesActions; -use Cone\Root\Traits\ResolvesExtracts; -use Cone\Root\Traits\ResolvesFields; -use Cone\Root\Traits\ResolvesFilters; -use Cone\Root\Traits\ResolvesRelations; use Cone\Root\Traits\ResolvesWidgets; -use Cone\Root\Widgets\Widget; use Illuminate\Contracts\Support\Arrayable; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Http\Request; -use Illuminate\Routing\Router; -use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Gate; +use Illuminate\Support\Facades\URL; use Illuminate\Support\Str; -class Resource implements Arrayable, Routable +class Resource implements Arrayable, AsForm, AsTable { use Authorizable; - use ResolvesActions; - use ResolvesExtracts; - use ResolvesFields; - use ResolvesFilters; - use ResolvesRelations; use ResolvesWidgets; - use RegistersRoutes { - RegistersRoutes::registerRoutes as __registerRoutes; - } /** * The model class. @@ -62,15 +40,7 @@ class Resource implements Arrayable, Routable /** * The icon for the resource. */ - protected string $icon = 'inventory-2'; - - /** - * Create a new resource instance. - */ - public function __construct(string $model) - { - $this->model = $model; - } + protected string $icon = 'archive'; /** * Get the model for the resource. @@ -96,22 +66,6 @@ public function getUriKey(): string return $this->getKey(); } - /** - * Get the route key name. - */ - public function getRouteKeyName(): string - { - return Str::of($this->getKey())->singular()->replace('-', '_')->prepend('resource_')->value(); - } - - /** - * Get the URI of the resource. - */ - public function getUri(): string - { - return Str::start(sprintf('%s/%s', App::make(Root::class)->getPath(), $this->getKey()), '/'); - } - /** * Get the name. */ @@ -162,19 +116,6 @@ public function getPolicy(): mixed return Gate::getPolicyFor($this->getModel()); } - /** - * Get the resource abilities. - */ - public function getAbilities(): array - { - $policy = $this->getPolicy(); - - return [ - 'viewAny' => is_null($policy) || Gate::check('viewAny', $this->getModel()), - 'create' => is_null($policy) || Gate::check('create', $this->getModel()), - ]; - } - /** * Set the relations to eagerload. */ @@ -212,167 +153,71 @@ public function resolveQuery(Request $request): Builder } /** - * Resolve the resource model for a bound value. + * Resolve the route binding query. */ - public function resolveRouteBinding(Request $request, string $id): Model + public function resolveRouteBindingQuery(Request $request): Builder { - return $this->resolveQuery($request) - ->when($this->isSoftDeletable(), static function (Builder $query): Builder { + return $this->resolveQuery($request)->when( + $this->isSoftDeletable(), + static function (Builder $query): Builder { return $query->withTrashed(); - }) - ->findOrFail($id); - } - - /** - * Define the filters for the resource. - */ - public function filters(Request $request): array - { - $fields = $this->resolveFields($request) - ->visible(ResourceContext::Index->value) - ->authorized($request, $this->getModelInstance()); - - $searchables = $fields->searchable($request); - - $sortables = $fields->sortable($request); - - return array_values(array_filter([ - $searchables->isNotEmpty() ? Search::make($searchables) : null, - $sortables->isNotEmpty() ? Sort::make($sortables) : null, - ])); - } - - /** - * Handle the resolving event on the field instance. - */ - protected function resolveField(Request $request, Field $field): void - { - $field->mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - }); - } - - /** - * Handle the resolving event on the filter instance. - */ - protected function resolveFilter(Request $request, Filter $filter): void - { - $filter->mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - }); - } - - /** - * Handle the resolving event on the action instance. - */ - protected function resolveAction(Request $request, Action $action): void - { - $action->mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - })->withQuery(function (Request $request): Builder { - return $this->resolveFilters($request) - ->authorized($request) - ->apply($request, $this->resolveQuery($request)); - }); - } - - /** - * Handle the resolving event on the extract instance. - */ - protected function resolveExtract(Request $request, Extract $extract): void - { - $extract->mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - })->withQuery(function (Request $request): Builder { - return $this->resolveQuery($request); - }); - } - - /** - * Handle the resolving event on the widget instance. - */ - protected function resolveWidget(Request $request, Widget $widget): void - { - $widget->mergeAuthorizationResolver(function (...$parameters): bool { - return $this->authorized(...$parameters); - }); - } - - /** - * Map the items. - */ - public function mapItems(Request $request): array - { - $filters = $this->resolveFilters($request)->authorized($request); - - $query = $this->resolveQuery($request); - - $items = $filters->apply($request, $query) - ->latest() - ->paginate($request->input('per_page')) - ->withQueryString() - ->setPath($this->getUri()) - ->through(function (Model $model) use ($request): array { - return $this->newItem($model)->toDisplay( - $request, - $this->resolveFields($request)->authorized($request, $model)->visible(ResourceContext::Index->value) - ); - }) - ->toArray(); - - return array_merge($items, [ - 'query' => $filters->mapToQuery($request, $query), - ]); + } + ); } /** - * Make a new item instance. + * Resolve the resource model for a bound value. */ - public function newItem(Model $model): Item + public function resolveRouteBinding(Request $request, string $id): Model { - return (new Item($model))->url(function () use ($model): string { - return $model->exists ? sprintf('%s/%s', $this->getUri(), $model->getRouteKey()) : $this->getUri(); - }); + return $this->resolveRouteBindingQuery($request)->findOrFail($id); } /** - * Handle the created event. + * Determine if the model soft deletable. */ - public function created(Request $request, Model $model): void + public function isSoftDeletable(): bool { - // + return in_array(SoftDeletes::class, class_uses_recursive($this->getModel())); } /** - * Handle the updated event. + * Get the resource URL. */ - public function updated(Request $request, Model $model): void + public function getUrl(): string { - // + return URL::route('root.resource.index', $this->getUriKey()); } /** - * Handle the deleted event. + * Get the URL for the given model. */ - public function deleted(Request $request, Model $model): void + public function modelUrl(Model $model): string { - // + return URL::route($model->exists ? 'root.resource.update' : 'root.resource.store', [$this->getUriKey(), $model]); } /** - * Handle the restored event. + * Make a new form for the model. */ - public function restored(Request $request, Model $model): void + public function toTable(Request $request, Builder $query): Table { - // + return (new Table($query)) + ->rowUrl(function (Request $request, Model $model): string { + return $this->modelUrl($model); + }); } /** - * Determine if the model soft deletable. + * Make a new form for the model. */ - public function isSoftDeletable(): bool + public function toForm(Request $request, Model $model): Form { - return in_array(SoftDeletes::class, class_uses_recursive($this->getModel())); + return new Form( + $model, + $this->modelUrl($model), + sprintf('/root/api/%s/form/fields', $this->getKey()) + ); } /** @@ -381,12 +226,12 @@ public function isSoftDeletable(): bool public function toArray(): array { return [ - 'abilities' => $this->getAbilities(), 'icon' => $this->getIcon(), 'key' => $this->getKey(), + 'model' => $this->getModel(), 'modelName' => $this->getModelName(), 'name' => $this->getName(), - 'url' => $this->getUri(), + 'uriKey' => $this->getUriKey(), ]; } @@ -395,18 +240,11 @@ public function toArray(): array */ public function toIndex(Request $request): array { - return [ - 'actions' => $this->resolveActions($request) - ->authorized($request) - ->visible(ResourceContext::Index->value) - ->mapToForm($request, $this->getModelInstance()), - 'filters' => $this->resolveFilters($request) - ->authorized($request) - ->mapToForm($request), - 'items' => $this->mapItems($request), + return array_merge($this->toArray(), [ 'title' => $this->getName(), - 'widgets' => $this->resolveWidgets($request)->authorized($request)->toArray(), - ]; + 'table' => $this->toTable($request, $this->resolveQuery($request)), + 'widgets' => $this->resolveWidgets($request)->all(), + ]); } /** @@ -414,141 +252,20 @@ public function toIndex(Request $request): array */ public function toCreate(Request $request): array { - $model = $this->getModelInstance(); - - return [ - 'model' => $this->newItem($model)->toForm( - $request, - $this->resolveFields($request)->authorized($request, $model)->visible(ResourceContext::Create->value) - ), + return array_merge($this->toArray(), [ 'title' => __('Create :model', ['model' => $this->getModelName()]), - ]; - } - - /** - * Get the show representation of the resource. - */ - public function toShow(Request $request, Model $model): array - { - return [ - 'actions' => $this->resolveActions($request) - ->visible(ResourceContext::Show->value) - ->authorized($request, $model) - ->mapToForm($request, $model), - 'model' => $this->newItem($model)->toDisplay( - $request, - $this->resolveFields($request)->authorized($request, $model)->visible(ResourceContext::Show->value) - ), - 'title' => __(':model: :id', ['model' => $this->getModelName(), 'id' => $model->getKey()]), - 'widgets' => $this->resolveWidgets($request)->authorized($request)->toArray(), - 'relations' => $this->resolveRelations($request) - ->authorized($request, $model) - ->mapToTable($request, $model), - ]; + 'form' => $this->toForm($request, $this->getModelInstance()), + ]); } /** * Get the edit representation of the resource. */ public function toEdit(Request $request, Model $model): array - { - return [ - 'model' => $this->newItem($model)->toForm( - $request, - $this->resolveFields($request)->authorized($request, $model)->visible(ResourceContext::Update->value) - ), - 'title' => __('Edit :model: :id', ['model' => $this->getModelName(), 'id' => $model->getKey()]), - ]; - } - - /** - * Get the navigation compatible format of the resource. - */ - public function toNavigation(Request $request): array { return array_merge($this->toArray(), [ - 'links' => $this->resolveExtracts($request) - ->authorized($request) - ->map(static function (Extract $extract): array { - return [ - 'url' => $extract->getUri(), - 'label' => $extract->getName(), - ]; - }) - ->toArray(), - ]); - } - - /** - * Handle the resource registered event. - */ - public function boot(Root $root): void - { - $root->routes(function (Router $router): void { - $this->registerRoutes($router); - }); - } - - /** - * Register the routes. - */ - public function registerRoutes(Router $router): void - { - $this->__registerRoutes($router); - - $request = App::make('request'); - - $router->prefix($this->getUriKey())->group(function (Router $router) use ($request): void { - $this->resolveWidgets($request)->registerRoutes($router); - $this->resolveExtracts($request)->registerRoutes($router); - $this->resolveActions($request)->registerRoutes($router); - $router->prefix("{{$this->getRouteKeyName()}}")->group(function (Router $router) use ($request): void { - $this->resolveFields($request)->registerRoutes($router); - $this->resolveRelations($request)->registerRoutes($router); - }); - }); - } - - /** - * Register the route constraints. - */ - public function registerRouteConstraints(Router $router): void - { - $router->bind($this->getRouteKeyName(), function (string $id) use ($router): Model { - return $this->resolveRouteBinding($router->getCurrentRequest(), $id); - }); - } - - /** - * The routes that should be registered. - */ - public function routes(Router $router): void - { - $router->get('/', [ResourceController::class, 'index']); - $router->get('/create', [ResourceController::class, 'create']); - $router->post('/', [ResourceController::class, 'store']); - $router->get("{{$this->getRouteKeyName()}}", [ResourceController::class, 'show']); - $router->get("{{$this->getRouteKeyName()}}/edit", [ResourceController::class, 'edit']); - $router->patch("{{$this->getRouteKeyName()}}", [ResourceController::class, 'update']); - $router->delete("{{$this->getRouteKeyName()}}", [ResourceController::class, 'destroy']); - - if ($this->isSoftDeletable()) { - $router->post("{{$this->getRouteKeyName()}}/restore", [ResourceController::class, 'restore']); - } - } - - /** - * Handle the routes registered event. - */ - public function routesRegistered(Router $router): void - { - App::make(Root::class)->breadcrumbs->patterns([ - $this->getUri() => $this->getName(), - sprintf('%s/create', $this->getUri()) => __('Create'), - sprintf('%s/{%s}', $this->getUri(), $this->getRouteKeyName()) => function (Request $request): string { - return $request->route()->originalParameter($this->getRouteKeyName()); - }, - sprintf('%s/{%s}/edit', $this->getUri(), $this->getRouteKeyName()) => __('Edit'), + 'title' => '', + 'form' => $this->toForm($request, $model), ]); } } diff --git a/src/Resources/Resources.php b/src/Resources/Resources.php new file mode 100644 index 000000000..c62d96063 --- /dev/null +++ b/src/Resources/Resources.php @@ -0,0 +1,82 @@ +resources = new Collection($resources); + } + + /** + * Register the given resource into the collection. + */ + public function register(array|Resource $resources): void + { + foreach (Arr::wrap($resources) as $resource) { + $this->resources->put($resource->getKey(), $resource); + } + } + + /** + * Resolve the resource registered with the given key. + */ + public function resolve(string $key): Resource + { + if (! $this->resources->has($key)) { + throw new ResourceResolutionException(); + } + + return $this->resources->get($key); + } + + /** + * Resolve the current resource. + */ + public function current(Request $request): ?Resource + { + if (empty($request->route()->action['__resource__'])) { + return null; + } + + try { + return $this->resolve($request->route()->action['__resource__']); + } catch (Throwable $exception) { + return null; + } + } + + /** + * Filter the authorized resources. + */ + public function authorized(Request $request): static + { + return $this->resources->filter->authorized($request)->values(); + } + + /** + * Handle the dynamic method call. + */ + public function __call($method, $parameters): mixed + { + return $this->forwardCallTo($this->resources, $method, $parameters); + } +} diff --git a/src/Root.php b/src/Root.php index bf99bc7a2..b974a0a96 100644 --- a/src/Root.php +++ b/src/Root.php @@ -3,12 +3,12 @@ namespace Cone\Root; use Closure; -use Cone\Root\Support\Breadcrumbs; -use Cone\Root\Support\Collections\Assets; -use Cone\Root\Support\Collections\Resources; -use Cone\Root\Support\Collections\Widgets; +use Cone\Root\Resources\Resource; +use Cone\Root\Resources\Resources; +use Cone\Root\Widgets\Widgets; use Illuminate\Contracts\Foundation\Application; use Illuminate\Http\Request; +use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Route; use Illuminate\Support\Str; @@ -20,18 +20,13 @@ class Root * * @var string */ - public const VERSION = '1.3.0'; + public const VERSION = '2.0.0-alpha'; /** * The registered booting callbacks. */ protected array $booting = []; - /** - * The registered booted callbacks. - */ - protected array $booted = []; - /** * The Application instance. */ @@ -47,13 +42,6 @@ class Root */ public readonly Widgets $widgets; - /** - * The assets collection. - */ - public readonly Assets $assets; - - public readonly Breadcrumbs $breadcrumbs; - /** * Create a new Root instance. */ @@ -62,8 +50,14 @@ public function __construct(Application $app) $this->app = $app; $this->resources = new Resources(); $this->widgets = new Widgets(); - $this->assets = new Assets(); - $this->breadcrumbs = new Breadcrumbs(); + } + + /** + * Resolve the Root instance from the container. + */ + public static function instance(): static + { + return App::make(static::class); } /** @@ -74,16 +68,6 @@ public function boot(): void foreach ($this->booting as $callback) { call_user_func_array($callback, [$this]); } - - if ($this->getPath() !== '/' && $this->app['request']->path() !== trim($this->getPath(), '/')) { - $this->breadcrumbs->pattern($this->getPath(), __('Dashboard')); - } - - $this->resources->each->boot($this); - - foreach ($this->booted as $callback) { - call_user_func_array($callback, [$this]); - } } /** @@ -94,14 +78,6 @@ public function booting(Closure $callback): void $this->booting[] = $callback; } - /** - * Register a booted callback. - */ - public function booted(Closure $callback): void - { - $this->booted[] = $callback; - } - /** * Determine if Root should run on the given request. */ @@ -144,4 +120,12 @@ public function getDomain(): string { return (string) Config::get('root.domain', null); } + + /** + * Get the current resource. + */ + public function getCurrentResource(): ?Resource + { + return $this->resources->current($this->app['request']); + } } diff --git a/src/RootApplicationServiceProvider.php b/src/RootApplicationServiceProvider.php index 336708818..86b34d2cc 100644 --- a/src/RootApplicationServiceProvider.php +++ b/src/RootApplicationServiceProvider.php @@ -23,43 +23,24 @@ public function boot(): void { $this->gate(); - $this->app->make('root')->booting(function (Root $root): void { - $this->registerResources($root); - $this->registerWidgets($root); - $this->registerRoutes($root); - }); + $this->registerResources(); + $this->registerWidgets(); } /** * Register the resources. */ - protected function registerResources(Root $root): void + protected function registerResources(): void { - foreach ($this->resources() as $resource) { - $root->resources->register($resource); - } + $this->app->make(Root::class)->resources->register($this->resources()); } /** * Register the widgets. */ - protected function registerWidgets(Root $root): void + protected function registerWidgets(): void { - foreach ($this->widgets() as $widget) { - $root->widgets->push($widget); - } - } - - /** - * Register the routes. - */ - protected function registerRoutes(Root $root): void - { - $root->routes(function (Router $router) use ($root): void { - $router->prefix('dashboard')->group(function (Router $router) use ($root): void { - $root->widgets->registerRoutes($router); - }); - }); + $this->app->make(Root::class)->widgets->register($this->widgets()); } /** diff --git a/src/RootServiceProvider.php b/src/RootServiceProvider.php index 4407e321b..41d3427dd 100644 --- a/src/RootServiceProvider.php +++ b/src/RootServiceProvider.php @@ -2,8 +2,18 @@ namespace Cone\Root; +use Cone\Root\Resources\Resource; +use Cone\Root\Support\Facades\Navigation as Nav; +use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Contracts\Foundation\Application; use Illuminate\Contracts\View\View; +use Illuminate\Cookie\Middleware\EncryptCookies; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Http\Request; +use Illuminate\Routing\Route; +use Illuminate\Routing\Router; +use Illuminate\Support\Facades\Blade; +use Illuminate\Support\Facades\RateLimiter; use Illuminate\Support\ServiceProvider; class RootServiceProvider extends ServiceProvider @@ -15,8 +25,6 @@ class RootServiceProvider extends ServiceProvider Interfaces\Models\Medium::class => Models\Medium::class, Interfaces\Models\Meta::class => Models\Meta::class, Interfaces\Models\Notification::class => Models\Notification::class, - Interfaces\Models\Record::class => Models\Record::class, - Interfaces\Models\User::class => Models\User::class, ]; /** @@ -24,6 +32,7 @@ class RootServiceProvider extends ServiceProvider */ public array $singletons = [ Interfaces\Conversion\Manager::class => Conversion\Manager::class, + Interfaces\Navigation\Manager::class => Navigation\Manager::class, ]; /** @@ -41,8 +50,8 @@ public function register(): void $this->mergeConfigFrom(__DIR__.'/../config/root.php', 'root'); } - $this->app->booted(static function (Application $app): void { - $app->make(Root::class)->boot(); + $this->app->afterResolving(EncryptCookies::class, static function (EncryptCookies $middleware): void { + $middleware->disableFor('__root_theme'); }); } @@ -57,10 +66,9 @@ public function boot(): void $this->registerPublishes(); } - $this->loadViewsFrom(__DIR__.'/../resources/views', 'root'); - - $this->registerComposers(); + $this->registerViews(); $this->registerRoutes(); + $this->registerNavigation(); } /** @@ -73,7 +81,7 @@ protected function registerPublishes(): void ], 'root-config'); $this->publishes([ - __DIR__.'/../public' => public_path('vendor/root'), + __DIR__.'/../public' => $this->app->publicPath('vendor/root'), ], 'root-compiled'); $this->publishes([ @@ -103,9 +111,36 @@ protected function registerRoutes(): void 'root', $this->app['config']->get('root.middleware', []) ); - $this->app->make(Root::class)->routes(function (): void { + $root = $this->app->make(Root::class); + + $this->app['router']->bind('resource', static function (string $key) use ($root): Resource { + return $root->resources->resolve($key); + }); + + $this->app['router']->bind('resourceModel', function (string $id, Route $route): Model { + return $route->parameter('resource')->resolveRouteBinding($this->app['request'], $id); + }); + + $this->app['router'] + ->middleware(['web']) + ->domain($root->getDomain()) + ->prefix($root->getPath()) + ->as('root.auth.') + ->group(function (): void { + $this->loadRoutesFrom(__DIR__.'/../routes/auth.php'); + }); + + $root->routes(function (Router $router): void { + $router->prefix('api')->as('api.')->group(function (): void { + $this->loadRoutesFrom(__DIR__.'/../routes/api.php'); + }); + $this->loadRoutesFrom(__DIR__.'/../routes/web.php'); }); + + RateLimiter::for('root.auth', static function (Request $request): Limit { + return Limit::perMinute(6)->by($request->user()?->id ?: $request->ip()); + }); } /** @@ -116,7 +151,6 @@ protected function registerCommands(): void $this->commands([ Console\Commands\ActionMake::class, Console\Commands\ClearChunks::class, - Console\Commands\ExtractMake::class, Console\Commands\FieldMake::class, Console\Commands\FilterMake::class, Console\Commands\Install::class, @@ -127,27 +161,37 @@ protected function registerCommands(): void } /** - * Register the view composers. + * Register the views. */ - protected function registerComposers(): void + protected function registerViews(): void { - $this->app['view']->composer('root::app', static function (View $view): void { - $app = $view->getFactory()->getContainer(); - - $root = $app->make(Root::class); - - $request = $app->make('request'); - - $view->with('root', [ - 'resources' => $root->resources->authorized($request)->mapToNavigation($request), - 'translations' => (object) $app['translator']->getLoader()->load($app->getLocale(), '*', '*'), - 'user' => $request->user()->toRoot(), - 'config' => [ - 'name' => $app['config']->get('app.name'), - 'url' => $root->getPath(), - 'branding' => $app['config']->get('root.branding'), - ], + $this->loadViewsFrom(__DIR__.'/../resources/views', 'root'); + + Blade::componentNamespace('Cone\\Root\\View\\Components', 'root'); + + $this->app['view']->composer('root::*', function (View $view): void { + $request = $this->app->make('request'); + + $view->with([ + 'alerts' => $request->session()->get('alerts', []), + 'user' => $request->user(), ]); }); } + + /** + * Register the navigation. + */ + protected function registerNavigation(): void + { + $this->app->make(Root::class)->booting(static function (Root $root): void { + $root->resources->each(static function (Resource $resource): void { + Nav::location('sidebar')->new( + $resource->getUrl(), + $resource->getName(), + ['icon' => $resource->getIcon()] + ); + }); + }); + } } diff --git a/src/Support/Alert.php b/src/Support/Alert.php index fbfebae9a..dbf6f88d3 100644 --- a/src/Support/Alert.php +++ b/src/Support/Alert.php @@ -2,13 +2,20 @@ namespace Cone\Root\Support; -use Cone\Root\Enums\AlertType; use Illuminate\Contracts\Support\Arrayable; use Illuminate\Contracts\Support\Jsonable; use Stringable; class Alert implements Arrayable, Jsonable, Stringable { + public const INFO = 'info'; + + public const SUCCESS = 'success'; + + public const ERROR = 'error'; + + public const WARNING = 'warning'; + /** * The alert message. */ @@ -17,53 +24,47 @@ class Alert implements Arrayable, Jsonable, Stringable /** * The alert type. */ - protected AlertType $type; - - /** - * The alert timestamp. - */ - protected string $timestamp; + protected string $type; /** * Create a new alert instance. */ - public function __construct(string $message, AlertType $type) + public function __construct(string $message, string $type = self::INFO) { $this->message = $message; $this->type = $type; - $this->timestamp = date(DATE_ATOM); } /** * Make a new info alert instance. */ - public static function info(string $message): static + public static function info(string $message): array { - return new static($message, AlertType::Info); + return (new static($message, static::INFO))->toArray(); } /** * Make a new success alert instance. */ - public static function success(string $message): static + public static function success(string $message): array { - return new static($message, AlertType::Success); + return (new static($message, static::SUCCESS))->toArray(); } /** * Make a new error alert instance. */ - public static function error(string $message): static + public static function error(string $message): array { - return new static($message, AlertType::Error); + return (new static($message, static::ERROR))->toArray(); } /** * Make a new warning alert instance. */ - public static function warning(string $message): static + public static function warning(string $message): array { - return new static($message, AlertType::Warning); + return (new static($message, static::WARNING))->toArray(); } /** @@ -73,7 +74,6 @@ public function toArray(): array { return [ 'message' => $this->message, - 'timestamp' => $this->timestamp, 'type' => $this->type, ]; } diff --git a/src/Support/Asset.php b/src/Support/Asset.php deleted file mode 100644 index dc99c5b6e..000000000 --- a/src/Support/Asset.php +++ /dev/null @@ -1,86 +0,0 @@ -key = $key; - $this->path = $path; - $this->type = $type; - $this->url = $url; - } - - /** - * Get the key. - */ - public function getKey(): string - { - return $this->key; - } - - /** - * Get the type. - */ - public function getType(): AssetType - { - return $this->type; - } - - /** - * Get the path. - */ - public function getPath(): string - { - return $this->path; - } - - /** - * Get the URL. - */ - public function getUrl(): string - { - if (! is_null($this->url)) { - return $this->url; - } - - if ($this->getType() === AssetType::Icon) { - return sprintf('#icon-%s', $this->getKey()); - } - - $path = $this->getPath(); - - if (str_contains($path, App::resourcePath())) { - return sprintf('%s/%s', basename(dirname($path)), basename($path)); - } - - return sprintf('vendor/%s/%s', $this->getKey(), basename($path)); - } -} diff --git a/src/Support/Collections/Actions.php b/src/Support/Collections/Actions.php deleted file mode 100644 index d3e02764a..000000000 --- a/src/Support/Collections/Actions.php +++ /dev/null @@ -1,59 +0,0 @@ -push($action); - } - - return $this; - } - - /** - * Filter the actions that are available for the current request and model. - */ - public function authorized(Request $request, ?Model $model = null): static - { - return $this->filter->authorized($request, $model)->values(); - } - - /** - * Filter the actions that are visible in the given context. - */ - public function visible(string|array $context): static - { - return $this->filter->visible($context)->values(); - } - - /** - * Map the actions to form. - */ - public function mapToForm(Request $request, Model $model): array - { - return $this->map->toForm($request, $model)->toArray(); - } - - /** - * Register the action routes. - */ - public function registerRoutes(Router $router): void - { - $router->prefix('actions')->group(function (Router $router): void { - $this->each->registerRoutes($router); - }); - } -} diff --git a/src/Support/Collections/Assets.php b/src/Support/Collections/Assets.php deleted file mode 100644 index aa476bef3..000000000 --- a/src/Support/Collections/Assets.php +++ /dev/null @@ -1,71 +0,0 @@ -put($asset->getKey(), $asset); - } - - /** - * Register a new style. - */ - public function style(string $key, string $path, ?string $url = null): void - { - $asset = new Asset($key, AssetType::Style, $path, $url); - - $this->put($asset->getKey(), $asset); - } - - /** - * Register a new icon. - */ - public function icon(string $key, string $path, ?string $url = null): void - { - $asset = new Asset($key, AssetType::Icon, $path, $url); - - $this->put($asset->getKey(), $asset); - } - - /** - * Get the registered scripts. - */ - public function scripts(): static - { - return $this->filter(static function (Asset $asset): bool { - return $asset->getType() === AssetType::Script; - }); - } - - /** - * Get the registered styles. - */ - public function styles(): static - { - return $this->filter(static function (Asset $asset): bool { - return $asset->getType() === AssetType::Style; - }); - } - - /** - * Get the registered icons. - */ - public function icons(): static - { - return $this->filter(static function (Asset $asset): bool { - return $asset->getType() === AssetType::Icon; - }); - } -} diff --git a/src/Support/Collections/Extracts.php b/src/Support/Collections/Extracts.php deleted file mode 100644 index ec795b1e8..000000000 --- a/src/Support/Collections/Extracts.php +++ /dev/null @@ -1,42 +0,0 @@ -push($extract); - } - - return $this; - } - - /** - * Filter the extracts that are authorized for the given request. - */ - public function authorized(Request $request): static - { - return $this->filter->authorized($request)->values(); - } - - /** - * Register the extract routes. - */ - public function registerRoutes(Router $router): void - { - $router->prefix('extracts')->group(function (Router $router): void { - $this->each->registerRoutes($router); - }); - } -} diff --git a/src/Support/Collections/Fields.php b/src/Support/Collections/Fields.php deleted file mode 100644 index 0152701a5..000000000 --- a/src/Support/Collections/Fields.php +++ /dev/null @@ -1,110 +0,0 @@ -push($field); - } - - return $this; - } - - /** - * Filter the fields that are available for the current request and model. - */ - public function authorized(Request $request, ?Model $model = null): static - { - return $this->filter->authorized($request, $model)->values(); - } - - /** - * Filter the fields that are visible in the given context. - */ - public function visible(string|array $context): static - { - return $this->filter->visible($context)->values(); - } - - /** - * Filter the searchable fields. - */ - public function searchable(Request $request): static - { - return $this->filter->isSearchable($request); - } - - /** - * Filter the sortable fields. - */ - public function sortable(Request $request): static - { - return $this->filter->isSortable($request); - } - - /** - * Persist the request value on the model. - */ - public function persist(Request $request, Model $model): void - { - $this->each(static function (Field $field) use ($request, $model): void { - $field->persist( - $request, $model, $field->getValueForHydrate($request, $model) - ); - }); - } - - /** - * Map the fields to display. - */ - public function mapToDisplay(Request $request, Model $model): array - { - return $this->map->toDisplay($request, $model)->toArray(); - } - - /** - * Map the fields to form. - */ - public function mapToForm(Request $request, Model $model): array - { - return $this->map->toInput($request, $model)->toArray(); - } - - /** - * Map the fields to validate. - */ - public function mapToValidate(Request $request, Model $model): array - { - return $this->reduce(static function (array $rules, Field $field) use ($request, $model): array { - return array_merge_recursive($rules, $field->toValidate($request, $model)); - }, []); - } - - /** - * Register the field routes. - */ - public function registerRoutes(Router $router): void - { - $router->prefix('fields')->group(function (Router $router): void { - $this->each(static function (Field $field) use ($router): void { - if ($field instanceof Routable) { - $field->registerRoutes($router); - } - }); - }); - } -} diff --git a/src/Support/Collections/Filters.php b/src/Support/Collections/Filters.php deleted file mode 100644 index 8fd9e29aa..000000000 --- a/src/Support/Collections/Filters.php +++ /dev/null @@ -1,67 +0,0 @@ -push($filter); - } - - return $this; - } - - /** - * Filter the filters that are available for the given request. - */ - public function authorized(Request $request): static - { - return $this->filter->authorized($request)->values(); - } - - /** - * Apply the filters on the query. - */ - public function apply(Request $request, Builder $query): Builder - { - $this->filter(static function (Filter $filter) use ($request): bool { - return $request->has($filter->getKey()); - })->each(static function (Filter $filter) use ($query, $request): void { - $filter->apply($request, $query, $request->input($filter->getKey())); - }); - - return $query; - } - - /** - * Map the filters to form. - */ - public function mapToForm(Request $request): array - { - return $this->reject->functional()->map->toInput($request)->values()->toArray(); - } - - /** - * Map the filters into their query representation. - */ - public function mapToQuery(Request $request, Builder $query): array - { - return $this->reduce(static function (array $values, Filter $filter) use ($request): array { - return array_replace($values, [$filter->getKey() => $filter->default($request)]); - }, [ - 'page' => (int) $request->query('page', 1), - 'per_page' => (int) $request->query('per_page', $query->getModel()->getPerPage()), - ]); - } -} diff --git a/src/Support/Collections/Relations.php b/src/Support/Collections/Relations.php deleted file mode 100644 index a78777501..000000000 --- a/src/Support/Collections/Relations.php +++ /dev/null @@ -1,51 +0,0 @@ -push($relation); - } - - return $this; - } - - /** - * Filter the relations that are available for the current request and model. - */ - public function authorized(Request $request, ?Model $model = null): static - { - return $this->filter->authorized($request, $model)->values(); - } - - /** - * Map the relations to table. - */ - public function mapToTable(Request $request, Model $model): array - { - return $this->map->toTable($request, $model)->toArray(); - } - - /** - * Register the field routes. - */ - public function registerRoutes(Router $router): void - { - $router->prefix('relations')->group(function (Router $router): void { - $this->each->registerRoutes($router); - }); - } -} diff --git a/src/Support/Collections/Resources.php b/src/Support/Collections/Resources.php deleted file mode 100644 index b17e99c96..000000000 --- a/src/Support/Collections/Resources.php +++ /dev/null @@ -1,47 +0,0 @@ -put($resource->getKey(), $resource); - } - - /** - * Resolve the resource registered with the given key. - */ - public function resolve(string $key): Resource - { - if (! $this->has($key)) { - throw new ResourceResolutionException(); - } - - return $this->get($key); - } - - /** - * Filter the authorized resources. - */ - public function authorized(Request $request): static - { - return $this->filter->authorized($request)->values(); - } - - /** - * Map the resources into navigation compatible format. - */ - public function mapToNavigation(Request $request): array - { - return $this->map->toNavigation($request)->toArray(); - } -} diff --git a/src/Support/Collections/Widgets.php b/src/Support/Collections/Widgets.php deleted file mode 100644 index fe176db5d..000000000 --- a/src/Support/Collections/Widgets.php +++ /dev/null @@ -1,51 +0,0 @@ -push($widget); - } - - return $this; - } - - /** - * Filter the widgets that are available for the current request and model. - */ - public function authorized(Request $request, ?Model $model = null): static - { - return $this->filter->authorized($request, $model)->values(); - } - - /** - * Filter the widgets that are visible in the given context. - */ - public function visible(string|array $context): static - { - return $this->filter->visible($context)->values(); - } - - /** - * Register the widget routes. - */ - public function registerRoutes(Router $router): void - { - $router->prefix('widgets')->group(function (Router $router): void { - $this->each->registerRoutes($router); - }); - } -} diff --git a/src/Support/Element.php b/src/Support/Element.php new file mode 100644 index 000000000..8c80f851a --- /dev/null +++ b/src/Support/Element.php @@ -0,0 +1,74 @@ +setAttribute('id', strtolower($value)); + } + + /** + * Render the element. + */ + public function render(): View + { + return ViewFactory::make( + $this->template, + $this->toArray() + ); + } + + /** + * Convert the element to a JSON serializable format. + */ + public function jsonSerialize(): mixed + { + return $this->toArray(); + } + + /** + * Convert the element to an array. + */ + public function toArray(): array + { + return [ + 'attrs' => $this->newAttributeBag(), + ]; + } + + /** + * Convert the element to an HTML string. + */ + public function toHtml(): string + { + return $this->render()->render(); + } + + /** + * Convert the element to a string. + */ + public function __toString(): string + { + return $this->toHtml(); + } +} diff --git a/src/Support/Facades/Navigation.php b/src/Support/Facades/Navigation.php new file mode 100644 index 000000000..8c6e16bfa --- /dev/null +++ b/src/Support/Facades/Navigation.php @@ -0,0 +1,22 @@ +model ->newQuery() - ->when(in_array(SoftDeletes::class, class_uses_recursive($this->model)), static function (Builder $query): Builder { - return $query->withTrashed(); - }) - ->whereRaw(sprintf("`%s` regexp '^%s(%s[\\\\d]+)?$'", $this->to, preg_quote($value), preg_quote($this->separator))) + ->when( + in_array(SoftDeletes::class, class_uses_recursive($this->model)), + static function (Builder $query): Builder { + return $query->withTrashed(); + } + ) + ->whereRaw(sprintf( + "`%s` regexp '^%s(%s[\\\\d]+)?$'", + $this->to, + preg_quote($value), + preg_quote($this->separator) + )) ->orderByDesc($this->to) ->limit(1) ->value($this->to); diff --git a/src/Table/Actions/Action.php b/src/Table/Actions/Action.php new file mode 100644 index 000000000..59d60602e --- /dev/null +++ b/src/Table/Actions/Action.php @@ -0,0 +1,187 @@ +table = $table; + } + + /** + * Handle the action. + */ + abstract public function handle(Request $request, Collection $models): void; + + /** + * Get the key. + */ + public function getKey(): string + { + return Str::of(static::class)->classBasename()->kebab()->value(); + } + + /** + * Get the URI key. + */ + public function getUriKey(): string + { + return $this->getKey(); + } + + /** + * Get the name. + */ + public function getName(): string + { + return __(Str::of(static::class)->classBasename()->headline()->value()); + } + + /** + * Get the modal key. + */ + public function getModalKey(): string + { + return sprintf('%s-action-%s', $this->table->getAttribute('id'), $this->getKey()); + } + + /** + * Set the destructive property. + */ + public function destructive(bool $value = true): static + { + $this->destructive = $value; + + return $this; + } + + /** + * Determine if the action is destructive. + */ + public function isDestructive(): bool + { + return $this->destructive; + } + + /** + * Set the confirmable property. + */ + public function confirmable(bool $value = true): static + { + $this->confirmable = $value; + + return $this; + } + + /** + * Determine if the action is confirmable. + */ + public function isConfirmable(): bool + { + return $this->confirmable; + } + + /** + * Perform the action. + */ + public function perform(Request $request): Response + { + $query = $this->table->resolveFilteredQuery($request); + + $this->toForm($request, $query->getModel())->handle($request); + + $this->handle( + $request, + $request->boolean('all') ? $query->get() : $query->findMany($request->input('models', [])) + ); + + return Redirect::back()->with( + sprintf('alerts.action-%s', $this->getKey()), + Alert::info(__(':action was successful!', ['action' => $this->getName()])) + ); + } + + /** + * Convert the object to a form using the request and the model. + */ + public function toForm(Request $request, Model $model): Form + { + return new ActionForm($model, ''); + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + return array_merge( + parent::toArray(), + App::call(function (Request $request): array { + return [ + 'confirmable' => $this->isConfirmable(), + 'destructive' => $this->isDestructive(), + 'key' => $this->getKey(), + 'name' => $this->getName(), + 'url' => null, + 'modalKey' => $this->getModalKey(), + 'form' => $this->toForm($request, $this->table->getQuery()->getModel()), + ]; + }) + ); + } + + /** + * Create an HTTP response that represents the object. + * + * @param \Illuminate\Http\Request $request + */ + public function toResponse($request): Response + { + return match ($request->method()) { + default => $this->perform($request), + }; + } +} diff --git a/src/Table/Actions/ActionForm.php b/src/Table/Actions/ActionForm.php new file mode 100644 index 000000000..5375c5c38 --- /dev/null +++ b/src/Table/Actions/ActionForm.php @@ -0,0 +1,22 @@ +validate($request); + } +} diff --git a/src/Table/Actions/Actions.php b/src/Table/Actions/Actions.php new file mode 100644 index 000000000..f90025b1f --- /dev/null +++ b/src/Table/Actions/Actions.php @@ -0,0 +1,62 @@ +table = $table; + $this->actions = new Collection($actions); + } + + /** + * Make a new action instance. + */ + public function action(string $action, ...$params): Action + { + $instance = new $action($this->table, ...$params); + + $this->push($instance); + + return $instance; + } + + /** + * Register the action routes. + */ + public function registerRoutes(Router $router): void + { + $router->prefix('actions')->group(function (Router $router): void { + $this->actions->each->registerRoutes($router); + }); + } + + /** + * Handle the dynamic method call. + */ + public function __call($method, $parameters): mixed + { + return $this->forwardCallTo($this->actions, $method, $parameters); + } +} diff --git a/src/Table/Cells/Cell.php b/src/Table/Cells/Cell.php new file mode 100644 index 000000000..b3ab797a1 --- /dev/null +++ b/src/Table/Cells/Cell.php @@ -0,0 +1,74 @@ +column = $column; + $this->model = $model; + } + + /** + * Get the model. + */ + public function getModel(): Model + { + return $this->model; + } + + /** + * Get the model attribute. + */ + public function getModelAttribute(): string + { + return $this->column->getModelAttribute(); + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + return array_merge( + parent::toArray(), + App::call(function (Request $request): array { + return [ + 'formattedValue' => $this->resolveFormat($request), + ]; + }) + ); + } +} diff --git a/src/Table/Cells/RowActions.php b/src/Table/Cells/RowActions.php new file mode 100644 index 000000000..527f725be --- /dev/null +++ b/src/Table/Cells/RowActions.php @@ -0,0 +1,30 @@ + $this->getModel(), + 'url' => $this->resolveValue($request), + ]; + }) + ); + } +} diff --git a/src/Table/Cells/RowSelect.php b/src/Table/Cells/RowSelect.php new file mode 100644 index 000000000..0c78de2ad --- /dev/null +++ b/src/Table/Cells/RowSelect.php @@ -0,0 +1,21 @@ + $this->getModel(), + ]); + } +} diff --git a/src/Table/Cells/Text.php b/src/Table/Cells/Text.php new file mode 100644 index 000000000..325437589 --- /dev/null +++ b/src/Table/Cells/Text.php @@ -0,0 +1,11 @@ +label = $label; + $this->table = $table; + $this->modelAttribute = $modelAttribute ??= Str::of($label)->lower()->snake()->value(); + } + + /** + * Create a new cell instance. + */ + abstract public function newCell(Model $model): Cell; + + /** + * Get the model attribute. + */ + public function getModelAttribute(): string + { + return $this->modelAttribute; + } + + /** + * Set the sortable attribute. + */ + public function sortable(bool|Closure $value = true): static + { + $this->sortable = $value; + + return $this; + } + + /** + * Determine if the field is sortable. + */ + public function isSortable(): bool + { + if ($this->sortable instanceof Closure) { + return call_user_func($this->sortable); + } + + return $this->sortable; + } + + /** + * Set the searachable attribute. + */ + public function searchable(bool|Closure $value = true): static + { + $this->searchable = $value; + + return $this; + } + + /** + * Determine if the field is searchable. + */ + public function isSearchable(): bool + { + if ($this->searchable instanceof Closure) { + return call_user_func($this->searchable); + } + + return $this->searchable; + } + + /** + * Set the value resolver callback. + */ + public function value(Closure $callback): static + { + $this->valueResolver = $callback; + + return $this; + } + + /** + * Set the format resolver callback. + */ + public function format(Closure $callback): static + { + $this->formatResolver = $callback; + + return $this; + } + + /** + * Convert the column to a cell. + */ + public function toCell(Model $model): Cell + { + return $this->newCell($model) + ->when(! is_null($this->valueResolver), function (Cell $cell) { + $cell->value($this->valueResolver); + }) + ->when(! is_null($this->formatResolver), function (Cell $cell) { + $cell->format($this->formatResolver); + }); + } + + /** + * The view data. + */ + public function toArray(): array + { + return array_merge(parent::toArray(), [ + 'attribute' => $this->modelAttribute, + 'label' => $this->label, + 'sortable' => $this->isSortable(), + ]); + } +} diff --git a/src/Table/Columns/Columns.php b/src/Table/Columns/Columns.php new file mode 100644 index 000000000..a28721a45 --- /dev/null +++ b/src/Table/Columns/Columns.php @@ -0,0 +1,92 @@ +table = $table; + $this->columns = new Collection($columns); + } + + /** + * Make a new column instance. + */ + public function column(string $column, string $label, string $key = null): mixed + { + $instance = new $column($this->table, $label, $key); + + $this->columns->push($instance); + + return $instance; + } + + /** + * Make a new ID column. + */ + public function id(string $label = 'ID', string $key = null): Text + { + return $this->column(Text::class, $label, $key); + } + + /** + * Make a new text column. + */ + public function text(string $label, string $key = null): Text + { + return $this->column(Text::class, $label, $key); + } + + /** + * Filter the searchable columns. + */ + public function searchable(): Collection + { + return $this->columns->filter->isSearchable(); + } + + /** + * Filter the sortable columns. + */ + public function sortable(): Collection + { + return $this->columns->filter->isSortable(); + } + + /** + * Map the columns to cells for the given model. + */ + public function mapToCells(Model $model): array + { + return $this->columns->map->toCell($model)->all(); + } + + /** + * Handle the dynamic method call. + */ + public function __call($method, $parameters): mixed + { + return $this->forwardCallTo($this->columns, $method, $parameters); + } +} diff --git a/src/Table/Columns/RowActions.php b/src/Table/Columns/RowActions.php new file mode 100644 index 000000000..f4071a6ae --- /dev/null +++ b/src/Table/Columns/RowActions.php @@ -0,0 +1,33 @@ +newCell($model)->value(function (Request $request, Model $model): string { + return $this->table->resolveRowUrl($request, $model); + }); + } +} diff --git a/src/Table/Columns/RowSelect.php b/src/Table/Columns/RowSelect.php new file mode 100644 index 000000000..50f6e632b --- /dev/null +++ b/src/Table/Columns/RowSelect.php @@ -0,0 +1,22 @@ +table = $table; + } + + /** + * Apply the filter on the query. + */ + abstract public function apply(Request $request, Builder $query, mixed $value): Builder; + + /** + * Convert the filter to a form field. + */ + abstract public function toField(FilterForm $form): Field; + + /** + * Get the key. + */ + public function getKey(): string + { + return Str::of(static::class)->classBasename()->snake()->value(); + } + + /** + * Get the request key. + */ + public function getRequestKey(): string + { + return sprintf('%s:%s', $this->table->getAttribute('id'), $this->getKey()); + } + + /** + * Get the name. + */ + public function getName(): string + { + return __(Str::of(static::class)->classBasename()->headline()->value()); + } + + /** + * Get the value of the filter. + */ + public function getValue(Request $request): mixed + { + return $request->input($this->getRequestKey()); + } + + /** + * Determine if the filter is active. + */ + public function isActive(Request $request): bool + { + return $request->filled($this->getRequestKey()); + } + + /** + * Determine whether the filter is functional. + */ + public function isFunctional(): bool + { + return $this->functional; + } +} diff --git a/src/Table/Filters/FilterForm.php b/src/Table/Filters/FilterForm.php new file mode 100644 index 000000000..f307cf690 --- /dev/null +++ b/src/Table/Filters/FilterForm.php @@ -0,0 +1,56 @@ +method('GET'); + $this->setAttribute('class', 'app-card__actions'); + } + + /** + * {@inheritdoc} + */ + public function handle(Request $request): void + { + // + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + return array_merge( + parent::toArray(), + App::call(function (Request $request): array { + return [ + 'search' => $this->resolveFields($request)->first(function (Field $field): bool { + return $field instanceof SearchField; + }), + 'fields' => $this->resolveFields($request)->reject(function (Field $field): bool { + return $field instanceof SearchField; + })->all(), + ]; + } + )); + } +} diff --git a/src/Table/Filters/Filters.php b/src/Table/Filters/Filters.php new file mode 100644 index 000000000..6028feecc --- /dev/null +++ b/src/Table/Filters/Filters.php @@ -0,0 +1,103 @@ +table = $table; + $this->filters = new Collection($filters); + } + + /** + * Make a new filter instance. + */ + public function filter(string $filter, ...$params): Filter + { + $instance = new $filter($this->table, ...$params); + + $this->push($instance); + + return $instance; + } + + /** + * Apply the filters on the query. + */ + public function apply(Request $request, Builder $query): Builder + { + $this->filters->filter(static function (Filter $filter) use ($request): bool { + return $request->has($filter->getKey()); + })->each(static function (Filter $filter) use ($query, $request): void { + $filter->apply($request, $query, $filter->getValue($request)); + }); + + return $query; + } + + /** + * Filter the renderable filters. + */ + public function renderable(): Collection + { + return $this->filters->reject->isFunctional(); + } + + /** + * Filter the functional filters. + */ + public function functional(): Collection + { + return $this->filters->filter->isFunctional(); + } + + /** + * Filter the active filters. + */ + public function active(Request $request): Collection + { + return $this->filters->filter->isActive($request); + } + + /** + * Map the filters to an array. + */ + public function mapToData(Request $request): array + { + return $this->filters + ->mapWithKeys(static function (Filter $filter) use ($request): array { + return [$filter->getKey() => $filter->getValue($request)]; + }) + ->toArray(); + } + + /** + * Handle the dynamic method call. + */ + public function __call($method, $parameters): mixed + { + return $this->forwardCallTo($this->filters, $method, $parameters); + } +} diff --git a/src/Table/Filters/Search.php b/src/Table/Filters/Search.php new file mode 100644 index 000000000..1aa6ef00f --- /dev/null +++ b/src/Table/Filters/Search.php @@ -0,0 +1,38 @@ +input($this->getRequestKey()); + } + + /** + * {@inheritdoc} + */ + public function toField(FilterForm $form): SearchField + { + return SearchField::make($form, $this->getName(), $this->getRequestKey()) + ->value(function (Request $request, Model $model): ?string { + return $model->getAttribute($this->getKey()); + }) + ->placeholder($this->getName().'...'); + } +} diff --git a/src/Table/Filters/SearchField.php b/src/Table/Filters/SearchField.php new file mode 100644 index 000000000..528497ead --- /dev/null +++ b/src/Table/Filters/SearchField.php @@ -0,0 +1,13 @@ +multiple ? Arr::wrap($default) : $default; + } + + /** + * Set the multiple attribute. + */ + public function multiple(bool $value = true): static + { + $this->multiple = $value; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function toField(FilterForm $form): Field + { + return Field::make($form, $this->getName(), $this->getRequestKey()) + ->options(App::call(function (Request $request): array { + return $this->options($request); + })) + ->value(fn (Request $request, Model $model): mixed => $model->getAttribute($this->getKey())) + ->multiple($this->multiple); + } +} diff --git a/src/Filters/TrashStatus.php b/src/Table/Filters/TrashStatus.php similarity index 92% rename from src/Filters/TrashStatus.php rename to src/Table/Filters/TrashStatus.php index a0b525616..960e4175c 100644 --- a/src/Filters/TrashStatus.php +++ b/src/Table/Filters/TrashStatus.php @@ -1,12 +1,12 @@ query = $query; + + $this->id( + Str::of(get_class($query->getModel()))->classBasename()->lower()->plural()->append('-table')->value() + ); + } + + /** + * Get the table title. + */ + public function getTitle(): string + { + return __(Str::of(get_class($this->query->getModel()))->classBasename()->headline()->plural()->value()); + } + + /** + * Get the table query. + */ + public function getQuery(): Builder + { + return $this->query; + } + + /** + * Resolve the filtered query. + */ + public function resolveFilteredQuery(Request $request): Builder + { + return $this->resolveFilters($request)->apply($request, $this->getQuery()); + } + + /** + * Get the per page. + */ + public function getPerPage(Request $request): ?int + { + return $request->input($this->getAttribute('id').':per_page'); + } + + /** + * Get the per page options. + */ + public function getPerPageOptions(): array + { + return Collection::make([$this->query->getModel()->getPerPage()]) + ->merge([15, 25, 50, 100]) + ->filter() + ->unique() + ->values() + ->toArray(); + } + + /** + * Get the page name. + */ + public function getPageName(): string + { + return sprintf('%s:page', $this->getAttribute('id')); + } + + /** + * Define the columns for the object. + */ + protected function columns(Request $request, Columns $columns): void + { + // + } + + /** + * Apply the given callback on the columns. + */ + public function withColumns(Closure $callback): static + { + $this->columnsResolver = $callback; + + return $this; + } + + /** + * Resolve the columns collection. + */ + public function resolveColumns(Request $request): Columns + { + if (is_null($this->columns)) { + $this->columns = new Columns($this); + + if ($this->resolveActions($request)->isNotEmpty()) { + $this->columns->push(new RowSelect($this, __('Select'), 'id')); + } + + $this->columns($request, $this->columns); + + if (! is_null($this->columnsResolver)) { + call_user_func_array($this->columnsResolver, [$request, $this->columns]); + } + + $this->columns->push(new RowActions($this, __('Actions'), 'id')); + + $this->columns->each(function (Column $column) use ($request): void { + $this->resolveColumn($request, $column); + }); + } + + return $this->columns; + } + + /** + * Handle the callback for the column resolution. + */ + protected function resolveColumn(Request $request, Column $column): void + { + // + } + + /** + * Define the actions for the object. + */ + protected function actions(Request $request, Actions $actions): void + { + // + } + + /** + * Set the actions resolver callback. + */ + public function withActions(Closure $callback): static + { + $this->actionsResolver = $callback; + + return $this; + } + + /** + * Resolve the actions collection. + */ + public function resolveActions(Request $request): Actions + { + if (is_null($this->actions)) { + $this->actions = new Actions($this); + + $this->actions($request, $this->actions); + + if (! is_null($this->actionsResolver)) { + call_user_func_array($this->actionsResolver, [$request, $this->actions]); + } + + $this->actions->each(function (Action $action) use ($request): void { + $this->resolveAction($request, $action); + }); + } + + return $this->actions; + } + + /** + * Handle the callback for the action resolution. + */ + protected function resolveAction(Request $request, Action $action): void + { + // + } + + /** + * Define the filters for the object. + */ + protected function filters(Request $request, Filters $filters): void + { + $filters->filter(Search::class); + // $this->filters->filter(Sort::class); + $filters->filter(TrashStatus::class); + } + + /** + * Apply the given callback on the filters. + */ + public function withFilters(Closure $callback): static + { + $this->filtersResolver = $callback; + + return $this; + } + + /** + * Resolve the filters collection. + */ + public function resolveFilters(Request $request): Filters + { + if (is_null($this->filters)) { + $this->filters = new Filters($this); + + $this->filters($request, $this->filters); + + if (! is_null($this->filtersResolver)) { + call_user_func_array($this->filtersResolver, [$request, $this->filters]); + } + + $this->filters->each(function (Filter $filter) use ($request): void { + $this->resolveFilter($request, $filter); + }); + } + + return $this->filters; + } + + /** + * Handle the callback for the filter resolution. + */ + protected function resolveFilter(Request $request, Filter $filter): void + { + // + } + + /** + * Set the row URL resolver callback. + */ + public function rowUrl(Closure $callback): static + { + $this->rowUrlResolver = $callback; + + return $this; + } + + /** + * Resolve the row URL. + */ + public function resolveRowUrl(Request $request, Model $model): string + { + if (is_null($this->rowUrlResolver)) { + return sprintf('%s/%s', $request->url(), $model->getKey()); + } + + return call_user_func_array($this->rowUrlResolver, [$request, $model]); + } + + /** + * Perform the query and the pagination. + */ + public function paginate(Request $request): LengthAwarePaginator + { + return $this->resolveFilteredQuery($request) + ->latest() + ->paginate($this->getPerPage($request), ['*'], $this->getPageName()) + ->setPath($request->path()) + ->withQueryString() + ->through(function (Model $model) use ($request): array { + return [ + 'id' => $model->getKey(), + 'cells' => $this->resolveColumns($request)->mapToCells($model), + ]; + }); + } + + /** + * Make a new form instance. + */ + public function toForm(Request $request, Model $model): FilterForm + { + $data = $this->resolveFilters($request)->mapToData($request); + + $model->forceFill($data); + + return (new FilterForm($model, $request->fullUrl())) + ->id(sprintf('%s-filters', $this->getAttribute('id'))) + ->withFields(function (Request $request, Fields $fields): void { + $this->resolveFilters($request) + ->renderable() + ->each(function (Filter $filter) use ($fields): void { + $fields->push($filter->toField($fields->form)); + }); + }) + ->setAttribute('data-active', $this->resolveFilters($request)->active($request)->count()); + } + + /** + * {@inheritdoc} + */ + public function toArray(): array + { + return array_merge( + parent::toArray(), + App::call(function (Request $request): array { + return [ + 'actions' => $this->resolveActions($request)->all(), + 'columns' => $this->resolveColumns($request)->all(), + 'filters' => $this->resolveFilters($request)->all(), + 'form' => $this->toForm($request, $this->query->getModel()), + 'items' => $this->paginate($request), + 'perPageOptions' => $this->getPerPageOptions(), + 'title' => $this->getTitle(), + ]; + }) + ); + } +} diff --git a/src/Traits/AsRootUser.php b/src/Traits/AsRootUser.php new file mode 100644 index 000000000..7225f0c3c --- /dev/null +++ b/src/Traits/AsRootUser.php @@ -0,0 +1,53 @@ +hasMany(Medium::getProxiedClass()); + } + + /** + * Get the Root notifications for the user. + */ + public function rootNotifications(): MorphMany + { + return $this->morphMany(Notification::getProxiedClass(), 'notifiable')->latest(); + } + + /** + * Get the avatar attribute. + */ + protected function avatar(): Attribute + { + return new Attribute( + get: static function (mixed $value, array $attributes): ?string { + return isset($attributes['email']) + ? sprintf('https://www.gravatar.com/avatar/%s?d=mp', md5($attributes['email'])) + : null; + } + ); + } +} diff --git a/src/Traits/Authorizable.php b/src/Traits/Authorizable.php index 1a5a7b79d..a17b6f890 100644 --- a/src/Traits/Authorizable.php +++ b/src/Traits/Authorizable.php @@ -12,23 +12,6 @@ trait Authorizable */ protected ?Closure $authorizationResolver = null; - /** - * Merge the current and the given resolvers. - */ - public function mergeAuthorizationResolver(Closure $callback): static - { - if (is_null($this->authorizationResolver)) { - return $this->authorize($callback); - } - - $resolver = $this->authorizationResolver; - - return $this->authorize(static function (Request $request, ...$parameters) use ($callback, $resolver): bool { - return call_user_func_array($callback, [$request, ...$parameters]) - && call_user_func_array($resolver, [$request, ...$parameters]); - }); - } - /** * Set the authorization resolver. */ @@ -41,8 +24,6 @@ public function authorize(Closure $callback): static /** * Resolve the authorization. - * - * @param array ...$parameters */ public function authorized(Request $request, ...$parameters): bool { diff --git a/src/Traits/HasAttributes.php b/src/Traits/HasAttributes.php index 683f3ee21..f719b3635 100644 --- a/src/Traits/HasAttributes.php +++ b/src/Traits/HasAttributes.php @@ -2,7 +2,9 @@ namespace Cone\Root\Traits; +use Closure; use Illuminate\Support\Arr; +use Illuminate\View\ComponentAttributeBag; trait HasAttributes { @@ -86,4 +88,42 @@ public function clearAttributes(): static return $this; } + + /** + * Resolve the attributes. + */ + public function resolveAttributes(): array + { + return array_reduce( + array_keys($this->attributes), + function (array $attributes, string $key): mixed { + return array_merge($attributes, [$key => $this->resolveAttribute($key)]); + }, + [] + ); + } + + /** + * Resolve the given attribute. + */ + public function resolveAttribute(string $key): mixed + { + $value = $this->getAttribute($key); + + $value = $value instanceof Closure ? call_user_func_array($value, [$this]) : $value; + + return match ($key) { + 'class' => Arr::toCssClasses((array) $value), + 'style' => Arr::toCssStyles((array) $value), + default => $value, + }; + } + + /** + * Make a new attribute bag instance. + */ + public function newAttributeBag(): ComponentAttributeBag + { + return new ComponentAttributeBag($this->resolveAttributes()); + } } diff --git a/src/Traits/HasMedia.php b/src/Traits/HasMedia.php index fec9f93d1..b02e9b262 100644 --- a/src/Traits/HasMedia.php +++ b/src/Traits/HasMedia.php @@ -2,6 +2,7 @@ namespace Cone\Root\Traits; +use Cone\Root\Models\Attachment; use Cone\Root\Models\Medium; use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Database\Eloquent\SoftDeletes; @@ -25,6 +26,10 @@ protected static function bootHasMedia(): void */ public function media(): MorphToMany { - return $this->morphToMany(Medium::getProxiedClass(), 'mediable', 'root_mediables'); + return $this->morphToMany(Medium::getProxiedClass(), 'mediable', 'root_mediables') + ->as('attachment') + ->using(Attachment::class) + ->withPivot(['meta', 'collection']) + ->withTimestamps(); } } diff --git a/src/Traits/Recordable.php b/src/Traits/Recordable.php deleted file mode 100644 index 538c5380f..000000000 --- a/src/Traits/Recordable.php +++ /dev/null @@ -1,17 +0,0 @@ -morphMany(Record::class, 'target'); - } -} diff --git a/src/Traits/RegistersRoutes.php b/src/Traits/RegistersRoutes.php deleted file mode 100644 index d4dd56e5f..000000000 --- a/src/Traits/RegistersRoutes.php +++ /dev/null @@ -1,108 +0,0 @@ -uri; - } - - /** - * Get the route parameter name. - */ - public function getParameterName(): string - { - return Str::of(self::class)->classBasename()->prepend('root')->value(); - } - - /** - * Register the routes using the given router. - */ - public function registerRoutes(Router $router): void - { - $this->uri = Str::start(sprintf('%s/%s', $router->getLastGroupPrefix(), $this->getUriKey()), '/'); - - if (! App::routesAreCached()) { - $router->prefix($this->getUriKey())->group(function (Router $router): void { - $this->routes($router); - }); - } - - $router->matched(function (RouteMatched $event): void { - if (str_starts_with(Str::start($event->route->uri(), '/'), $this->getUri())) { - $this->routeMatched($event); - } - }); - - $this->registerRouteConstraints($router); - - $this->routesRegistered($router); - } - - /** - * Handle the route matched event. - */ - public function routeMatched(RouteMatched $event): void - { - $event->route->setParameter($this->getParameterName(), $this); - } - - /** - * Handle the routes registered event. - */ - public function routesRegistered(Router $router): void - { - // - } - - /** - * Register the route constraints. - */ - public function registerRouteConstraints(Router $router): void - { - // - } - - /** - * Replace the route placeholders with the route parameters. - */ - protected function replaceRoutePlaceholders(Route $route): string - { - $uri = $this->getUri(); - - foreach ($route->originalParameters() as $key => $value) { - $uri = str_replace("{{$key}}", $value, $uri); - } - - return preg_replace('/\{.*?\}/', 'create', $uri); - } - - /** - * The routes that should be registered. - */ - public function routes(Router $router): void - { - // - } -} diff --git a/src/Traits/ResolvesActions.php b/src/Traits/ResolvesActions.php deleted file mode 100644 index 89903d206..000000000 --- a/src/Traits/ResolvesActions.php +++ /dev/null @@ -1,67 +0,0 @@ -actionsResolver = is_array($actions) ? fn (): array => $actions : $actions; - - return $this; - } - - /** - * Resolve the actions. - */ - public function resolveActions(Request $request): Actions - { - if (is_null($this->actions)) { - $this->actions = Actions::make()->register($this->actions($request)); - - if (! is_null($this->actionsResolver)) { - $this->actions->register(call_user_func_array($this->actionsResolver, [$request])); - } - - $this->actions->each(function (Action $action) use ($request): void { - $this->resolveAction($request, $action); - }); - } - - return $this->actions; - } - - /** - * Handle the resolving event on the action instance. - */ - protected function resolveAction(Request $request, Action $action): void - { - // - } -} diff --git a/src/Traits/ResolvesExtracts.php b/src/Traits/ResolvesExtracts.php deleted file mode 100644 index 6dc5e4424..000000000 --- a/src/Traits/ResolvesExtracts.php +++ /dev/null @@ -1,67 +0,0 @@ -extractsResolver = is_array($extracts) ? fn (): array => $extracts : $extracts; - - return $this; - } - - /** - * Resolve the extracts. - */ - public function resolveExtracts(Request $request): Extracts - { - if (is_null($this->extracts)) { - $this->extracts = Extracts::make()->register($this->extracts($request)); - - if (! is_null($this->extractsResolver)) { - $this->extracts->register(call_user_func_array($this->extractsResolver, [$request])); - } - - $this->extracts->each(function (Extract $extract) use ($request): void { - $this->resolveExtract($request, $extract); - }); - } - - return $this->extracts; - } - - /** - * Handle the resolving event on the extract instance. - */ - protected function resolveExtract(Request $request, Extract $extract): void - { - // - } -} diff --git a/src/Traits/ResolvesFields.php b/src/Traits/ResolvesFields.php index 7da0f8e69..cf3ff149f 100644 --- a/src/Traits/ResolvesFields.php +++ b/src/Traits/ResolvesFields.php @@ -3,50 +3,57 @@ namespace Cone\Root\Traits; use Closure; -use Cone\Root\Fields\Field; -use Cone\Root\Support\Collections\Fields; +use Cone\Root\Form\Fields\Field; +use Cone\Root\Form\Fields\Fields; use Illuminate\Http\Request; trait ResolvesFields { + /** + * The fields collection. + */ + protected ?Fields $fields = null; + /** * The fields resolver callback. */ protected ?Closure $fieldsResolver = null; /** - * The resolved fields. + * Create a new fields collection. */ - protected ?Fields $fields = null; + abstract protected function newFieldsCollection(): Fields; /** * Define the fields for the object. */ - public function fields(Request $request): array + protected function fields(Request $request, Fields $fields): void { - return []; + // } /** - * Set the fields resolver. + * Set the fields resolver callback. */ - public function withFields(array|Closure $fields): static + public function withFields(Closure $callback): static { - $this->fieldsResolver = is_array($fields) ? fn (): array => $fields : $fields; + $this->fieldsResolver = $callback; return $this; } /** - * Resolve the fields. + * Resolve the fields collection. */ public function resolveFields(Request $request): Fields { if (is_null($this->fields)) { - $this->fields = Fields::make()->register($this->fields($request)); + $this->fields = $this->newFieldsCollection(); + + $this->fields($request, $this->fields); if (! is_null($this->fieldsResolver)) { - $this->fields->register(call_user_func_array($this->fieldsResolver, [$request])); + call_user_func_array($this->fieldsResolver, [$request, $this->fields]); } $this->fields->each(function (Field $field) use ($request): void { @@ -58,10 +65,29 @@ public function resolveFields(Request $request): Fields } /** - * Handle the resolving event on the field instance. + * Handle the callback for the field resolution. */ protected function resolveField(Request $request, Field $field): void { // } + + /** + * Find the field with the given API URI. + */ + public function findField(Request $request, string $apiUri): ?Field + { + foreach ($this->resolveFields($request)->all() as $field) { + if (trim($field->getApiUri(), '/') === trim($apiUri, '/')) { + return $field; + } + + if (in_array(ResolvesFields::class, class_uses_recursive($field)) + && ! is_null($subfield = $field->findField($request, $apiUri))) { + return $subfield; + } + } + + return null; + } } diff --git a/src/Traits/ResolvesFilters.php b/src/Traits/ResolvesFilters.php deleted file mode 100644 index f22962b71..000000000 --- a/src/Traits/ResolvesFilters.php +++ /dev/null @@ -1,67 +0,0 @@ -filtersResolver = is_array($filters) ? fn (): array => $filters : $filters; - - return $this; - } - - /** - * Resolve the filters. - */ - public function resolveFilters(Request $request): Filters - { - if (is_null($this->filters)) { - $this->filters = Filters::make()->register($this->filters($request)); - - if (! is_null($this->filtersResolver)) { - $this->filters->register(call_user_func_array($this->filtersResolver, [$request])); - } - - $this->filters->each(function (Filter $filter) use ($request): void { - $this->resolveFilter($request, $filter); - }); - } - - return $this->filters; - } - - /** - * Handle the resolving event on the filter instance. - */ - protected function resolveFilter(Request $request, Filter $filter): void - { - // - } -} diff --git a/src/Traits/ResolvesModelValue.php b/src/Traits/ResolvesModelValue.php new file mode 100644 index 000000000..4dfc4773f --- /dev/null +++ b/src/Traits/ResolvesModelValue.php @@ -0,0 +1,86 @@ +valueResolver = $callback; + + return $this; + } + + /** + * Resolve the value. + */ + public function resolveValue(Request $request): mixed + { + $value = $this->getValue(); + + if (is_null($this->valueResolver)) { + return $value; + } + + return call_user_func_array($this->valueResolver, [$request, $this->getModel(), $value]); + } + + /** + * Get the default value from the model. + */ + public function getValue(): mixed + { + return $this->getModel()->getAttribute($this->getModelAttribute()); + } + + /** + * Set the format resolver. + */ + public function format(Closure $callback): static + { + $this->formatResolver = $callback; + + return $this; + } + + /** + * Format the value. + */ + public function resolveFormat(Request $request): mixed + { + $value = $this->resolveValue($request); + + if (is_null($this->formatResolver)) { + return $value; + } + + return call_user_func_array($this->formatResolver, [$request, $this->getModel(), $value]); + } +} diff --git a/src/Traits/ResolvesRelations.php b/src/Traits/ResolvesRelations.php deleted file mode 100644 index 9fc9265d0..000000000 --- a/src/Traits/ResolvesRelations.php +++ /dev/null @@ -1,67 +0,0 @@ -relationsResolver = is_array($relations) ? fn (): array => $relations : $relations; - - return $this; - } - - /** - * Resolve the relations. - */ - public function resolveRelations(Request $request): Relations - { - if (is_null($this->relations)) { - $this->relations = Relations::make()->register($this->relations($request)); - - if (! is_null($this->relationsResolver)) { - $this->relations->register(call_user_func_array($this->relationsResolver, [$request])); - } - - $this->relations->each(function (Relation $relation) use ($request): void { - $this->resolveRelation($request, $relation); - }); - } - - return $this->relations; - } - - /** - * Handle the resolving event on the relation instance. - */ - protected function resolveRelation(Request $request, Relation $relation): void - { - // - } -} diff --git a/src/Traits/ResolvesVisibility.php b/src/Traits/ResolvesVisibility.php deleted file mode 100644 index 0126c6936..000000000 --- a/src/Traits/ResolvesVisibility.php +++ /dev/null @@ -1,58 +0,0 @@ -visibilityResolvers as $callback) { - if (! call_user_func_array($callback, [$context])) { - return false; - } - } - - return true; - } - - /** - * Set a custom visibility resolver. - */ - public function visibleOn(string|array|Closure $context): static - { - $this->visibilityResolvers[] = $context instanceof Closure - ? $context - : static function (string|array $currentContext) use ($context) { - return ! empty(array_intersect(Arr::wrap($currentContext), Arr::wrap($context))); - }; - - return $this; - } - - /** - * Set a custom hidden resolver. - */ - public function hiddenOn(string|array|Closure $context): static - { - $context = $context instanceof Closure - ? static function (array|string $currentContext) use ($context): bool { - return ! call_user_func_array($context, [$currentContext]); - } - : static function (string|array $currentContext) use ($context) { - return empty(array_intersect(Arr::wrap($currentContext), Arr::wrap($context))); - }; - - return $this->visibleOn($context); - } -} diff --git a/src/Traits/ResolvesWidgets.php b/src/Traits/ResolvesWidgets.php index 58a0ed8bb..0e0ff9f54 100644 --- a/src/Traits/ResolvesWidgets.php +++ b/src/Traits/ResolvesWidgets.php @@ -2,25 +2,19 @@ namespace Cone\Root\Traits; -use Closure; -use Cone\Root\Support\Collections\Widgets; use Cone\Root\Widgets\Widget; +use Cone\Root\Widgets\Widgets; use Illuminate\Http\Request; trait ResolvesWidgets { /** - * The widgets resolver callback. - */ - protected ?Closure $widgetsResolver = null; - - /** - * The resolved fields. + * The widgets collection. */ protected ?Widgets $widgets = null; /** - * Define the widgets for the resource. + * Define the widgets. */ public function widgets(Request $request): array { @@ -28,26 +22,12 @@ public function widgets(Request $request): array } /** - * Set the widgets resolver. - */ - public function withWidgets(array|Closure $widgets): static - { - $this->widgetsResolver = is_array($widgets) ? fn (): array => $widgets : $widgets; - - return $this; - } - - /** - * Resolve the widgets. + * Resolve the widgets collection. */ public function resolveWidgets(Request $request): Widgets { if (is_null($this->widgets)) { - $this->widgets = Widgets::make()->register($this->widgets($request)); - - if (! is_null($this->widgetsResolver)) { - $this->widgets->register(call_user_func_array($this->widgetsResolver, [$request])); - } + $this->widgets = new Widgets($this->widgets($request)); $this->widgets->each(function (Widget $widget) use ($request): void { $this->resolveWidget($request, $widget); @@ -58,7 +38,7 @@ public function resolveWidgets(Request $request): Widgets } /** - * Handle the resolving event on the widget instance. + * Handle the callback for the widget resolution. */ protected function resolveWidget(Request $request, Widget $widget): void { diff --git a/src/View/Components/Alert.php b/src/View/Components/Alert.php new file mode 100644 index 000000000..bef167478 --- /dev/null +++ b/src/View/Components/Alert.php @@ -0,0 +1,39 @@ +type = $type; + $this->closable = $closable; + } + + /** + * Get the view / view contents that represent the component. + */ + public function render(): View + { + return $this->view('root::components.alert', [ + 'type' => $this->type, + 'closable' => $this->closable, + ]); + } +} diff --git a/src/View/Components/Icon.php b/src/View/Components/Icon.php new file mode 100644 index 000000000..ca6fde417 --- /dev/null +++ b/src/View/Components/Icon.php @@ -0,0 +1,32 @@ +name = $name; + } + + /** + * Get the view / view contents that represent the component. + */ + public function render(): View + { + return $this->view('root::components.icon', [ + 'icon' => sprintf('root::icons.%s', $this->name), + ]); + } +} diff --git a/src/View/Components/Layout/Footer.php b/src/View/Components/Layout/Footer.php new file mode 100644 index 000000000..1258213df --- /dev/null +++ b/src/View/Components/Layout/Footer.php @@ -0,0 +1,17 @@ +view('root::components.layout.footer'); + } +} diff --git a/src/View/Components/Layout/Header.php b/src/View/Components/Layout/Header.php new file mode 100644 index 000000000..4bed93924 --- /dev/null +++ b/src/View/Components/Layout/Header.php @@ -0,0 +1,17 @@ +view('root::components.layout.header'); + } +} diff --git a/src/View/Components/Layout/Notifications.php b/src/View/Components/Layout/Notifications.php new file mode 100644 index 000000000..341244355 --- /dev/null +++ b/src/View/Components/Layout/Notifications.php @@ -0,0 +1,20 @@ +view('root::components.layout.notifications', [ + 'url' => URL::route('root.api.notifications.index'), + ]); + } +} diff --git a/src/View/Components/Layout/Sidebar.php b/src/View/Components/Layout/Sidebar.php new file mode 100644 index 000000000..e7d35bdd2 --- /dev/null +++ b/src/View/Components/Layout/Sidebar.php @@ -0,0 +1,20 @@ +view('root::components.layout.sidebar', [ + 'groups' => Navigation::location('sidebar')->groups(), + ]); + } +} diff --git a/src/View/Components/Layout/SidebarGroup.php b/src/View/Components/Layout/SidebarGroup.php new file mode 100644 index 000000000..636008304 --- /dev/null +++ b/src/View/Components/Layout/SidebarGroup.php @@ -0,0 +1,39 @@ +title = $title; + $this->items = $items; + } + + /** + * Get the view / view contents that represent the component. + */ + public function render(): View + { + return $this->view('root::components.layout.sidebar-group', [ + 'title' => $this->title, + 'items' => $this->items, + ]); + } +} diff --git a/src/View/Components/Layout/Theme.php b/src/View/Components/Layout/Theme.php new file mode 100644 index 000000000..aca53d948 --- /dev/null +++ b/src/View/Components/Layout/Theme.php @@ -0,0 +1,20 @@ +view('root::components.layout.theme', [ + 'theme' => Cookie::get('__root_theme', 'system'), + ]); + } +} diff --git a/src/View/Components/Modal.php b/src/View/Components/Modal.php new file mode 100644 index 000000000..18a7c6168 --- /dev/null +++ b/src/View/Components/Modal.php @@ -0,0 +1,47 @@ +title = $title; + $this->subtitle = $subtitle; + $this->key = strtolower($key ?: Str::random()); + } + + /** + * Get the view / view contents that represent the component. + */ + public function render(): View + { + return $this->view('root::components.modal', [ + 'key' => $this->key, + 'subtitle' => $this->subtitle, + 'title' => $this->title, + ]); + } +} diff --git a/src/Widgets/Metric.php b/src/Widgets/Metric.php new file mode 100644 index 000000000..cd3089263 --- /dev/null +++ b/src/Widgets/Metric.php @@ -0,0 +1,30 @@ + $this->calculate($request), + ]; + }), + ); + } +} diff --git a/src/Widgets/Trend.php b/src/Widgets/Trend.php new file mode 100644 index 000000000..8fc67fa94 --- /dev/null +++ b/src/Widgets/Trend.php @@ -0,0 +1,21 @@ +classBasename()->kebab()->value(); } - /** - * Get the URI key. - */ - public function getUriKey(): string - { - return $this->getKey(); - } - /** * Get the name. */ @@ -69,107 +34,13 @@ public function getName(): string } /** - * Get the Vue component. - */ - public function getComponent(): string - { - return $this->component; - } - - /** - * Get the Blade template. - */ - public function getTemplate(): string - { - return $this->template; - } - - /** - * Set the async attribute. - */ - public function async(bool $value = true): static - { - $this->async = $value; - - return $this; - } - - /** - * Determine if the widget is async. - */ - public function isAsync(): bool - { - return $this->async; - } - - /** - * Get the data. - */ - public function data(Request $request): array - { - return []; - } - - /** - * Set the data resolver. - */ - public function with(array|Closure $data): static - { - if (is_array($data)) { - $data = static function () use ($data): array { - return $data; - }; - } - - $this->dataResolver = $data; - - return $this; - } - - /** - * Resolve the data. - */ - public function resolveData(Request $request): array - { - return array_merge( - $this->data($request), - is_null($this->dataResolver) ? [] : call_user_func_array($this->dataResolver, [$request]) - ); - } - - /** - * Get the evaluated contents of the object. - */ - public function render(): string - { - return View::make( - $this->getTemplate(), - App::call([$this, 'resolveData']) - )->render(); - } - - /** - * The routes that should be registered. - */ - public function routes(Router $router): void - { - if ($this->async) { - $router->get('/', WidgetController::class); - } - } - - /** - * Get the instance as an array. + * Convert the widget to an array. */ public function toArray(): array { return [ - 'async' => $this->async, - 'component' => $this->getComponent(), 'key' => $this->getKey(), 'name' => $this->getName(), - 'template' => $this->async ? null : $this->render(), - 'url' => $this->async ? $this->getUri() : null, ]; } } diff --git a/src/Widgets/Widgets.php b/src/Widgets/Widgets.php new file mode 100644 index 000000000..bff732c21 --- /dev/null +++ b/src/Widgets/Widgets.php @@ -0,0 +1,57 @@ +widgets = new Collection($widgets); + } + + /** + * Register the given widgets. + */ + public function register(array|Widget $widgets): static + { + foreach (Arr::wrap($widgets) as $widget) { + $this->widgets->push($widget); + } + + return $this; + } + + /** + * Make a new widget instance. + */ + public function widget(string $widget, ...$params): Widget + { + $instance = new $widget(...$params); + + $this->register($instance); + + return $instance; + } + + /** + * Handle the dynamic method call. + */ + public function __call($method, $parameters): mixed + { + return $this->forwardCallTo($this->widgets, $method, $parameters); + } +} diff --git a/stubs/Action.stub b/stubs/Action.stub index f73a09e9a..6b1ec4196 100644 --- a/stubs/Action.stub +++ b/stubs/Action.stub @@ -2,20 +2,12 @@ namespace {{ namespace }}; -use Cone\Root\Actions\Action; +use Cone\Root\Table\Actions\Action; use Illuminate\Database\Eloquent\Collection; use Illuminate\Http\Request; class {{ class }} extends Action { - /** - * Create a new action instance. - */ - public function __construct() - { - // - } - /** * Handle the action. */ @@ -23,14 +15,4 @@ class {{ class }} extends Action { // } - - /** - * Define the fields for the action. - */ - public function fields(Request $request): array - { - return array_merge(parent::fields($request), [ - // - ]); - } } diff --git a/stubs/Extract.stub b/stubs/Extract.stub deleted file mode 100644 index 388d8c80a..000000000 --- a/stubs/Extract.stub +++ /dev/null @@ -1,58 +0,0 @@ -sortable()->searchable(), - ]); - } - - /** - * Define the relations for the resource. - */ - public function relations(Request $request): array - { - return array_merge(parent::relations($request), [ - // - ]); - } - - /** - * Define the filters for the resource. + * Define the extracts for the resource. */ - public function filters(Request $request): array + public function extracts(): array { - return array_merge(parent::filters($request), [ + return array_merge(parent::extracts(), [ // ]); } /** - * Define the actions for the resource. + * Define the widgets for the resource. */ - public function actions(Request $request): array + public function widgets(): array { - return array_merge(parent::actions($request), [ + return array_merge(parent::widgets(), [ // ]); } /** - * Define the extracts for the resource. + * Get the table instance for the resource. */ - public function extracts(Request $request): array + public function toTable(Request $request): Table { - return array_merge(parent::extracts($request), [ - // - ]); + return parent::toTable($request) + ->withColumns(static function (Request $request, Columns $columns): void { + $columns->id(); + }); } /** - * Define the widgets for the resource. + * Get the form instance for the resource. */ - public function widgets(Request $request): array + public function toForm(Request $request): Form { - return array_merge(parent::widgets($request), [ - // - ]); + return parent::toForm($request) + ->withFields(static function (Request $request, Fields $fields): void { + // + }); } } diff --git a/stubs/RootServiceProvider.stub b/stubs/RootServiceProvider.stub index 51a654c6d..2d5311add 100644 --- a/stubs/RootServiceProvider.stub +++ b/stubs/RootServiceProvider.stub @@ -3,24 +3,29 @@ namespace App\Providers; use App\Models\User; +use App\Root\Resources\UserResource; +use Cone\Root\Conversion\Image; use Cone\Root\Interfaces\Models\User as UserInterface; -use Cone\Root\Models\User as BaseUser; use Cone\Root\RootApplicationServiceProvider; +use Cone\Root\Support\Facades\Conversion; use Cone\Root\Widgets\Welcome; use Illuminate\Support\Facades\Gate; class RootServiceProvider extends RootApplicationServiceProvider { + /** + * All of the container bindings that should be registered. + */ + public array $bindings = [ + UserInterface::class => User::class, + ]; + /** * Register any application services. */ public function register(): void { parent::register(); - - if (is_subclass_of(User::class, BaseUser::class)) { - $this->app->bind(UserInterface::class, User::class); - } } /** @@ -29,6 +34,10 @@ class RootServiceProvider extends RootApplicationServiceProvider public function boot(): void { parent::boot(); + + Conversion::register('thumbnail', static function (Image $image): void { + $image->crop(500, 500); + }); } /** @@ -47,7 +56,7 @@ class RootServiceProvider extends RootApplicationServiceProvider protected function resources(): array { return [ - (BaseUser::proxy())::toResource(), + new UserResource(), ]; } @@ -57,7 +66,7 @@ class RootServiceProvider extends RootApplicationServiceProvider protected function widgets(): array { return [ - Welcome::make(), + new Welcome(), ]; } } diff --git a/stubs/Filter.stub b/stubs/SelectFilter.stub similarity index 74% rename from stubs/Filter.stub rename to stubs/SelectFilter.stub index 70e444ae0..d01553996 100644 --- a/stubs/Filter.stub +++ b/stubs/SelectFilter.stub @@ -2,18 +2,12 @@ namespace {{ namespace }}; -use Cone\Root\Filters\Filter; +use Cone\Root\Table\Filters\Select; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; -class {{ class }} extends Filter +class {{ class }} extends Select { -%%component%% - /** - * The Vue component. - */ - protected ?string $component = '{{ component }}'; -%%/component%% %%multiple%% /** * Indicates if multiple options can be selected. diff --git a/stubs/UserResource.stub b/stubs/UserResource.stub index 034d8341b..8214ce2fa 100644 --- a/stubs/UserResource.stub +++ b/stubs/UserResource.stub @@ -2,9 +2,11 @@ namespace App\Root\Resources; -use Cone\Root\Fields\ID; -use Cone\Root\Fields\Text; +use Cone\Root\Form\Fields\Fields; +use Cone\Root\Form\Form; use Cone\Root\Resources\Resource; +use Cone\Root\Table\Columns\Columns; +use Cone\Root\Table\Table; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; use Illuminate\Validation\Rule; @@ -14,26 +16,37 @@ class UserResource extends Resource /** * The icon for the resource. */ - protected string $icon = 'person'; + protected string $icon = 'users'; /** * {@inheritdoc} */ - public function fields(Request $request): array + public function toTable(Request $request): Table { - return array_merge(parent::fields($request), [ - ID::make(), + return parent::toTable($request) + ->withColumns(static function (Request $request, Columns $columns): void { + $columns->id(); + $columns->text(__('Name'), 'name'); + $columns->text(__('Email'), 'email'); + }); + } - Text::make(__('Name'), 'name') - ->rules(['required', 'string', 'max:256']), + /** + * {@inheritdoc} + */ + public function toForm(Request $request): Form + { + return parent::toForm($request) + ->withFields(static function (Request $request, Fields $fields): void { + $fields->text(__('Name'), 'name') + ->rules(['required', 'string', 'max:256']); - Text::make(__('Email'), 'email') - ->type('email') - ->rules(['required', 'string', 'email', 'max:256']) - ->createRules(['unique:users']) - ->updateRules(static function (Request $request, Model $model): array { - return [Rule::unique('users')->ignoreModel($model)]; - }), - ]); + $fields->email(__('Email'), 'email') + ->rules(['required', 'string', 'email', 'max:256']) + ->createRules(['unique:users']) + ->updateRules(static function (Request $request, Model $model): array { + return [Rule::unique('users')->ignoreModel($model)]; + }); + }); } } diff --git a/stubs/Widget.stub b/stubs/Widget.stub index c5419a5bb..6ce0626c6 100644 --- a/stubs/Widget.stub +++ b/stubs/Widget.stub @@ -3,41 +3,20 @@ namespace {{ namespace }}; use Cone\Root\Widgets\Widget; -use Illuminate\Http\Request; class {{ class }} extends Widget { -%%async%% - /** - * Indicates if the widget is async. - */ - protected bool $async = true; -%%/async%% -%%component%% - /** - * The Vue component. - */ - protected string $component = '{{ component }}'; -%%/component%% /** * The Blade template. */ protected string $template = '{{ template }}'; - /** - * Create a new widget instance. - */ - public function __construct() - { - // - } - /** * Get the data. */ - public function data(Request $request): array + public function toArray(): array { - return array_merge(parent::data($request), [ + return array_merge(parent::toArray(), [ // ]); } diff --git a/tests/Actions/ActionTest.php b/tests/Actions/ActionTest.php deleted file mode 100644 index eb1cb01d0..000000000 --- a/tests/Actions/ActionTest.php +++ /dev/null @@ -1,146 +0,0 @@ -action = new PublishPosts(); - } - - /** @test */ - public function an_action_has_key() - { - $this->assertSame('publish-posts', $this->action->getKey()); - } - - /** @test */ - public function an_action_has_name() - { - $this->assertSame('Publish Posts', $this->action->getName()); - } - - /** @test */ - public function an_action_can_be_destructive() - { - $this->assertFalse($this->action->isDestructive()); - - $this->action->destructive(); - - $this->assertTrue($this->action->isDestructive()); - - $this->action->destructive(false); - - $this->assertFalse($this->action->isDestructive()); - } - - /** @test */ - public function an_action_can_be_confirmable() - { - $this->assertFalse($this->action->isConfirmable()); - - $this->action->confirmable(); - - $this->assertTrue($this->action->isConfirmable()); - - $this->action->confirmable(false); - - $this->assertFalse($this->action->isConfirmable()); - } - - /** @test */ - public function an_action_throws_exception_if_cant_resolve_query() - { - $this->expectException(QueryResolutionException::class); - - $this->action->resolveQuery($this->app['request']); - } - - /** @test */ - public function an_action_resolves_query() - { - $this->action->withQuery(function () { - return Post::query(); - }); - - $this->assertSame( - Post::query()->toSql(), - $this->action->resolveQuery($this->app['request'])->toSql() - ); - } - - /** @test */ - public function an_action_registers_routes() - { - $this->app['router']->prefix('posts/actions')->group(function ($router) { - $this->action->registerRoutes($router); - }); - - $this->assertSame('/posts/actions/publish-posts', $this->action->getUri()); - - $this->assertArrayHasKey( - trim($this->action->getUri(), '/'), - $this->app['router']->getRoutes()->get('POST') - ); - } - - /** @test */ - public function an_action_resolves_fields() - { - $this->action->withFields([ - Text::make(__('Name')), - ]); - - $this->assertSame( - Fields::make(array_merge($this->action->fields($this->app['request']), [Text::make(__('Name'))]))->toArray(), - $this->action->resolveFields($this->app['request'])->toArray() - ); - } - - /** @test */ - public function an_action_has_array_representation() - { - $this->assertSame([ - 'confirmable' => $this->action->isConfirmable(), - 'destructive' => $this->action->isDestructive(), - 'key' => $this->action->getKey(), - 'name' => $this->action->getName(), - 'url' => $this->action->getUri(), - ], $this->action->toArray()); - } - - /** @test */ - public function an_action_has_form_representation() - { - $model = new Post(); - - $fields = $this->action - ->resolveFields($this->app['request']) - ->mapToForm($this->app['request'], $model); - - $this->assertSame(array_merge($this->action->toArray(), [ - 'data' => array_column($fields, 'value', 'name'), - 'fields' => $fields, - ]), $this->action->toForm($this->app['request'], $model)); - } - - /** @test */ - public function an_action_has_response_representation() - { - $response = $this->createTestResponse($this->action->toResponse($this->app['request'])); - - $response->assertRedirect() - ->assertSessionHas(sprintf('alerts.action-%s', $this->action->getKey())); - } -} diff --git a/tests/Actions/PublishPosts.php b/tests/Actions/PublishPosts.php deleted file mode 100644 index 9c5e6f4f7..000000000 --- a/tests/Actions/PublishPosts.php +++ /dev/null @@ -1,15 +0,0 @@ -makePartial(); - - $builder->setQuery(parent::newQuery()->getQuery()); - - $builder->setModel($this); - - $builder->shouldReceive('get')->andReturn($this->results()); - $builder->shouldReceive('paginate')->andReturn(new LengthAwarePaginator($this->results(), 2, 15, 1)); - - return $builder; - } - - public function posts() - { - $builder = (new Post())->newQuery(); - - return new HasMany($builder, $this, 'posts.author_id', 'id'); - } - - public function scopeFilter($query) - { - return $query; - } - - protected function results() - { - return collect([ - new static(['id' => 1, 'name' => 'Author One']), - new static(['id' => 2, 'name' => 'Author Two']), - ]); - } -} diff --git a/tests/Comment.php b/tests/Comment.php deleted file mode 100644 index 87b315f25..000000000 --- a/tests/Comment.php +++ /dev/null @@ -1,53 +0,0 @@ -makePartial(); - - $builder->setQuery(parent::newQuery()->getQuery()); - - $builder->setModel($this); - - $builder->shouldReceive('get')->andReturn($this->results()); - $builder->shouldReceive('paginate')->andReturn(new LengthAwarePaginator($this->results(), 2, 15, 1)); - - return $builder; - } - - public function post() - { - $builder = (new Post())->newQuery(); - - return new BelongsTo($builder, $this, 'foreignKey', 'id', 'post'); - } - - protected function results() - { - return collect([ - new static(['id' => 1, 'content' => 'Comment One']), - new static(['id' => 2, 'content' => 'Comment Two']), - ]); - } - - public function save(array $options = []) - { - $this->setAttribute($this->getKeyName(), 1); - } - - public function delete() - { - // - } -} diff --git a/tests/Console/ActionMakeTest.php b/tests/Console/ActionMakeTest.php deleted file mode 100644 index 9be2a9087..000000000 --- a/tests/Console/ActionMakeTest.php +++ /dev/null @@ -1,25 +0,0 @@ -artisan('root:action', ['name' => 'TestAction']) - ->assertExitCode(Command::SUCCESS); - - $this->assertFileExists($this->app->path('/Root/Actions/TestAction.php')); - } - - public function tearDown(): void - { - unlink($this->app->path('/Root/Actions/TestAction.php')); - - parent::tearDown(); - } -} diff --git a/tests/Console/CommandsTest.php b/tests/Console/CommandsTest.php deleted file mode 100644 index 4059150e9..000000000 --- a/tests/Console/CommandsTest.php +++ /dev/null @@ -1,24 +0,0 @@ -put( - 'chunks/test.chunk', - UploadedFile::fake()->create('test.chunk') - ); - - $this->artisan('root:clear-chunks') - ->expectsOutput('File chunks are cleared!') - ->assertExitCode(Command::SUCCESS); - } -} diff --git a/tests/Console/ExtractMakeTest.php b/tests/Console/ExtractMakeTest.php deleted file mode 100644 index f67f389ba..000000000 --- a/tests/Console/ExtractMakeTest.php +++ /dev/null @@ -1,25 +0,0 @@ -artisan('root:extract', ['name' => 'TestExtract']) - ->assertExitCode(Command::SUCCESS); - - $this->assertFileExists($this->app->path('/Root/Extracts/TestExtract.php')); - } - - public function tearDown(): void - { - unlink($this->app->path('/Root/Extracts/TestExtract.php')); - - parent::tearDown(); - } -} diff --git a/tests/Console/FieldMakeTest.php b/tests/Console/FieldMakeTest.php deleted file mode 100644 index 078bb1c2c..000000000 --- a/tests/Console/FieldMakeTest.php +++ /dev/null @@ -1,28 +0,0 @@ -artisan('root:field', [ - 'name' => 'TestField', - '--component' => 'foo', - ]) - ->assertExitCode(Command::SUCCESS); - - $this->assertFileExists($this->app->path('/Root/Fields/TestField.php')); - } - - public function tearDown(): void - { - unlink($this->app->path('/Root/Fields/TestField.php')); - - parent::tearDown(); - } -} diff --git a/tests/Console/FilterMakeTest.php b/tests/Console/FilterMakeTest.php deleted file mode 100644 index 5b354e98c..000000000 --- a/tests/Console/FilterMakeTest.php +++ /dev/null @@ -1,29 +0,0 @@ -artisan('root:filter', [ - 'name' => 'TestFilter', - '--component' => 'test', - '--multiple' => true, - ]) - ->assertExitCode(Command::SUCCESS); - - $this->assertFileExists($this->app->path('/Root/Filters/TestFilter.php')); - } - - public function tearDown(): void - { - unlink($this->app->path('/Root/Filters/TestFilter.php')); - - parent::tearDown(); - } -} diff --git a/tests/Console/ResourceMakeTest.php b/tests/Console/ResourceMakeTest.php deleted file mode 100644 index 46e51dcd2..000000000 --- a/tests/Console/ResourceMakeTest.php +++ /dev/null @@ -1,25 +0,0 @@ -artisan('root:resource', ['name' => 'TestResource']) - ->assertExitCode(Command::SUCCESS); - - $this->assertFileExists($this->app->path('/Root/Resources/TestResource.php')); - } - - public function tearDown(): void - { - unlink($this->app->path('/Root/Resources/TestResource.php')); - - parent::tearDown(); - } -} diff --git a/tests/Console/WidgetMakeTest.php b/tests/Console/WidgetMakeTest.php deleted file mode 100644 index 872cf51fc..000000000 --- a/tests/Console/WidgetMakeTest.php +++ /dev/null @@ -1,25 +0,0 @@ -artisan('root:widget', ['name' => 'TestWidget']) - ->assertExitCode(Command::SUCCESS); - - $this->assertFileExists($this->app->path('/Root/Widgets/TestWidget.php')); - } - - public function tearDown(): void - { - unlink($this->app->path('/Root/Widgets/TestWidget.php')); - - parent::tearDown(); - } -} diff --git a/tests/Conversion/ConversionDriverTest.php b/tests/Conversion/ConversionDriverTest.php deleted file mode 100644 index 9e35c4263..000000000 --- a/tests/Conversion/ConversionDriverTest.php +++ /dev/null @@ -1,68 +0,0 @@ -manager = $this->app->make(Manager::class); - - $this->manager->registerConversion('thumb', function () { - // - }); - } - - /** @test */ - public function a_conversion_manager_has_gd_driver() - { - $this->assertInstanceOf(GdDriver::class, $this->manager->driver('gd')); - } - - /** @test */ - public function a_conversion_manager_can_register_conversions() - { - $this->assertTrue(array_key_exists('thumb', $this->manager->getConversions())); - - $this->manager->removeConversion('thumb'); - - $this->assertFalse(array_key_exists('thumb', $this->manager->getConversions())); - } - - /** @test */ - public function a_conversion_manager_can_perform_conversions() - { - $medium = Medium::factory()->create([ - 'name' => 'test', - 'file_name' => 'test.png', - 'mime_type' => 'image/png', - ]); - - $image = UploadedFile::fake()->image('test.png'); - - Storage::disk('public')->put( - "{$medium->id}/test.png", File::get($image->getRealPath()) - ); - - $this->manager->perform($medium); - - Storage::disk($medium->disk)->assertExists($medium->getPath()); - Storage::disk($medium->disk)->assertExists($medium->getPath('thumb')); - - $medium->delete(); - - Storage::disk($medium->disk)->assertMissing($medium->id); - } -} diff --git a/tests/Conversion/ImageTest.php b/tests/Conversion/ImageTest.php deleted file mode 100644 index c0ce2b94a..000000000 --- a/tests/Conversion/ImageTest.php +++ /dev/null @@ -1,182 +0,0 @@ -path('root-tmp')); - } - - /** @test */ - public function jpeg_can_be_converted() - { - $medium = Medium::factory()->create(['file_name' => 'test.jpg']); - - Storage::disk('public')->makeDirectory($medium->id); - - $i = imagecreate(800, 400); - imagejpeg($i, $medium->getAbsolutePath()); - imagedestroy($i); - - ($image = new Image($medium))->setQuality(70)->resize(400)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([400, 200], [$w, $h]); - - ($image = new Image($medium))->resize(400, 100)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([200, 100], [$w, $h]); - - ($image = new Image($medium))->setWidth(400)->setHeight(100)->resize()->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([200, 100], [$w, $h]); - - ($image = new Image($medium))->crop(400)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([400, 400], [$w, $h]); - - ($image = new Image($medium))->crop(100, 400)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([100, 400], [$w, $h]); - - ($image = new Image($medium))->setWidth(400)->setHeight(100)->crop()->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([400, 100], [$w, $h]); - } - - /** @test */ - public function png_can_be_converted() - { - $medium = Medium::factory()->create(['file_name' => 'test.png']); - - Storage::disk('public')->makeDirectory($medium->id); - - $i = imagecreate(800, 400); - imagecolorallocate($i, 0, 0, 0); - imagesavealpha($i, true); - imagepng($i, $medium->getAbsolutePath()); - imagedestroy($i); - - ($image = new Image($medium))->setQuality(70)->resize(400)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([400, 200], [$w, $h]); - - ($image = new Image($medium))->resize(400, 100)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([200, 100], [$w, $h]); - - ($image = new Image($medium))->setWidth(400)->setHeight(100)->resize()->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([200, 100], [$w, $h]); - - ($image = new Image($medium))->crop(400)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([400, 400], [$w, $h]); - - ($image = new Image($medium))->crop(100, 400)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([100, 400], [$w, $h]); - - ($image = new Image($medium))->setWidth(400)->setHeight(100)->crop()->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([400, 100], [$w, $h]); - } - - /** @test */ - public function gif_can_be_converted() - { - $medium = Medium::factory()->create(['file_name' => 'test.png']); - - Storage::disk('public')->makeDirectory($medium->id); - - $i = imagecreate(800, 400); - imagegif($i, $medium->getAbsolutePath()); - imagedestroy($i); - - ($image = new Image($medium))->setQuality(70)->resize(400)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([400, 200], [$w, $h]); - - ($image = new Image($medium))->resize(400, 100)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([200, 100], [$w, $h]); - - ($image = new Image($medium))->setWidth(400)->setHeight(100)->resize()->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([200, 100], [$w, $h]); - - ($image = new Image($medium))->crop(400)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([400, 400], [$w, $h]); - - ($image = new Image($medium))->crop(100, 400)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([100, 400], [$w, $h]); - - ($image = new Image($medium))->setWidth(400)->setHeight(100)->crop()->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([400, 100], [$w, $h]); - } - - /** @test */ - public function webp_can_be_converted() - { - $medium = Medium::factory()->create(['file_name' => 'test.png']); - - Storage::disk('public')->makeDirectory($medium->id); - - $i = imagecreatetruecolor(800, 400); - imagewebp($i, $medium->getAbsolutePath()); - imagedestroy($i); - - ($image = new Image($medium))->setQuality(70)->resize(400)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([400, 200], [$w, $h]); - - ($image = new Image($medium))->resize(400, 100)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([200, 100], [$w, $h]); - - ($image = new Image($medium))->setWidth(400)->setHeight(100)->resize()->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([200, 100], [$w, $h]); - - ($image = new Image($medium))->crop(400)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([400, 400], [$w, $h]); - - ($image = new Image($medium))->crop(100, 400)->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([100, 400], [$w, $h]); - - ($image = new Image($medium))->setWidth(400)->setHeight(100)->crop()->save(); - [$w, $h] = getimagesize($image->getPath()); - $this->assertSame([400, 100], [$w, $h]); - } - - /** @test */ - public function not_supported_types_cannot_be_converted() - { - $medium = Medium::factory()->create(['file_name' => 'test.png']); - - Storage::disk('public')->makeDirectory($medium->id); - - $i = imagecreatetruecolor(800, 400); - imagexbm($i, $medium->getAbsolutePath()); - imagedestroy($i); - - $type = exif_imagetype($medium->getAbsolutePath()); - - $this->expectExceptionMessage("The file type [{$type}] is not supported"); - (new Image($medium))->setQuality(70)->resize(400)->save(); - } -} diff --git a/tests/Extracts/ExtractTest.php b/tests/Extracts/ExtractTest.php deleted file mode 100644 index 8d1dd9ff4..000000000 --- a/tests/Extracts/ExtractTest.php +++ /dev/null @@ -1,137 +0,0 @@ -extract = new LongPosts(); - } - - /** @test */ - public function an_extract_has_key() - { - $this->assertSame('long-posts', $this->extract->getKey()); - } - - /** @test */ - public function an_extract_has_name() - { - $this->assertSame('Long Posts', $this->extract->getName()); - } - - /** @test */ - public function an_extract_throws_exception_if_cant_resolve_query() - { - $this->expectException(QueryResolutionException::class); - - $this->extract->resolveQuery($this->app['request']); - } - - /** @test */ - public function an_extract_resolvers_query() - { - $this->extract->withQuery(function () { - return Post::query(); - }); - - $this->assertSame( - Post::query()->toSql(), - $this->extract->resolveQuery($this->app['request'])->toSql() - ); - } - - /** @test */ - public function an_extract_registers_routes() - { - $this->app['router']->prefix('posts/extracts')->group(function ($router) { - $this->extract->registerRoutes($router); - }); - - $this->assertSame('/posts/extracts/long-posts', $this->extract->getUri()); - - $this->assertArrayHasKey( - trim($this->extract->getUri(), '/'), - $this->app['router']->getRoutes()->get('GET') - ); - } - - /** @test */ - public function an_extract_resolves_actions() - { - $this->extract->withActions([ - PublishPosts::make(), - ]); - - $this->assertSame( - Actions::make(array_merge($this->extract->actions($this->app['request']), [PublishPosts::make()]))->toArray(), - $this->extract->resolveActions($this->app['request'])->toArray() - ); - } - - /** @test */ - public function an_extract_resolves_filters() - { - $this->extract->withFilters([ - Published::make(), - ]); - - $this->assertSame( - Filters::make(array_merge($this->extract->filters($this->app['request']), [Published::make()]))->toArray(), - $this->extract->resolveFilters($this->app['request'])->toArray() - ); - } - - /** @test */ - public function an_extract_resolves_fields() - { - $this->extract->withFields([ - Text::make(__('Name')), - ]); - - $this->assertSame( - Fields::make(array_merge($this->extract->fields($this->app['request']), [Text::make(__('Name'))]))->toArray(), - $this->extract->resolveFields($this->app['request'])->toArray() - ); - } - - /** @test */ - public function an_extract_resolves_widgets() - { - $this->extract->withWidgets([ - PostsCount::make(), - ]); - - $this->assertSame( - Widgets::make(array_merge($this->extract->widgets($this->app['request']), [PostsCount::make()]))->toArray(), - $this->extract->resolveWidgets($this->app['request'])->toArray() - ); - } - - /** @test */ - public function an_extract_has_array_representation() - { - $this->assertSame([ - 'key' => $this->extract->getKey(), - 'name' => $this->extract->getName(), - 'url' => $this->extract->getUri(), - ], $this->extract->toArray()); - } -} diff --git a/tests/Extracts/LongPosts.php b/tests/Extracts/LongPosts.php deleted file mode 100644 index 8530acd29..000000000 --- a/tests/Extracts/LongPosts.php +++ /dev/null @@ -1,10 +0,0 @@ -field = new BelongsToMany('Tag'); - } - - /** @test */ - public function a_belongs_to_many_field_has_custom_hydration() - { - $this->assertTrue(true); - } -} diff --git a/tests/Fields/BelongsToTest.php b/tests/Fields/BelongsToTest.php deleted file mode 100644 index 7b0d7641e..000000000 --- a/tests/Fields/BelongsToTest.php +++ /dev/null @@ -1,32 +0,0 @@ -field = new BelongsTo('Author'); - } - - /** @test */ - public function a_belongs_to_field_has_custom_hydration() - { - $model = new Post(); - - $value = Author::query()->get()->first(); - - $this->field->resolveHydrate($this->app['request'], $model, $value); - - $this->assertSame($value, $model->getRelation('author')); - } -} diff --git a/tests/Fields/BooleanTest.php b/tests/Fields/BooleanTest.php deleted file mode 100644 index 45bbd4484..000000000 --- a/tests/Fields/BooleanTest.php +++ /dev/null @@ -1,30 +0,0 @@ -field = new Boolean('Admin'); - } - - /** @test */ - public function a_boolean_field_has_checkbox_type() - { - $this->assertSame('checkbox', $this->field->type); - } - - /** @test */ - public function a_boolean_field_has_checkbox_component() - { - $this->assertSame('Checkbox', $this->field->getComponent()); - } -} diff --git a/tests/Fields/CheckboxTest.php b/tests/Fields/CheckboxTest.php deleted file mode 100644 index 72427fdbb..000000000 --- a/tests/Fields/CheckboxTest.php +++ /dev/null @@ -1,30 +0,0 @@ -field = new Checkbox('Permissions'); - } - - /** @test */ - public function a_checkbox_field_has_checkbox_type() - { - $this->assertSame('checkbox', $this->field->type); - } - - /** @test */ - public function a_checkbox_field_has_checkbox_component() - { - $this->assertSame('Checkbox', $this->field->getComponent()); - } -} diff --git a/tests/Fields/ColorTest.php b/tests/Fields/ColorTest.php deleted file mode 100644 index b32136f04..000000000 --- a/tests/Fields/ColorTest.php +++ /dev/null @@ -1,24 +0,0 @@ -field = new Color('Primary'); - } - - /** @test */ - public function a_color_field_has_color_type() - { - $this->assertSame('color', $this->field->type); - } -} diff --git a/tests/Fields/DateTest.php b/tests/Fields/DateTest.php deleted file mode 100644 index 09ad3031c..000000000 --- a/tests/Fields/DateTest.php +++ /dev/null @@ -1,61 +0,0 @@ -field = new Date('Created At'); - } - - /** @test */ - public function a_date_field_has_datetime_component() - { - $this->assertSame('DateTime', $this->field->getComponent()); - } - - /** @test */ - public function a_date_field_has_time() - { - $model = new Post(); - - $now = DateFactory::now(); - - $model->setAttribute('created_at', $now); - - $this->assertSame($now->format('Y-m-d'), $this->field->resolveFormat($this->app['request'], $model)); - - $this->field->withTime(); - - $this->assertSame($now->format('Y-m-d H:i:s'), $this->field->resolveFormat($this->app['request'], $model)); - } - - /** @test */ - public function a_date_field_has_timezone() - { - $model = new Post(); - - $now = DateFactory::now(); - - $model->setAttribute('created_at', $now); - - $this->assertSame($now->format('Y-m-d'), $this->field->resolveFormat($this->app['request'], $model)); - - $this->field->withTime()->timezone('Europe/Budapest'); - - $this->assertSame( - $now->tz('Europe/Budapest')->format('Y-m-d H:i:s'), - $this->field->resolveFormat($this->app['request'], $model) - ); - } -} diff --git a/tests/Fields/EditorTest.php b/tests/Fields/EditorTest.php deleted file mode 100644 index 2a5c50637..000000000 --- a/tests/Fields/EditorTest.php +++ /dev/null @@ -1,61 +0,0 @@ -field = new Editor('Content'); - } - - /** @test */ - public function an_editor_field_has_editor_component() - { - $this->assertSame('Editor', $this->field->getComponent()); - } - - /** @test */ - public function an_editor_field_has_configuration() - { - $this->field->withConfig(function () { - return ['key' => 'value']; - }); - - $this->assertSame(['key' => 'value'], $this->field->getConfig()); - } - - /** @test */ - public function an_editor_field_resolves_media_field() - { - $this->field->withMedia(function ($media) { - $media->label('Attachments'); - }); - - $this->assertSame('Attachments', $this->field->getMedia()->label); - } - - /** @test */ - public function an_editor_field_register_routes() - { - $this->field->withMedia(); - - $this->app['router']->prefix('posts/fields')->group(function ($router) { - $this->field->registerRoutes($router); - }); - - $this->assertSame('/posts/fields/content', $this->field->getUri()); - - $this->assertArrayHasKey( - trim($this->field->getMedia()->getUri(), '/'), - $this->app['router']->getRoutes()->get('GET') - ); - } -} diff --git a/tests/Fields/FieldTest.php b/tests/Fields/FieldTest.php deleted file mode 100644 index 02e56df63..000000000 --- a/tests/Fields/FieldTest.php +++ /dev/null @@ -1,340 +0,0 @@ -field = new Text('Title'); - } - - /** @test */ - public function a_field_gets_attributes() - { - $this->assertSame('title', $this->field->name); - $this->assertSame('title', $this->field->getAttribute('name')); - - $this->assertSame( - ['label' => 'Title', 'name' => 'title', 'id' => 'title', 'type' => 'text'], - $this->field->getAttributes() - ); - } - - /** @test */ - public function a_field_checks_attributes() - { - $this->assertTrue(isset($this->field->name)); - $this->assertTrue($this->field->hasAttribute('name')); - - $this->assertFalse(isset($this->field->foo)); - $this->assertFalse($this->field->hasAttribute('foo')); - } - - /** @test */ - public function a_field_sets_attributes() - { - $this->field->min = 10; - $this->field->setAttribute('max', 30); - $this->field->setAttributes(['disabled' => true]); - - $this->assertSame(10, $this->field->getAttribute('min')); - $this->assertSame(30, $this->field->getAttribute('max')); - $this->assertTrue($this->field->getAttribute('disabled')); - } - - /** @test */ - public function a_field_resolves_attributes() - { - $model = new Post(); - - $this->field->setAttribute('disabled', function () { - return false; - }); - - $this->assertFalse($this->field->resolveAttribute($this->app['request'], $model, 'disabled')); - } - - /** @test */ - public function a_field_removes_attributes() - { - $this->field->setAttribute('max', 30); - $this->field->setAttribute('min', 10); - $this->field->setAttribute('disabled', true); - - $this->assertTrue($this->field->hasAttribute('max')); - $this->assertTrue($this->field->hasAttribute('min')); - $this->assertTrue($this->field->hasAttribute('disabled')); - - $this->field->removeAttribute('max'); - $this->field->removeAttributes(['min']); - unset($this->field->disabled); - - $this->assertFalse($this->field->hasAttribute('max')); - $this->assertFalse($this->field->hasAttribute('min')); - $this->assertFalse($this->field->hasAttribute('disabled')); - } - - /** @test */ - public function a_field_clears_attributes() - { - $this->assertNotEmpty($this->field->getAttributes()); - - $this->field->clearAttributes(); - - $this->assertEmpty($this->field->getAttributes()); - } - - /** @test */ - public function a_field_has_label_attribute() - { - $this->field->label('Test'); - - $this->assertSame('Test', $this->field->label); - } - - /** @test */ - public function a_field_has_name_attribute() - { - $this->field->name('test'); - - $this->assertSame('test', $this->field->name); - } - - /** @test */ - public function a_field_has_id_attribute() - { - $this->field->id('test'); - - $this->assertSame('test', $this->field->id); - } - - /** @test */ - public function a_field_has_readonly_attribute() - { - $this->field->readonly(); - - $this->assertTrue($this->field->readonly); - - $this->field->readonly(false); - - $this->assertFalse($this->field->readonly); - } - - /** @test */ - public function a_field_has_disabled_attribute() - { - $this->field->disabled(); - - $this->assertTrue($this->field->disabled); - - $this->field->disabled(false); - - $this->assertFalse($this->field->disabled); - } - - /** @test */ - public function a_field_has_required_attribute() - { - $this->field->required(); - - $this->assertTrue($this->field->required); - - $this->field->required(false); - - $this->assertFalse($this->field->required); - } - - /** @test */ - public function a_field_has_type_attribute() - { - $this->assertSame('text', $this->field->type); - } - - /** @test */ - public function a_field_has_placeholder_attribute() - { - $this->assertNull($this->field->placeholder); - - $this->field->placeholder('Root'); - - $this->assertSame('Root', $this->field->placeholder); - } - - /** @test */ - public function a_field_has_value() - { - $model = new Post(['title' => 'Test Post']); - - $this->assertSame( - $model->title, - $this->field->resolveValue($this->app['request'], $model) - ); - - $this->field->value(function ($request, $model, $value) { - return '__fake__'; - }); - - $this->assertSame( - '__fake__', - $this->field->resolveValue($this->app['request'], $model) - ); - } - - /** @test */ - public function a_field_has_formattedValue() - { - $model = new Post(['title' => 'Test Post']); - - $this->assertSame( - 'Test Post', - $this->field->resolveFormat($this->app['request'], $model) - ); - - $this->field->format(function ($request, $model, $value) { - return strtoupper($value); - }); - - $this->assertSame( - 'TEST POST', - $this->field->resolveFormat($this->app['request'], $model) - ); - } - - /** @test */ - public function a_field_persists_model_attribute() - { - $model = new Post(); - - $this->app['request']->merge(['title' => 'Test']); - - $this->assertNull($model->title); - - $this->field->persist( - $this->app['request'], - $model, - $this->field->getValueForHydrate($this->app['request'], $model) - ); - - $model->save(); - - $this->assertSame('Test', $model->title); - } - - /** @test */ - public function a_field_hydrates_model_attribute() - { - $model = new Post(['title' => 'Test Post']); - - $this->field->resolveHydrate($this->app['request'], $model, 'Test'); - - $this->assertSame('Test', $model->title); - - $this->field->hydrate(function ($request, $model, $value) { - $model->setAttribute($this->field->name, strtoupper($value)); - }); - - $this->field->resolveHydrate($this->app['request'], $model, 'Test'); - - $this->assertSame('TEST', $model->title); - } - - /** @test */ - public function a_field_has_validation_rules() - { - $model = new Post(); - - $this->assertFalse($model->exists); - - $this->field->rules(['required']) - ->createRules(['unique:users']) - ->updateRules(['unique:users,1']); - - $this->assertSame( - [$this->field->name => ['required', 'unique:users']], - $this->field->toValidate($this->app['request'], $model) - ); - - $model->exists = true; - $this->assertTrue($model->exists); - - $this->assertSame( - [$this->field->name => ['required', 'unique:users,1']], - $this->field->toValidate($this->app['request'], $model) - ); - } - - /** @test */ - public function a_field_has_display_representation() - { - $model = new Post(['title' => 'Test Post']); - - $this->assertSame( - array_merge($this->field->getAttributes(), [ - 'formattedValue' => $model->title, - 'searchable' => $this->field->isSearchable($this->app['request']), - 'sortable' => $this->field->isSortable($this->app['request']), - 'value' => $model->title, - ]), - $this->field->toDisplay($this->app['request'], $model) - ); - } - - /** @test */ - public function a_field_has_input_representation() - { - $model = new Post(['title' => 'Test Post']); - - $this->field->help('Note'); - - $this->assertSame( - array_merge($this->field->getAttributes(), [ - 'component' => $this->field->getComponent(), - 'formattedValue' => $model->title, - 'help' => 'Note', - 'value' => $model->title, - ]), - $this->field->toInput($this->app['request'], $model) - ); - } - - /** @test */ - public function a_field_can_be_searchable() - { - $this->assertFalse($this->field->isSearchable($this->app['request'])); - - $this->field->searchable(); - - $this->assertTrue($this->field->isSearchable($this->app['request'])); - - $this->field->searchable(function () { - return false; - }); - - $this->assertFalse($this->field->isSearchable($this->app['request'])); - } - - /** @test */ - public function a_field_can_be_sortable() - { - $this->assertFalse($this->field->isSortable($this->app['request'])); - - $this->field->sortable(); - - $this->assertTrue($this->field->isSortable($this->app['request'])); - - $this->field->sortable(function () { - return false; - }); - - $this->assertFalse($this->field->isSortable($this->app['request'])); - } -} diff --git a/tests/Fields/HasManyTest.php b/tests/Fields/HasManyTest.php deleted file mode 100644 index 2f3501824..000000000 --- a/tests/Fields/HasManyTest.php +++ /dev/null @@ -1,95 +0,0 @@ -field = new HasMany('Posts'); - } - - /** @test */ - public function a_has_many_field_has_select_component() - { - $this->assertSame('Select', $this->field->getComponent()); - } - - /** @test */ - public function a_has_many_field_has_options() - { - $author = new Author(); - - $this->assertSame( - Post::query()->get()->map(function ($model) { - return ['value' => $model->getKey(), 'formattedValue' => $model->getKey()]; - })->toArray(), - $this->field->resolveOptions($this->app['request'], $author) - ); - } - - /** @test */ - public function a_has_many_field_has_customizable_options() - { - $author = new Author(); - - $this->field->display('title'); - - $this->assertSame( - Post::query()->get()->map(function ($model) { - return ['value' => $model->getKey(), 'formattedValue' => $model->title]; - })->toArray(), - $this->field->resolveOptions($this->app['request'], $author) - ); - - $closure = function ($request, $model) { - return strtoupper($model->title); - }; - - $this->field->display($closure); - - $this->assertSame( - Post::query()->get()->map(function ($model) use ($closure) { - return ['value' => $model->getKey(), 'formattedValue' => $closure($this->app['request'], $model)]; - })->toArray(), - $this->field->resolveOptions($this->app['request'], $author) - ); - } - - /** @test */ - public function a_has_many_field_has_customizable_query() - { - $author = new Author(); - - $this->assertSame( - 'select * from "posts"', - $this->field->resolveRelatableQuery($this->app['request'], $author)->getQuery()->toSql() - ); - - $this->field->withRelatableQuery(function ($request, $query) { - return $query->where('posts.title', 'Foo'); - }); - - $query = $this->field->resolveRelatableQuery($this->app['request'], $author)->getQuery(); - - $this->assertSame('select * from "posts" where "posts"."title" = ?', $query->toSql()); - $this->assertSame(['Foo'], $query->getBindings()); - } - - /** @test */ - public function a_has_many_field_can_be_async() - { - $this->field->async(); - - $this->assertSame('AsyncSelect', $this->field->getComponent()); - } -} diff --git a/tests/Fields/HiddenTest.php b/tests/Fields/HiddenTest.php deleted file mode 100644 index 71c3da85a..000000000 --- a/tests/Fields/HiddenTest.php +++ /dev/null @@ -1,24 +0,0 @@ -field = new Hidden('Key'); - } - - /** @test */ - public function a_hidden_field_has_hidden_type() - { - $this->assertSame('hidden', $this->field->type); - } -} diff --git a/tests/Fields/IDTest.php b/tests/Fields/IDTest.php deleted file mode 100644 index 68bc0d877..000000000 --- a/tests/Fields/IDTest.php +++ /dev/null @@ -1,28 +0,0 @@ -field = new ID(); - } - - /** @test */ - public function an_id_field_can_be_uuid() - { - $this->assertFalse($this->field->isUuid()); - - $this->field->uuid(); - - $this->assertTrue($this->field->isUuid()); - } -} diff --git a/tests/Fields/JsonTest.php b/tests/Fields/JsonTest.php deleted file mode 100644 index afd7f2ded..000000000 --- a/tests/Fields/JsonTest.php +++ /dev/null @@ -1,89 +0,0 @@ -field = new Json('Inventory'); - } - - /** @test */ - public function a_json_field_has_fieldset_component() - { - $this->assertSame('Fieldset', $this->field->getComponent()); - } - - /** @test */ - public function a_json_field_resolves_fields() - { - $this->field->withFields([ - Number::make('Quantity'), - ]); - - $this->assertSame( - Fields::make(array_merge($this->field->fields($this->app['request']), [Number::make('Quantity')]))->toArray(), - $this->field->resolveFields($this->app['request'])->toArray() - ); - } - - /** @test */ - public function a_json_field_registers_routes() - { - $this->app['router']->prefix('posts/fields')->group(function ($router) { - $this->field->registerRoutes($router); - }); - - $this->assertSame('/posts/fields/inventory', $this->field->getUri()); - } - - /** @test */ - public function a_json_field_has_custom_input_representation() - { - $model = (new Post())->forceFill([ - 'inventory' => $data = ['quantity' => 10], - ]); - - $field = Number::make('Quantity'); - - $this->field->withFields([$field]); - - $this->assertSame([ - 'label' => 'Inventory', - 'name' => 'inventory', - 'id' => 'inventory', - 'component' => 'Fieldset', - 'formattedValue' => $data, - 'help' => null, - 'value' => $data, - 'fields' => [$field->toInput($this->app['request'], FieldsetModel::make()->forceFill($data))], - ], $this->field->toInput($this->app['request'], $model)); - } - - /** @test */ - public function a_json_field_has_custom_validation() - { - $model = new Post(); - - $field = Number::make('Quantity')->rules(['required']); - - $this->field->withFields([$field]); - - $this->assertSame( - ['inventory' => [], 'inventory.quantity' => ['required']], - $this->field->toValidate($this->app['request'], $model) - ); - } -} diff --git a/tests/Fields/NumberTest.php b/tests/Fields/NumberTest.php deleted file mode 100644 index e65c866fc..000000000 --- a/tests/Fields/NumberTest.php +++ /dev/null @@ -1,44 +0,0 @@ -field = new Number('Age'); - } - - /** @test */ - public function a_number_field_has_number_type() - { - $this->assertSame('number', $this->field->type); - } - - /** @test */ - public function a_number_field_has_min_attribute() - { - $this->assertNull($this->field->min); - - $this->field->min(10); - - $this->assertSame(10, $this->field->min); - } - - /** @test */ - public function a_number_field_has_max_attribute() - { - $this->assertNull($this->field->max); - - $this->field->max(10); - - $this->assertSame(10, $this->field->max); - } -} diff --git a/tests/Fields/RadioTest.php b/tests/Fields/RadioTest.php deleted file mode 100644 index 3d3c0c7fa..000000000 --- a/tests/Fields/RadioTest.php +++ /dev/null @@ -1,30 +0,0 @@ -field = new Radio('Role'); - } - - /** @test */ - public function a_radio_field_has_radio_type() - { - $this->assertSame('radio', $this->field->type); - } - - /** @test */ - public function a_radio_field_has_radio_component() - { - $this->assertSame('Radio', $this->field->getComponent()); - } -} diff --git a/tests/Fields/RangeTest.php b/tests/Fields/RangeTest.php deleted file mode 100644 index 8aec66b74..000000000 --- a/tests/Fields/RangeTest.php +++ /dev/null @@ -1,24 +0,0 @@ -field = new Range('Age'); - } - - /** @test */ - public function a_range_field_has_range_type() - { - $this->assertSame('range', $this->field->type); - } -} diff --git a/tests/Fields/RelationTest.php b/tests/Fields/RelationTest.php deleted file mode 100644 index dd0a0fac8..000000000 --- a/tests/Fields/RelationTest.php +++ /dev/null @@ -1,164 +0,0 @@ -field = new class('Author') extends Relation - { - // - }; - } - - /** @test */ - public function a_relation_field_has_select_component() - { - $this->assertSame('Select', $this->field->getComponent()); - } - - /** @test */ - public function a_relation_field_has_access_to_a_model_relation() - { - $model = new Post(); - - $this->assertInstanceOf(EloquentRelation::class, $this->field->getRelation($model)); - - $field = new class('Author', 'author', function ($related) { - return $related->belongsTo(Author::class, 'id', 'author_id', 'author'); - }) extends Relation {}; - - $this->assertInstanceOf(EloquentRelation::class, $field->getRelation($model)); - } - - /** @test */ - public function a_relation_field_can_be_nullable() - { - $this->assertFalse($this->field->isNullable()); - - $this->field->nullable(); - - $this->assertTrue($this->field->isNullable()); - } - - /** @test */ - public function a_relation_field_has_searchable_columns() - { - $this->assertSame(['id'], $this->field->getSearchableColumns()); - - $this->field->searchable(true, ['name']); - - $this->assertSame(['name'], $this->field->getSearchableColumns()); - } - - /** @test */ - public function a_relation_field_has_sortable_column() - { - $this->assertSame('id', $this->field->getSortableColumn()); - - $this->field->sortable(true, 'name'); - - $this->assertSame('name', $this->field->getSortableColumn()); - } - - /** @test */ - public function a_relation_field_can_be_async() - { - $this->assertFalse($this->field->isAsync()); - - $this->field->async(); - - $this->assertTrue($this->field->isAsync()); - - $this->assertSame('AsyncSelect', $this->field->getComponent()); - } - - /** @test */ - public function a_relation_field_registers_routes() - { - $this->field->async(); - - $this->app['router']->prefix('posts/fields')->group(function ($router) { - $this->field->registerRoutes($router); - }); - - $this->assertSame('/posts/fields/author', $this->field->getUri()); - - $this->assertArrayHasKey( - trim($this->field->getUri(), '/'), - $this->app['router']->getRoutes()->get('GET') - ); - } - - /** @test */ - public function a_relation_field_has_options() - { - $post = new Post(); - - $this->assertSame( - Author::query()->get()->map(function ($model) { - return ['value' => $model->getKey(), 'formattedValue' => $model->getKey()]; - })->toArray(), - $this->field->resolveOptions($this->app['request'], $post) - ); - } - - /** @test */ - public function a_relation_field_has_customizable_options() - { - $post = new Post(); - - $this->field->display('name'); - - $this->assertSame( - Author::query()->get()->map(function ($model) { - return ['value' => $model->getKey(), 'formattedValue' => $model->name]; - })->toArray(), - $this->field->resolveOptions($this->app['request'], $post) - ); - - $closure = function ($request, $model) { - return strtoupper($model->name); - }; - - $this->field->display($closure); - - $this->assertSame( - Author::query()->get()->map(function ($model) use ($closure) { - return ['value' => $model->getKey(), 'formattedValue' => $closure($this->app['request'], $model)]; - })->toArray(), - $this->field->resolveOptions($this->app['request'], $post) - ); - } - - /** @test */ - public function a_relation_field_has_customizable_query() - { - $post = new Post(); - - $this->assertSame( - 'select * from "authors"', - $this->field->resolveRelatableQuery($this->app['request'], $post)->getQuery()->toSql() - ); - - $this->field->withRelatableQuery(function ($request, $query) { - return $query->where('authors.name', 'Foo'); - }); - - $query = $this->field->resolveRelatableQuery($this->app['request'], $post)->getQuery(); - - $this->assertSame('select * from "authors" where "authors"."name" = ?', $query->toSql()); - $this->assertSame(['Foo'], $query->getBindings()); - } -} diff --git a/tests/Fields/SelectTest.php b/tests/Fields/SelectTest.php deleted file mode 100644 index c9719c662..000000000 --- a/tests/Fields/SelectTest.php +++ /dev/null @@ -1,60 +0,0 @@ -field = new Select('Status'); - } - - /** @test */ - public function a_select_field_has_select_component() - { - $this->assertSame('Select', $this->field->getComponent()); - } - - /** @test */ - public function a_select_field_can_be_nullable() - { - $this->assertFalse($this->field->isNullable()); - - $this->field->nullable(); - - $this->assertTrue($this->field->isNullable()); - } - - /** @test */ - public function a_select_field_can_be_multiple() - { - $this->assertNull($this->field->multiple); - - $this->field->multiple(); - - $this->assertTrue($this->field->multiple); - } - - /** @test */ - public function a_select_field_has_options() - { - $model = new Author(); - - $this->assertEmpty($this->field->resolveOptions($this->app['request'], $model)); - - $this->field->options(['key' => 'value']); - - $this->assertSame( - [['value' => 'key', 'formattedValue' => 'value']], - $this->field->resolveOptions($this->app['request'], $model) - ); - } -} diff --git a/tests/Fields/TagTest.php b/tests/Fields/TagTest.php deleted file mode 100644 index 4bc8ef505..000000000 --- a/tests/Fields/TagTest.php +++ /dev/null @@ -1,38 +0,0 @@ -field = new Tag('Labels'); - } - - /** @test */ - public function a_tag_field_has_select_component() - { - $this->assertSame('Tag', $this->field->getComponent()); - } - - /** @test */ - public function a_tag_field_custom_format() - { - $model = new Post(); - - $model->setAttribute('labels', ['Root', 'Bazar']); - - $this->assertSame( - 'Root, Bazar', - $this->field->resolveFormat($this->app['request'], $model) - ); - } -} diff --git a/tests/Fields/TextTest.php b/tests/Fields/TextTest.php deleted file mode 100644 index d1f5ee1a6..000000000 --- a/tests/Fields/TextTest.php +++ /dev/null @@ -1,54 +0,0 @@ -field = new Text('Title'); - } - - /** @test */ - public function a_text_field_has_text_type() - { - $this->assertSame('text', $this->field->type); - } - - /** @test */ - public function a_number_text_has_size_attribute() - { - $this->assertNull($this->field->size); - - $this->field->size(10); - - $this->assertSame(10, $this->field->size); - } - - /** @test */ - public function a_number_text_has_minlength_attribute() - { - $this->assertNull($this->field->minlength); - - $this->field->minlength(10); - - $this->assertSame(10, $this->field->minlength); - } - - /** @test */ - public function a_number_text_has_maxlength_attribute() - { - $this->assertNull($this->field->maxlength); - - $this->field->maxlength(10); - - $this->assertSame(10, $this->field->maxlength); - } -} diff --git a/tests/Fields/TextareaTest.php b/tests/Fields/TextareaTest.php deleted file mode 100644 index 79a59c79a..000000000 --- a/tests/Fields/TextareaTest.php +++ /dev/null @@ -1,44 +0,0 @@ -field = new Textarea('Content'); - } - - /** @test */ - public function a_text_field_has_textarea_component() - { - $this->assertSame('Textarea', $this->field->getComponent()); - } - - /** @test */ - public function a_number_textarea_has_rows_attribute() - { - $this->assertNull($this->field->rows); - - $this->field->rows(10); - - $this->assertSame(10, $this->field->rows); - } - - /** @test */ - public function a_number_textarea_has_cols_attribute() - { - $this->assertNull($this->field->cols); - - $this->field->cols(10); - - $this->assertSame(10, $this->field->cols); - } -} diff --git a/tests/Filters/Published.php b/tests/Filters/Published.php deleted file mode 100644 index c916aa857..000000000 --- a/tests/Filters/Published.php +++ /dev/null @@ -1,24 +0,0 @@ - 'All', - 'published' => 'Published', - 'draft' => 'Draft', - ]); - } -} diff --git a/tests/Http/Controllers/ActionControllerTest.php b/tests/Http/Controllers/ActionControllerTest.php deleted file mode 100644 index 858f4bfff..000000000 --- a/tests/Http/Controllers/ActionControllerTest.php +++ /dev/null @@ -1,45 +0,0 @@ -action = new PublishPosts(); - - $this->app->make('root')->routes(function ($router) { - $router->group( - ['prefix' => $this->resource->getKey().'/actions', 'resource' => $this->resource->getKey()], - function ($router) { - $this->action->registerRoutes($router); - } - ); - }); - } - - /** @test */ - public function an_action_controller_has_index() - { - $this->app['request']->setRouteResolver(function () { - return $this->app['router']->getRoutes()->get('GET')['root/posts/actions/publish-posts']; - }); - - $this->action->withQuery(function () { - return Post::query(); - }); - - $this->actingAs($this->admin) - ->post('/root/posts/actions/publish-posts') - ->assertRedirect() - ->assertSessionHas('alerts.action-publish-posts'); - } -} diff --git a/tests/Http/Controllers/DashboardControllerTest.php b/tests/Http/Controllers/DashboardControllerTest.php deleted file mode 100644 index 331df6be5..000000000 --- a/tests/Http/Controllers/DashboardControllerTest.php +++ /dev/null @@ -1,21 +0,0 @@ -actingAs($this->admin) - ->get('/root') - ->assertOk() - ->assertViewIs('root::app') - ->assertViewHas([ - 'page.component' => 'Dashboard', - 'page.props.widgets' => $this->app->make('root')->widgets->toArray(), - ]); - } -} diff --git a/tests/Http/Controllers/ExtractControllerTest.php b/tests/Http/Controllers/ExtractControllerTest.php deleted file mode 100644 index 101507eaa..000000000 --- a/tests/Http/Controllers/ExtractControllerTest.php +++ /dev/null @@ -1,51 +0,0 @@ -extract = new LongPosts(); - - $this->app->make('root')->routes(function ($router) { - $router->group( - ['prefix' => $this->resource->getKey().'/extracts', 'resource' => $this->resource->getKey()], - function ($router) { - $this->extract->registerRoutes($router); - } - ); - }); - } - - /** @test */ - public function an_extract_controller_has_index() - { - $this->app['request']->setRouteResolver(function () { - return $this->app['router']->getRoutes()->get('GET')['root/posts/extracts/long-posts']; - }); - - $this->extract->withQuery(function () { - return Post::query(); - }); - - $this->actingAs($this->admin) - ->get('/root/posts/extracts/long-posts') - ->assertOk() - ->assertViewIs('root::app') - ->assertViewHas([ - 'page.component' => 'Extracts/Index', - 'page.props' => function ($props) { - return empty(array_diff_key($this->extract->toIndex($this->app['request']), $props)); - }, - ]); - } -} diff --git a/tests/Http/Controllers/MediaControllerTest.php b/tests/Http/Controllers/MediaControllerTest.php deleted file mode 100644 index 9e370ab6d..000000000 --- a/tests/Http/Controllers/MediaControllerTest.php +++ /dev/null @@ -1,97 +0,0 @@ -field = new Media('Media'); - - $this->medium = Medium::factory()->create(); - - $this->app->make('root')->routes(function ($router) { - $router->group( - ['prefix' => $this->resource->getKey().'/fields', 'resource' => $this->resource->getKey()], - function ($router) { - $this->field->registerRoutes($router); - } - ); - }); - } - - /** @test */ - public function a_media_controller_has_index() - { - $this->app['request']->setRouteResolver(function () { - return $this->app['router']->getRoutes()->get('GET')['root/posts/fields/media']; - }); - - $this->actingAs($this->admin) - ->get('/root/posts/fields/media') - ->assertOk() - ->assertJson($this->field->mapItems($this->app['request'], new Post())); - } - - /** @test */ - public function a_media_controller_has_store() - { - Queue::fake(); - - $this->app['request']->setRouteResolver(function () { - return $this->app['router']->getRoutes()->get('POST')['root/posts/fields/media']; - }); - - $this->actingAs($this->admin) - ->post('/root/posts/fields/media', [ - 'file' => UploadedFile::fake()->image('test.png.chunk'), - ], [ - 'X-Chunk-Index' => 1, - 'X-Chunk-Total' => 2, - ]) - ->assertNoContent(); - - $this->actingAs($this->admin) - ->post('/root/posts/fields/media', [ - 'file' => UploadedFile::fake()->image('test.png.chunk'), - ], [ - 'X-Chunk-Index' => 1, - 'X-Chunk-Total' => 1, - ]) - ->assertCreated() - ->assertJson(['name' => 'test']); - - $this->assertDatabaseHas('root_media', ['name' => 'test']); - - Queue::assertPushedWithChain(MoveFile::class, [PerformConversions::class]); - } - - /** @test */ - public function a_media_controller_has_destroy() - { - $this->app['request']->setRouteResolver(function () { - return $this->app['router']->getRoutes()->get('DELETE')['root/posts/fields/media']; - }); - - $this->actingAs($this->admin) - ->delete('/root/posts/fields/media', ['models' => [$this->medium->getKey()]]) - ->assertNoContent(); - - $this->assertDatabaseMissing('root_media', ['id' => $this->medium->getKey()]); - } -} diff --git a/tests/Http/Controllers/NotificationsControllerTest.php b/tests/Http/Controllers/NotificationsControllerTest.php deleted file mode 100644 index 347543abb..000000000 --- a/tests/Http/Controllers/NotificationsControllerTest.php +++ /dev/null @@ -1,68 +0,0 @@ -admin->notifications()->saveMany( - Notification::factory(10)->make() - ); - } - - /** @test */ - public function a_notifications_controller_has_index() - { - $this->actingAs($this->admin) - ->get('/root/api/notifications') - ->assertOk() - ->assertJson($this->admin->notifications()->paginate()->setPath('/root/api/notifications')->toArray()); - } - - /** @test */ - public function a_notifications_controller_has_show() - { - $notification = $this->admin->notifications->first(); - - $this->actingAs($this->admin) - ->get('/root/api/notifications/'.$notification->getKey()) - ->assertOk() - ->assertJson($notification->toArray()); - } - - /** @test */ - public function a_notifications_controller_has_update() - { - $this->freezeTime(); - - $notification = $this->admin->notifications->first(); - - $this->assertFalse($notification->read()); - - $this->actingAs($this->admin) - ->patch('/root/api/notifications/'.$notification->getKey()) - ->assertOk() - ->assertJson($notification->refresh()->toArray()); - - $this->assertTrue($notification->read()); - } - - /** @test */ - public function a_notifications_controller_has_destroy() - { - $notification = $this->admin->notifications->first(); - - $this->actingAs($this->admin) - ->delete('/root/api/notifications/'.$notification->getKey()) - ->assertOk() - ->assertJson($notification->toArray()); - - $this->assertDatabaseMissing('notifications', ['id' => $notification->getKey()]); - } -} diff --git a/tests/Http/Controllers/RelationFieldControllerTest.php b/tests/Http/Controllers/RelationFieldControllerTest.php deleted file mode 100644 index 6fcebe37c..000000000 --- a/tests/Http/Controllers/RelationFieldControllerTest.php +++ /dev/null @@ -1,53 +0,0 @@ -field = new BelongsTo('Author'); - - $this->field->async(); - - $this->app->make('root')->routes(function ($router) { - $router->group( - ['prefix' => $this->resource->getKey().'/fields', 'resource' => $this->resource->getKey()], - function ($router) { - $this->field->registerRoutes($router); - } - ); - }); - } - - /** @test */ - public function a_relation_controller_has_index() - { - $this->app['request']->setRouteResolver(function () { - return $this->app['router']->getRoutes()->get('GET')['root/posts/fields/author']; - }); - - $model = new Post(); - - $results = $this->field - ->resolveRelatableQuery($this->app['request'], $model) - ->paginate() - ->setPath('/root/posts/fields/author') - ->through(function ($related) use ($model): array { - return $this->field->mapOption($this->app['request'], $model, $related); - }); - - $this->actingAs($this->admin) - ->get('/root/posts/fields/author') - ->assertOk() - ->assertJson($results->toArray()); - } -} diff --git a/tests/Http/Controllers/ResourceControllerTest.php b/tests/Http/Controllers/ResourceControllerTest.php deleted file mode 100644 index d7af4e9bd..000000000 --- a/tests/Http/Controllers/ResourceControllerTest.php +++ /dev/null @@ -1,120 +0,0 @@ -app['request']->setRouteResolver(function () { - return $this->app['router']->getRoutes()->get('GET')['root/posts']; - }); - - $this->actingAs($this->admin) - ->get('/root/posts') - ->assertOk() - ->assertViewIs('root::app') - ->assertViewHas([ - 'page.component' => 'Resources/Index', - 'page.props' => function ($props) { - return empty(array_diff_key($this->resource->toIndex($this->app['request']), $props)); - }, - ]); - } - - /** @test */ - public function a_resource_controller_has_create() - { - $this->app['request']->setRouteResolver(function () { - return $this->app['router']->getRoutes()->get('GET')['root/posts/create']; - }); - - $this->actingAs($this->admin) - ->get('/root/posts/create') - ->assertOk() - ->assertViewIs('root::app') - ->assertViewHas([ - 'page.component' => 'Resources/Form', - 'page.props' => function ($props) { - return empty(array_diff_key($this->resource->toCreate($this->app['request']), $props)); - }, - ]); - } - - /** @test */ - public function a_resource_controller_has_store() - { - $this->actingAs($this->admin) - ->post('/root/posts', [ - 'title' => 'Post Two', - ]) - ->assertRedirect('/root/posts/1') - ->assertSessionHas('alerts.resource-created'); - } - - /** @test */ - public function a_resource_controller_has_show() - { - $model = Post::query()->get()->first(); - - $this->app['request']->setRouteResolver(function () { - return $this->app['router']->getRoutes()->get('GET')['root/posts/{resource_post}']; - }); - - $this->actingAs($this->admin) - ->get('/root/posts/1') - ->assertOk() - ->assertViewIs('root::app') - ->assertViewHas([ - 'page.component' => 'Resources/Show', - 'page.props' => function ($props) use ($model) { - return empty(array_diff_key($this->resource->toShow($this->app['request'], $model), $props)); - }, - ]); - } - - /** @test */ - public function a_resource_controller_has_edit() - { - $model = Post::query()->get()->first(); - - $this->app['request']->setRouteResolver(function () { - return $this->app['router']->getRoutes()->get('GET')['root/posts/{resource_post}/edit']; - }); - - $this->actingAs($this->admin) - ->get('/root/posts/1/edit') - ->assertOk() - ->assertViewIs('root::app') - ->assertViewHas([ - 'page.component' => 'Resources/Form', - 'page.props' => function ($props) use ($model) { - return empty(array_diff_key($this->resource->toEdit($this->app['request'], $model), $props)); - }, - ]); - } - - /** @test */ - public function a_resource_controller_has_update() - { - $this->actingAs($this->admin) - ->patch('/root/posts/1', [ - 'title' => 'Post Two', - ]) - ->assertRedirect('/root/posts/1/edit') - ->assertSessionHas('alerts.resource-updated'); - } - - /** @test */ - public function a_resource_controller_has_destroy() - { - $this->actingAs($this->admin) - ->delete('/root/posts/1') - ->assertRedirect('/root/posts') - ->assertSessionHas('alerts.resource-deleted'); - } -} diff --git a/tests/Http/Controllers/WidgetControllerTest.php b/tests/Http/Controllers/WidgetControllerTest.php deleted file mode 100644 index 8d1ba07e3..000000000 --- a/tests/Http/Controllers/WidgetControllerTest.php +++ /dev/null @@ -1,41 +0,0 @@ -widget = new PostsCount(); - - $this->widget->async(); - - $this->app->make('root')->routes(function ($router) { - $router->group( - ['prefix' => $this->resource->getKey().'/widgets', 'resource' => $this->resource->getKey()], - function ($router) { - $this->widget->registerRoutes($router); - } - ); - }); - } - - /** @test */ - public function a_widget_controller_has_index() - { - $this->app['request']->setRouteResolver(function () { - return $this->app['router']->getRoutes()->get('GET')['root/posts/widgets/posts-count']; - }); - - $this->actingAs($this->admin) - ->get('/root/posts/widgets/posts-count') - ->assertOk(); - } -} diff --git a/tests/ModelPolicy.php b/tests/ModelPolicy.php deleted file mode 100644 index 75f6708e4..000000000 --- a/tests/ModelPolicy.php +++ /dev/null @@ -1,93 +0,0 @@ -model = new FieldsetModel(); - } - - /** @test */ - public function a_fieldset_model_cannot_be_saved() - { - $this->assertFalse($this->model->save()); - } -} diff --git a/tests/Models/MediumTest.php b/tests/Models/MediumTest.php index 5a714068b..a2b4bc83c 100644 --- a/tests/Models/MediumTest.php +++ b/tests/Models/MediumTest.php @@ -2,100 +2,17 @@ namespace Cone\Root\Tests\Models; -use Cone\Root\Models\Medium; use Cone\Root\Tests\TestCase; class MediumTest extends TestCase { - protected $medium; - public function setUp(): void { parent::setUp(); - - $this->medium = Medium::factory()->create(); - } - - /** @test */ - public function a_medium_belongs_to_a_user() - { - $this->medium->user()->associate($this->admin)->save(); - - $this->assertTrue($this->medium->user->is($this->admin)); - } - - /** @test */ - public function a_medium_can_determine_if_image() - { - $this->medium->update(['mime_type' => 'image/jpg']); - $this->assertTrue($this->medium->isImage); - - $this->medium->update(['mime_type' => 'application/pdf']); - $this->assertFalse($this->medium->isImage); - } - - /** @test */ - public function a_medium_has_urls() - { - $this->assertEquals(['original'], array_keys($this->medium->urls)); - - $this->assertStringContainsString('-thumb', $this->medium->getUrl('thumb')); - } - - /** @test */ - public function a_medium_has_path() - { - $this->assertStringContainsString("{$this->medium->id}/{$this->medium->name}", $this->medium->getPath()); - $this->assertStringContainsString("{$this->medium->id}/{$this->medium->name}", $this->medium->getAbsolutePath()); - } - - /** @test */ - public function a_medium_has_search_query_scope() - { - $query = Medium::query()->search('test'); - - $this->assertSame( - 'select * from "root_media" where "root_media"."name" like ?', - $query->toSql() - ); - - $this->assertSame(['%test%'], $query->getBindings()); - - $this->assertSame( - 'select * from "root_media"', - Medium::query()->search()->toSql() - ); - } - - /** @test */ - public function a_medium_has_type_query_scope() - { - $query = Medium::query()->type('file'); - $this->assertSame( - 'select * from "root_media" where "root_media"."mime_type" not like ?', - $query->toSql() - ); - $this->assertSame(['image%'], $query->getBindings()); - - $query = Medium::query()->type('image'); - $this->assertSame( - 'select * from "root_media" where "root_media"."mime_type" like ?', - $query->toSql() - ); - $this->assertSame(['image%'], $query->getBindings()); - - $this->assertSame( - 'select * from "root_media"', - Medium::query()->type('test')->toSql() - ); } - /** @test */ - public function a_medium_has_sort_query_scope() + public function test_a_medium_belongs_to_user() { - $this->assertSame( - 'select * from "root_media" order by "root_media"."id" desc', - Medium::query()->sort()->toSql() - ); + $this->assertTrue(true); } } diff --git a/tests/Models/MetaTest.php b/tests/Models/MetaTest.php deleted file mode 100644 index fe096e088..000000000 --- a/tests/Models/MetaTest.php +++ /dev/null @@ -1,45 +0,0 @@ -model = new class(Medium::factory()->make()->toArray()) extends Medium - { - use HasMetaData; - }; - - $this->model->save(); - } - - /** @test */ - public function a_meta_belongs_to_a_metable() - { - $meta = Meta::factory()->make(); - - $meta->metable()->associate($this->model)->save(); - - $this->assertTrue($meta->metable->is($this->model)); - } - - /** @test */ - public function a_metable_model_has_meta_data() - { - $this->model->metaData()->save( - $meta = Meta::factory()->make() - ); - - $this->assertTrue($this->model->metaData->first()->is($meta)); - } -} diff --git a/tests/Models/NotificationTest.php b/tests/Models/NotificationTest.php deleted file mode 100644 index 238d4cb01..000000000 --- a/tests/Models/NotificationTest.php +++ /dev/null @@ -1,28 +0,0 @@ -notification = Notification::factory()->make(); - - $this->notification->notifiable()->associate($this->admin); - - $this->notification->save(); - } - - /** @test */ - public function a_notification_belongs_to_a_notifiable() - { - $this->assertTrue($this->notification->notifiable->is($this->admin)); - } -} diff --git a/tests/Models/RecordTest.php b/tests/Models/RecordTest.php deleted file mode 100644 index 47a782d28..000000000 --- a/tests/Models/RecordTest.php +++ /dev/null @@ -1,49 +0,0 @@ -record = $this->admin->records()->save( - Record::factory()->make() - ); - } - - /** @test */ - public function a_record_belongs_to_a_user() - { - $this->record->user()->associate($this->admin); - - $this->assertTrue($this->record->user->is($this->admin)); - } - - /** @test */ - public function a_record_belongs_to_a_target() - { - $medium = Medium::factory()->create(); - - $this->record->target()->associate($medium); - - $this->assertSame( - [Medium::class, $medium->id], - [$this->record->target_type, $this->record->target_id] - ); - } - - /** @test */ - public function a_record_has_resource_representation() - { - $this->assertInstanceOf(RecordResource::class, $this->record->toResource()); - } -} diff --git a/tests/Models/UserTest.php b/tests/Models/UserTest.php deleted file mode 100644 index 60df25a12..000000000 --- a/tests/Models/UserTest.php +++ /dev/null @@ -1,48 +0,0 @@ -admin->uploads()->save( - Medium::factory()->make() - ); - - $this->assertTrue($this->admin->uploads->pluck('id')->contains($medium->id)); - } - - /** @test */ - public function a_user_has_records() - { - $record = $this->admin->records()->save( - Record::factory()->make()->target()->associate($this->admin) - ); - - $this->assertTrue($this->admin->records->pluck('id')->contains($record->id)); - } - - /** @test */ - public function a_user_has_notifications() - { - $record = $this->admin->notifications()->save( - Notification::factory()->make() - ); - - $this->assertTrue($this->admin->notifications->pluck('id')->contains($record->id)); - } - - /** @test */ - public function a_user_has_resource_representation() - { - $this->assertInstanceOf(Resource::class, $this->admin->toResource()); - } -} diff --git a/tests/Pivot.php b/tests/Pivot.php deleted file mode 100644 index 44f37abc1..000000000 --- a/tests/Pivot.php +++ /dev/null @@ -1,18 +0,0 @@ -setAttribute($this->getKeyName(), 1); - } - - public function delete() - { - // - } -} diff --git a/tests/Post.php b/tests/Post.php deleted file mode 100644 index ae5eb9195..000000000 --- a/tests/Post.php +++ /dev/null @@ -1,80 +0,0 @@ -makePartial(); - - $builder->setQuery(parent::newQuery()->getQuery()); - - $builder->setModel($this); - - $builder->shouldReceive('get')->andReturn($this->results()); - $builder->shouldReceive('findMany')->andReturn($this->results()); - $builder->shouldReceive('paginate')->andReturn(new LengthAwarePaginator($this->results(), 2, 15, 1)); - - return $builder; - } - - public function author() - { - $builder = (new Author())->newQuery(); - - return new BelongsTo($builder, $this, 'foreignKey', 'id', 'author'); - } - - public function comments() - { - $builder = (new Comment())->newQuery(); - - return new HasMany($builder, $this, 'comments.post_id', 'id'); - } - - public function tags() - { - $builder = (new Tag())->newQuery(); - - $builder->shouldReceive('getModels')->andReturn($builder->get()->all()); - - return (new BelongsToMany($builder, $this, 'post_tag', 'tag_id', 'post_id', 'id', 'id', 'tags')) - ->using(Pivot::class); - } - - protected function results() - { - return collect([ - new static(['id' => 1, 'title' => 'Post One']), - new static(['id' => 2, 'title' => 'Post Two']), - ]); - } - - public function save(array $options = []) - { - $this->fireModelEvent('saving'); - - $this->setAttribute($this->getKeyName(), 1); - } - - public function delete() - { - // - } -} diff --git a/tests/Resources/ResourceTest.php b/tests/Resources/ResourceTest.php deleted file mode 100644 index 51335ba7a..000000000 --- a/tests/Resources/ResourceTest.php +++ /dev/null @@ -1,18 +0,0 @@ -assertSame('inventory-2', $this->resource->getIcon()); - - $this->resource->icon('fake-icon'); - - $this->assertSame('fake-icon', $this->resource->getIcon()); - } -} diff --git a/tests/Tag.php b/tests/Tag.php deleted file mode 100644 index 566d4bcef..000000000 --- a/tests/Tag.php +++ /dev/null @@ -1,56 +0,0 @@ -makePartial(); - - $builder->setQuery(parent::newQuery()->getQuery()); - - $builder->setModel($this); - - $builder->shouldReceive('get')->andReturn($this->results()); - $builder->shouldReceive('paginate')->andReturn(new LengthAwarePaginator($this->results(), 2, 15, 1)); - - return $builder; - } - - public function posts() - { - $builder = (new Post())->newQuery(); - - $builder->shouldReceive('getModels')->andReturn($builder->get()->all()); - - return (new BelongsToMany($builder, $this, 'post_tag', 'post_id', 'tag_id', 'id', 'id', 'posts')) - ->using(Pivot::class); - } - - protected function results() - { - return collect([ - new static(['id' => 1, 'name' => 'Tag One']), - new static(['id' => 2, 'name' => 'Tag Two']), - ]); - } - - public function save(array $options = []) - { - $this->setAttribute($this->getKeyName(), 1); - } - - public function delete() - { - // - } -} diff --git a/tests/TestCase.php b/tests/TestCase.php index 4a71eeea6..3aed3c0c5 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -2,36 +2,19 @@ namespace Cone\Root\Tests; -use Cone\Root\Fields\Text; -use Cone\Root\Models\User; -use Cone\Root\Resources\Resource; -use Cone\Root\Root; -use Cone\Root\Tests\Actions\PublishPosts; -use Cone\Root\Tests\Extracts\LongPosts; -use Cone\Root\Tests\Filters\Published; -use Cone\Root\Tests\Widgets\PostsCount; -use Illuminate\Foundation\Testing\RefreshDatabase; +use Illuminate\Foundation\Testing\LazilyRefreshDatabase; use Illuminate\Foundation\Testing\TestCase as BaseTestCase; -use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Storage; abstract class TestCase extends BaseTestCase { use CreatesApplication; - use RefreshDatabase; - - protected $admin; - - protected $request; - - protected $resource; + use LazilyRefreshDatabase; public function setUp(): void { parent::setUp(); - $this->setUpResource(); - $this->app['router']->getRoutes()->refreshNameLookups(); $this->withoutVite(); @@ -39,42 +22,6 @@ public function setUp(): void Storage::fake('local'); Storage::fake('public'); - Storage::disk('local')->makeDirectory('root-chunks'); - - $this->admin = User::factory()->create(); - - Gate::policy(Post::class, ModelPolicy::class); - Gate::policy(Author::class, ModelPolicy::class); - - $this->app['request']->setUserResolver(function () { - return $this->admin; - }); - } - - protected function setUpResource() - { - $this->resource = (new Resource(Post::class)) - ->with(['author']) - ->withFields([Text::make('Title')->sortable()->searchable()]) - ->withFilters([Published::make()]) - ->withActions([PublishPosts::make()]) - ->withExtracts([LongPosts::make()]) - ->withWidgets([PostsCount::make()]); - - $this->app->make(Root::class)->resources->register($this->resource); - $this->resource->boot($this->app->make(Root::class)); - } - - protected function beforeRefreshingDatabase() - { - $path = $this->app->databasePath('migrations'); - - foreach ($this->app['files']->files($path) as $file) { - if (str_contains($file->getFileName(), 'create_notifications_table')) { - return; - } - } - - $this->artisan('notifications:table'); + Storage::disk('local')->makeDirectory('root-uploads'); } } diff --git a/tests/Widgets/PostsCount.php b/tests/Widgets/PostsCount.php deleted file mode 100644 index e0eec759f..000000000 --- a/tests/Widgets/PostsCount.php +++ /dev/null @@ -1,10 +0,0 @@ -widget = new PostsCount(); - } - - /** @test */ - public function a_widget_has_key() - { - $this->assertSame('posts-count', $this->widget->getKey()); - } - - /** @test */ - public function a_widget_has_name() - { - $this->assertSame('Posts Count', $this->widget->getName()); - } - - /** @test */ - public function a_widget_has_component() - { - $this->assertSame('Widget', $this->widget->getComponent()); - } - - /** @test */ - public function a_widget_has_template() - { - $this->assertSame('root::widgets.welcome', $this->widget->getTemplate()); - } - - /** @test */ - public function a_widget_can_be_async() - { - $this->assertFalse($this->widget->isAsync()); - - $this->widget->async(); - - $this->assertTrue($this->widget->isAsync()); - } - - /** @test */ - public function a_widget_resolves_data() - { - $this->widget->with(['foo' => 'bar']); - - $this->assertSame(['foo' => 'bar'], $this->widget->resolveData($this->app['request'])); - } - - /** @test */ - public function a_widget_is_renderable() - { - $this->assertSame( - $this->app['view']->make($this->widget->getTemplate())->render(), - $this->widget->render() - ); - } - - /** @test */ - public function an_async_widget_registers_routes() - { - $this->widget->async(); - - $this->app['router']->prefix('posts/widgets')->group(function ($router) { - $this->widget->registerRoutes($router); - }); - - $this->assertSame('/posts/widgets/posts-count', $this->widget->getUri()); - - $this->assertArrayHasKey( - trim($this->widget->getUri(), '/'), - $this->app['router']->getRoutes()->get('GET') - ); - } -} diff --git a/vite.config.js b/vite.config.js index 49d832822..5785c1fa7 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,6 +1,5 @@ import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; -import vue from '@vitejs/plugin-vue'; export default defineConfig({ envDir: './../../../', @@ -20,17 +19,16 @@ export default defineConfig({ }, plugins: [ laravel({ - input: 'resources/js/app.js', + input: [ + 'resources/js/app.js', + 'resources/js/editor.js', + 'resources/js/media-manager.js', + 'resources/js/repeater.js', + 'resources/js/dropdown.js', + 'resources/sass/app.scss', + ], refresh: true, }), - vue({ - template: { - transformAssetUrls: { - base: null, - includeAbsolute: false, - }, - }, - }), ], resolve: { alias: [ diff --git a/yarn.lock b/yarn.lock index f956fed8d..2fcca7565 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,269 +2,26 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== +"@alpinejs/focus@^3.12.3": + version "3.12.3" + resolved "https://registry.yarnpkg.com/@alpinejs/focus/-/focus-3.12.3.tgz#0cfb7fd987d08ba744c6defe6cd72c61559ed7d0" + integrity sha512-kIQwvvUPCfCO2REpceQ3uHNdN3oqDLvvvQNaHVgHoYqk+RrL3EcR6uOHyvHJUgOhaIjN5Uc3b7BaRNrKZbDGew== dependencies: - "@babel/highlight" "^7.10.4" + focus-trap "^6.6.1" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": +"@babel/code-frame@^7.0.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" - integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== - -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.3.tgz#cf1c877284a469da5d1ce1d1e53665253fae712e" - integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.3" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.3" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.3" - "@babel/types" "^7.21.3" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.3.tgz#232359d0874b392df04045d72ce2fd9bb5045fce" - integrity sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA== - dependencies: - "@babel/types" "^7.21.3" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz#64f49ecb0020532f19b1d014b03bccaa1ab85fb9" - integrity sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz#53ff78472e5ce10a52664272a239787107603ebb" - integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.3.1" - -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== - dependencies: - "@babel/types" "^7.21.0" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": +"@babel/helper-validator-identifier@^7.18.6": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": +"@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== @@ -273,677 +30,6 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.20.7", "@babel/parser@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" - integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" - -"@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" - integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-block-scoping@^7.20.2": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-classes@^7.20.2": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" - -"@babel/plugin-transform-destructuring@^7.20.2": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-for-of@^7.18.8": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" - integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== - dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-modules-amd@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== - dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-modules-commonjs@^7.19.6", "@babel/plugin-transform-modules-commonjs@^7.2.0": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" - integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== - dependencies: - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" - -"@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== - dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" - -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" - -"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" - integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - regenerator-transform "^0.15.1" - -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-spread@^7.19.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/preset-env@^7.18.10": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime@^7.13.10", "@babel/runtime@^7.8.4": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.3.tgz#4747c5e7903d224be71f90788b06798331896f67" - integrity sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.3" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.3" - "@babel/types" "^7.21.3" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.3.tgz#4865a5357ce40f64e3400b0f3b737dc6d4f64d05" - integrity sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - "@csstools/selector-specificity@^2.0.2": version "2.2.0" resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" @@ -1059,286 +145,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.12.tgz#3a11d13e9a5b0c05db88991b234d8baba1f96487" integrity sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw== -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@inertiajs/core@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@inertiajs/core/-/core-1.0.2.tgz#93f7b8030591344a11417ac6ae690fe55a365eec" - integrity sha512-IJryvuNBcOIEZqKaA1vsX++hroovrLfb4jezym/W6NqxpsacoOkCLqWFneiScTaa5IiU0Wv0Li3lCuxK7DwTEQ== - dependencies: - axios "^1.2.0" - deepmerge "^4.0.0" - nprogress "^0.2.0" - qs "^6.9.0" - -"@inertiajs/vue3@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@inertiajs/vue3/-/vue3-1.0.2.tgz#d1c7a41308165c8f85ba328d1cb538a524ec9993" - integrity sha512-8LU6fd3BcmmxN7kHWgF06zKXnqZibi3+2UJ5Im1WsMXfqZO4jwaz5qFU2NjOBQEgcm5t+FNv1fbAESGEC8eezg== - dependencies: - "@inertiajs/core" "1.0.2" - lodash.clonedeep "^4.5.0" - lodash.isequal "^4.5.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" - integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^26.6.2" - jest-util "^26.6.2" - slash "^3.0.0" - -"@jest/core@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" - integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/reporters" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^26.6.2" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-resolve-dependencies "^26.6.3" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - jest-watcher "^26.6.2" - micromatch "^4.0.2" - p-each-series "^2.1.0" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== - dependencies: - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== - dependencies: - "@jest/types" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" - "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" - -"@jest/globals@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" - integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/types" "^26.6.2" - expect "^26.6.2" - -"@jest/reporters@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" - integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^26.6.2" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^7.0.0" - optionalDependencies: - node-notifier "^8.0.0" - -"@jest/source-map@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" - integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.4" - source-map "^0.6.0" - -"@jest/test-result@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" - integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== - dependencies: - "@jest/console" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== - dependencies: - "@jest/test-result" "^26.6.2" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - babel-plugin-istanbul "^6.0.0" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@linaria/core@3.0.0-beta.13": - version "3.0.0-beta.13" - resolved "https://registry.yarnpkg.com/@linaria/core/-/core-3.0.0-beta.13.tgz#049c5be5faa67e341e413a0f6b641d5d78d91056" - integrity sha512-3zEi5plBCOsEzUneRVuQb+2SAx3qaC1dj0FfFAI6zIJQoDWu0dlSwKijMRack7oO9tUWrchfj3OkKQAd1LBdVg== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1360,196 +166,163 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@popperjs/core@^2.9.0": - version "2.11.6" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" - integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== - -"@remirror/core-constants@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@remirror/core-constants/-/core-constants-2.0.0.tgz#a52f89059d93955e00810023cc76b4f7db9650bf" - integrity sha512-vpePPMecHJllBqCWXl6+FIcZqS+tRUM2kSCCKFeEo1H3XUEv3ocijBIPhnlSAa7g6maX+12ATTgxrOsLpWVr2g== - dependencies: - "@babel/runtime" "^7.13.10" +"@remirror/core-constants@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@remirror/core-constants/-/core-constants-2.0.2.tgz#f05eccdc69e3a65e7d524b52548f567904a11a1a" + integrity sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ== -"@remirror/core-helpers@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@remirror/core-helpers/-/core-helpers-2.0.1.tgz#6847666a009ada8c9b9f3a093c13a6d07a95d9bb" - integrity sha512-s8M1pn33aBUhduvD1QR02uUQMegnFkGaTr4c1iBzxTTyg0rbQstzuQ7Q8TkL6n64JtgCdJS9jLz2dONb2meBKQ== +"@remirror/core-helpers@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@remirror/core-helpers/-/core-helpers-3.0.0.tgz#3a35c2346bc23ebc3cee585b7840b5567755c5f1" + integrity sha512-tusEgQJIqg4qKj6HSBUFcyRnWnziw3neh4T9wOmsPGHFC3w9kl5KSrDb9UAgE8uX6y32FnS7vJ955mWOl3n50A== dependencies: - "@babel/runtime" "^7.13.10" - "@linaria/core" "3.0.0-beta.13" - "@remirror/core-constants" "^2.0.0" - "@remirror/types" "^1.0.0" + "@remirror/core-constants" "^2.0.2" + "@remirror/types" "^1.0.1" "@types/object.omit" "^3.0.0" - "@types/object.pick" "^1.3.1" + "@types/object.pick" "^1.3.2" "@types/throttle-debounce" "^2.1.0" - case-anything "^2.1.10" + case-anything "^2.1.13" dash-get "^1.0.2" - deepmerge "^4.2.2" + deepmerge "^4.3.1" fast-deep-equal "^3.1.3" make-error "^1.3.6" object.omit "^3.0.0" object.pick "^1.3.0" throttle-debounce "^3.0.1" -"@remirror/types@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@remirror/types/-/types-1.0.0.tgz#cc8764440089a2ada71f149c409739575b73b12e" - integrity sha512-7HQbW7k8VxrAtfzs9FxwO6XSDabn8tSFDi1wwzShOnU+cvaYpfxu0ygyTk3TpXsag1hgFKY3ZIlAfB4WVz2LkQ== +"@remirror/types@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@remirror/types/-/types-1.0.1.tgz#768502497a0fbbc23338a1586b893f729310cf70" + integrity sha512-VlZQxwGnt1jtQ18D6JqdIF+uFZo525WEqrfp9BOc3COPpK4+AWCgdnAWL+ho6imWcoINlGjR/+3b6y5C1vBVEA== dependencies: - type-fest "^2.0.0" + type-fest "^2.19.0" -"@sinonjs/commons@^1.7.0": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" - integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== - dependencies: - type-detect "4.0.8" +"@tiptap/core@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.4.tgz#0a2047150ae537e75f96841a603699526f7b4ec5" + integrity sha512-2YOMjRqoBGEP4YGgYpuPuBBJHMeqKOhLnS0WVwjVP84zOmMgZ7A8M6ILC9Xr7Q/qHZCvyBGWOSsI7+3HsEzzYQ== -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@tiptap/core@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.220.tgz#ced4b8f13ad6361f957275510bd0c005de29d18c" - integrity sha512-F2Q666xJqijBU5o+GqekqseNgIEMTs6BhsLDaf9DwThhljGLS8RXKnSvQxrxLNrYEPpw39n/G3Qt8YAOk5qR6w== - -"@tiptap/extension-blockquote@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.220.tgz#acce6a7d2fda829296e1e0b6386f618ea8ae328e" - integrity sha512-uE1VRU/doQzXsfsZ/JqsbSbXeZYTJnyQkSfHYA2ZYhbEM2XqDEsYkgcmZEJgunUZJpERf+3ZTfTpqaHq29iMMg== - -"@tiptap/extension-bold@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.220.tgz#f10468317fd5c63ebab68be907e33fb138a60ef9" - integrity sha512-KcEuKI85Drug/cCWbDy+HxhYrD+rLXHEBG10DmKPvgPpKHG/2wOau6LwUwyV4muWR8CR2mIO+mEc3yVBD8nNwQ== - -"@tiptap/extension-bubble-menu@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.220.tgz#3fea0c846f73a237f562fdce05671ef1fa025943" - integrity sha512-wthyec7s0vZlTSEAAZEgoFfx/1Arwg1zxDUrrE+YAost/Yn+w4xQksz/ts5Bx90iOk2qsJ+jzzttLRV17Ku7lA== - dependencies: - lodash "^4.17.21" - tippy.js "^6.3.7" - -"@tiptap/extension-bullet-list@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.220.tgz#ffc04992bbee53bc858aab6c082f17419a2236b7" - integrity sha512-QQ/0ZlYy6Hgb+UAc79V+fxvI+AaQf20cbKtBXaR8TIZ0x4FotSma89bKh+CIXMhFiBGXTcYBaYhl7OwACsKtxw== - -"@tiptap/extension-code-block@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.0.0-beta.220.tgz#8396b72f634d77d23b9ea01c9a253e8a7f471471" - integrity sha512-fgA7yTfHqhBtMJF7I9FPJ6UWuZPtxOQiN45Iv9LNmFIB6YRucdpmF+daZ27sElu0a+eICZyXwVn4w4iJphifuw== - -"@tiptap/extension-code@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.0.0-beta.220.tgz#3543afeda2b0b240682a36eeb401b00a3da56ab6" - integrity sha512-JKKDZoceagqVXeC1XF/gOkKhLtsbYJYV+MRDorLnQVz4tXcg/SMs5Ez7OM9MxSSior8fIbUFMNsj1/UNlG+tFw== - -"@tiptap/extension-document@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.0.0-beta.220.tgz#15b4db7a92659eff7efc6d4d877dcf72e3fd61b6" - integrity sha512-2sja4ZvOb4iynHrzinnclCSFgLyo6fJc1fBV5fIYaOgZOYcvz9KK8fgKiq+wIpG58sJEmQ5kcwwBlkXv+NTK+g== - -"@tiptap/extension-dropcursor@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.0-beta.220.tgz#b635fa6cdf9be1027579c7ab6c00e5a811b3b30b" - integrity sha512-BIaA4Lvb3xL9KFN+K6SO2IHqLO6hDmGN2/rGKHFaU3Eh+oiXM2G73KTSS5KIP1u872zY1RpAtswSc4kjv3cuVw== - -"@tiptap/extension-floating-menu@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.220.tgz#35eb154227533ada738c922be2f8cf18426fe4bf" - integrity sha512-+WfcBEedm82ntaVIEQAGz0Om96Rpav7a+4f7e8N4PrLKm6nZ3gBaEkZVQ6vjJ6S/1htiWCv1XosYIwRboPBG0w== - dependencies: - tippy.js "^6.3.7" - -"@tiptap/extension-gapcursor@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.220.tgz#07c96f7adc354d19b6209ea1e080188fb8d63de5" - integrity sha512-W5N2Ey+thufUOrs2TFGpEGBGue7ZEhcUXvxcsZlGbrjVa9Y+4rEp68Du4y7yM0hCeSj2GGwiV+uPzkc0CSDE/g== - -"@tiptap/extension-hard-break@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.220.tgz#8ff432615d9c9090c3d59c2a745c88e4f39ab1a3" - integrity sha512-oY3454o53YNFbuokzyGzG4PdMHkIYreY3nrALioZ0SwYeoFNcGA6Zcn4rDRfdp+QvbbiHfeBTR/CpWF13HZYTg== - -"@tiptap/extension-heading@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.220.tgz#b4889de7b3f152ff88a119d6cb6a22537eff73a2" - integrity sha512-7mrHRj++UaZ26C2Gjwb0WKWAzpiKb8TOYkVC2uMaCwaNhLDXpFEwZ7RtJRSTNBHkIGnMO46BH8Z0qlkFMmk9Jw== - -"@tiptap/extension-highlight@^2.0.0-beta.209": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-highlight/-/extension-highlight-2.0.0-beta.220.tgz#1bf2954524b99bb393dad46b5613b84aa660713f" - integrity sha512-+h4seFq99b0dCmShVlSc44PBQUiW4xBXze61V6ZNILLkfzo27wrj0W+I3WrdSXX9uz3wwE/BR+3T8m1Ro8lHng== - -"@tiptap/extension-history@^2.0.0-beta.209", "@tiptap/extension-history@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.0.0-beta.220.tgz#6370b28872b29288d655cd14211efb8dc76daba0" - integrity sha512-qNL2a9UhnlmCs4y2iQYrfeMB8vEX3bHozBJanHu0PWNQJcj90R5xqorBp/bRcqZdi0kuQfxcTnGHtLUpN/U0TA== - -"@tiptap/extension-horizontal-rule@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.220.tgz#4b8eaf081b38359235312308ebd59950705c7b10" - integrity sha512-XMIs4R+4BoH5LpIxey513mZuus0XLHqjVayqtf03enmjBTLWzkixvvWLPLw4a47FJL5Q8l4REFHxjNifRzOKkg== - -"@tiptap/extension-image@^2.0.0-beta.209": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.0.0-beta.220.tgz#c197b0dbd2f5d7a08f91e63cb8ca98c1972159a4" - integrity sha512-xyzlY/cupj/7AVqybQDaPaJ3SwKqe12xMWQlWxhhksuNpbQ6RGHrJz0DBSe61kIkaTZmIUBw055IFEMOPFF53g== - -"@tiptap/extension-italic@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.220.tgz#94e442689f69e694a2a983eabcae0ccc803262b9" - integrity sha512-aWAgqoR8fql9fJ7T/ZrEqovkEjZXbUpvlvWEvdBDMG3id8ZTGNDpdDKdvI6J/Rl5ZGPIg1TpHJtd+UixheWQsQ== - -"@tiptap/extension-link@^2.0.0-beta.209": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.0.0-beta.220.tgz#c9954613cd1e0a0f1527853b732ef50dff734eac" - integrity sha512-vjEA8cE37ZZVVgPHSpttw3kbJoClb+ya/BVukDtJ1h6C7mIR1rqzNxTgpbnXJuA8xww0JOjpa5dpzEgcs294fA== +"@tiptap/extension-blockquote@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.0.4.tgz#1e87f8f157573deec65b54d8a8b5568d79066a86" + integrity sha512-z5qfuLi04OgCBI6/odzB2vhulT/wpjymYOnON65vLXGZZbUw4cbPloykhqgWvQp+LzKH+HBhl4fz53d5CgnbOA== + +"@tiptap/extension-bold@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.4.tgz#debba8b0d957fe0b6943354834d8f1f0f8c0695c" + integrity sha512-CWSQy1uWkVsen8HUsqhm+oEIxJrCiCENABUbhaVcJL/MqhnP4Trrh1B6O00Yfoc0XToPRRibDaHMFs4A3MSO0g== + +"@tiptap/extension-bullet-list@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.4.tgz#d192767d39e45253c5e9d974e949f271e09c72d7" + integrity sha512-JSZKBVTaKSuLl5fR4EKE4dOINOrgeRHYA25Vj6cWjgdvpTw5ef7vcUdn9yP4JwTmLRI+VnnMlYL3rqigU3iZNg== + +"@tiptap/extension-code-block@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.0.4.tgz#d551ee7c13fef379bbbad298f1be757d1125cd54" + integrity sha512-In2tV3rgm/MznVF0N7qYsYugPWSzhZHaCRCWcFKNvllMExpo91bUWvk+hXaIhhPxvuqGIVezjybwrYuU3bJW0g== + +"@tiptap/extension-code@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.0.4.tgz#6952d402e7372dd2d129e962bf9bd54d68ee6183" + integrity sha512-HuwJSJkipZf4hkns9witv1CABNIPiB9C8lgAQXK4xJKcoUQChcnljEL+PQ2NqeEeMTEeV3nG3A/0QafH0pgTgg== + +"@tiptap/extension-document@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.0.4.tgz#f94e6da23a7d93a8ea34c6767d4e2e31f5ab8849" + integrity sha512-mCj2fAhnNhIHttPSqfTPSSTGwClGaPYvhT56Ij/Pi4iCrWjPXzC4XnIkIHSS34qS2tJN4XJzr/z7lm3NeLkF1w== + +"@tiptap/extension-dropcursor@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.4.tgz#f4a7542866c9100fee8e78eca5eebefff58989ca" + integrity sha512-1OmKBv/E+nJo2vsosvu8KwFiBB+gZM1pY61qc7JbwEKHSYAxUFHfvLkIA0IQ53Z0DHMrFSKgWmHEcbnqtGevCA== + +"@tiptap/extension-gapcursor@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.4.tgz#c100a792fd41535ad6382aa8133d0d9c0b2cb2b8" + integrity sha512-VxmKfBQjSSu1mNvHlydA4dJW/zawGKyqmnryiFNcUV9s+/HWLR5i9SiUl4wJM/B8sG8cQxClne5/LrCAeGNYuA== + +"@tiptap/extension-hard-break@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.4.tgz#a4f70fa9a473270f7ec89f20a14b9122af5657bc" + integrity sha512-4j8BZa6diuoRytWoIc7j25EYWWut5TZDLbb+OVURdkHnsF8B8zeNTo55W40CdwSaSyTtXtxbTIldV80ShQarGQ== + +"@tiptap/extension-heading@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.0.4.tgz#5372e346c5d69cfa0060d7238d1a0bf440442f6f" + integrity sha512-EfitUbew5ljH3xVlBXAxqqcJ4rjv15b8379LYOV6KQCf+Y1wY0gy9Q8wXSnrsAagqrvqipja4Ihn3OZeyIM+CA== + +"@tiptap/extension-highlight@^2.0.3": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-highlight/-/extension-highlight-2.0.4.tgz#5d54232ac573d0b04c3e705ca38f207fb6cf7270" + integrity sha512-z1hcpf0eHHdaBE0pewXiNIu+QBodw4IAbZykTXMaY1xCsbYWfOJxeIb5o+CEG5HBsmaoJrCYenQw71xzgV0hKA== + +"@tiptap/extension-history@^2.0.3", "@tiptap/extension-history@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.0.4.tgz#761a9c4b2a875817acc73137660552bd49e94fca" + integrity sha512-3GAUszn1xZx3vniHMiX9BSKmfvb5QOb0oSLXInN+hx80CgJDIHqIFuhx2dyV9I/HWpa0cTxaLWj64kfDzb1JVg== + +"@tiptap/extension-horizontal-rule@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.4.tgz#6988dd63fb00ca144feb1baac84142782e8ebe38" + integrity sha512-OMx2ImQseKbSUjPbbRCuYGOJshxYedh9giWAqwgWWokhYkH4nGxXn5m7+Laj+1wLre4bnWgHWVY4wMGniEj3aw== + +"@tiptap/extension-image@^2.0.3": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.0.4.tgz#a41d5ca246bd41dd293194e359a80cb97f477ab3" + integrity sha512-5iQ96pt9xppM8sWzwhGgc99PPoYPQuokTaCXAQKDI0Y1CFCjZ+/duUG3al1VUMpBXsjJw3/RVO1+7CEhRTd3mA== + +"@tiptap/extension-italic@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.0.4.tgz#4c6d0938542e4f7276f9dd18db395c040f76dcd8" + integrity sha512-C/6+qs4Jh8xERRP0wcOopA1+emK8MOkBE4RQx5NbPnT2iCpERP0GlmHBFQIjaYPctZgKFHxsCfRnneS5Xe76+A== + +"@tiptap/extension-link@^2.0.3": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.0.4.tgz#2899f9060ca722f11bd10ceb572ceb5178f111d6" + integrity sha512-CliImI1hmC+J6wHxqgz9P4wMjoNSSgm3fnNHsx5z0Bn6JRA4Evh2E3KZAdMaE8xCTx89rKxMYNbamZf4VLSoqQ== dependencies: linkifyjs "^4.1.0" -"@tiptap/extension-list-item@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.220.tgz#c2fcff1fb9148d303d78b0336032a6353a86ff6c" - integrity sha512-+O0ivwxPP2l/m9PAowb2ytDT/cM5kwu0s1W5MUsHPIqf+M6ahnl4ESjhWZfDHUzvjqPq6MTbqoQLHbB1KS/N7w== +"@tiptap/extension-list-item@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.0.4.tgz#8ca7c9959a07bf94602f8957d784d526568f2069" + integrity sha512-tSkbLgRo1QMNDJttWs9FeRywkuy5T2HdLKKfUcUNzT3s0q5AqIJl7VyimsBL4A6MUfN1qQMZCMHB4pM9Mkluww== -"@tiptap/extension-ordered-list@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.220.tgz#1fac8e8c2f8c0187e23ede59764fd031d5d1a83a" - integrity sha512-j3DmxJfwmNxFfMnvO7glmGlhYeZSIUnRrKnZu2KkpD6OcGJSh9y/yfnYwcuK80XbzEG/jKKIw0M2yRveOvyVwA== +"@tiptap/extension-ordered-list@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.4.tgz#e3e220e9c15114b07c952c32fa58e96601db6bd7" + integrity sha512-Kfg+8k9p4iJCUKP/yIa18LfUpl9trURSMP/HX3/yQTz9Ul1vDrjxeFjSE5uWNvupcXRAM24js+aYrCmV7zpU+Q== -"@tiptap/extension-paragraph@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.220.tgz#d552dfdeeab9856e9eb8f0a7cf850f37d7cced69" - integrity sha512-ZGCzNGFYV4wa3l1nXtDIaYp7O6f0DrGTSl3alKkDTQe3SOmzXS2HjgWl9yPw8VXpU9W5mMGhXd+nGn/jUk+f/A== +"@tiptap/extension-paragraph@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.0.4.tgz#9cffa3f8a980349ca068b1b3c12596bf5f3aef0f" + integrity sha512-nDxpopi9WigVqpfi8nU3B0fWYB14EMvKIkutNZo8wJvKGTZufNI8hw66wupIx/jZH1gFxEa5dHerw6aSYuWjgQ== -"@tiptap/extension-strike@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.220.tgz#2beb02d2d8807056ff3ea4ea74d9f6abba42bf78" - integrity sha512-cIM2ma6mzk08pijOn+KS3ZoHWaUVsVT+OF3m6xewjwJdC0ILg9nApEOhPFrhbeDcxcPmJMlgBl/xeUrEu1HQMg== +"@tiptap/extension-strike@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.0.4.tgz#13286dcf8780c55610ed65b24238b8395a5be824" + integrity sha512-Men7LK6N/Dh3/G4/z2Z9WkDHM2Gxx1XyxYix2ZMf5CnqY37SeDNUnGDqit65pdIN3Y/TQnOZTkKSBilSAtXfJA== "@tiptap/extension-text-align@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-text-align/-/extension-text-align-2.0.3.tgz#00a7ce067cb033aa54edb82e8c2a023c73d7ef3c" - integrity sha512-VlLgqncKdjMjVjbU60/ALYhFs0wUdjAyvjDXnH1OoM/HuzbILvufPMYz4DUieJIWVJOYUKHQgg4XwBWceAM2Tw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-text-align/-/extension-text-align-2.0.4.tgz#4afefd2fbf555b9e72114b088147c8e9d1b82273" + integrity sha512-ArIWhkTqbZFRQcj34Zb17rW1+JeYMAaZpf9LKNAB4CSsqYeF5JqVmrZvOSI7NtyFsEx4rHXMHb1iMKjdwm8fUw== + +"@tiptap/extension-text@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.0.4.tgz#318b0105491a5976d220871dccabe6c4d2cbeedd" + integrity sha512-i8/VFlVZh7TkAI49KKX5JmC0tM8RGwyg5zUpozxYbLdCOv07AkJt+E1fLJty9mqH4Y5HJMNnyNxsuZ9Ol/ySRA== -"@tiptap/extension-text@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.0.0-beta.220.tgz#3f51d4aac11c16d79cf8ca22502898b67f5bc2f5" - integrity sha512-3tnffc2YMjNyv7Lbad6fx9wYDE/Buz8vhx76M2AOSrjYbzmTJf7mLkgdlPM0VTy7FGZD5CGgHJAgYNt5HIqPkQ== +"@tiptap/extension-underline@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-underline/-/extension-underline-2.0.4.tgz#c1e5df75a4c9f2d9e691d48438ee0894f8bb01f1" + integrity sha512-Hvhy3iV5dWs0SFTww6sIzyQSSgVzcQuiozhDs11iP+gvFjK7ejg86KZ8wAVvyCi9K3bOMhohsw1Q2b8JSnIxcg== -"@tiptap/pm@^2.0.0-beta.220": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.0.0-beta.220.tgz#04e4c98e4d042ea8d67148ec6676f7078c6bac5a" - integrity sha512-O9mGcmwUpEr630HY9RylIyZJKnpXi3xWINWNiAEfRJ1br5j5pHRoVRJQ1HzU+6+Z+i/8qp3zRHGLTBqihaZETA== +"@tiptap/pm@^2.0.3": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.0.4.tgz#c3df31a29120e1e3334f8f063df23ccb1ace7851" + integrity sha512-DNgxntpEaiW7ciW0BTNTL0TFqAreZTrAROWakI4XaYRAyi5H9NfZW8jmwGwMBkoZ1KB3pfy+jT/Bisy4okEQGQ== dependencies: prosemirror-changeset "^2.2.0" prosemirror-collab "^1.3.0" @@ -1570,102 +343,30 @@ prosemirror-transform "^1.7.0" prosemirror-view "^1.28.2" -"@tiptap/starter-kit@^2.0.0-beta.207": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.220.tgz#fb866c6020349588a881af44bd9e416b769a6f88" - integrity sha512-3992NxY5sEp5xmLE/qv/yt1YkgpSpJiUlDRj02isJ0Xsxa4G6bNq+N+tN2rHB0Y8dtYVBSX2vV/DZYVX8O+Gpg== - dependencies: - "@tiptap/core" "^2.0.0-beta.220" - "@tiptap/extension-blockquote" "^2.0.0-beta.220" - "@tiptap/extension-bold" "^2.0.0-beta.220" - "@tiptap/extension-bullet-list" "^2.0.0-beta.220" - "@tiptap/extension-code" "^2.0.0-beta.220" - "@tiptap/extension-code-block" "^2.0.0-beta.220" - "@tiptap/extension-document" "^2.0.0-beta.220" - "@tiptap/extension-dropcursor" "^2.0.0-beta.220" - "@tiptap/extension-gapcursor" "^2.0.0-beta.220" - "@tiptap/extension-hard-break" "^2.0.0-beta.220" - "@tiptap/extension-heading" "^2.0.0-beta.220" - "@tiptap/extension-history" "^2.0.0-beta.220" - "@tiptap/extension-horizontal-rule" "^2.0.0-beta.220" - "@tiptap/extension-italic" "^2.0.0-beta.220" - "@tiptap/extension-list-item" "^2.0.0-beta.220" - "@tiptap/extension-ordered-list" "^2.0.0-beta.220" - "@tiptap/extension-paragraph" "^2.0.0-beta.220" - "@tiptap/extension-strike" "^2.0.0-beta.220" - "@tiptap/extension-text" "^2.0.0-beta.220" - -"@tiptap/vue-3@^2.0.0-beta.96": - version "2.0.0-beta.220" - resolved "https://registry.yarnpkg.com/@tiptap/vue-3/-/vue-3-2.0.0-beta.220.tgz#69f772f6b58734dc3dec09ac3793fa3a895336b9" - integrity sha512-rhSKUECLE6NOjTYZHheXAGpyIqruhxkU/9YfWNLWNFIHHW9wHO+t/B3XMJAWBwgkUvRRepU5JmBBIfYd8RgqTA== - dependencies: - "@tiptap/extension-bubble-menu" "^2.0.0-beta.220" - "@tiptap/extension-floating-menu" "^2.0.0-beta.220" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" - integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" - integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== - dependencies: - "@babel/types" "^7.3.0" - -"@types/graceful-fs@^4.1.2": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": +"@tiptap/starter-kit@^2.0.3": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" + resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.0.4.tgz#20456eb4a4ae0ac8d5bf2ac5e9771b3c617c51a6" + integrity sha512-9WtVXhujyp5cOlE7qlcQMFr0FEx3Cvo1isvfQGzhKKPzXa3rR7FT8bnOFsten31/Ia/uwvGXAvRDQy24YfHdNA== + dependencies: + "@tiptap/core" "^2.0.4" + "@tiptap/extension-blockquote" "^2.0.4" + "@tiptap/extension-bold" "^2.0.4" + "@tiptap/extension-bullet-list" "^2.0.4" + "@tiptap/extension-code" "^2.0.4" + "@tiptap/extension-code-block" "^2.0.4" + "@tiptap/extension-document" "^2.0.4" + "@tiptap/extension-dropcursor" "^2.0.4" + "@tiptap/extension-gapcursor" "^2.0.4" + "@tiptap/extension-hard-break" "^2.0.4" + "@tiptap/extension-heading" "^2.0.4" + "@tiptap/extension-history" "^2.0.4" + "@tiptap/extension-horizontal-rule" "^2.0.4" + "@tiptap/extension-italic" "^2.0.4" + "@tiptap/extension-list-item" "^2.0.4" + "@tiptap/extension-ordered-list" "^2.0.4" + "@tiptap/extension-paragraph" "^2.0.4" + "@tiptap/extension-strike" "^2.0.4" + "@tiptap/extension-text" "^2.0.4" "@types/json-schema@^7.0.5": version "7.0.11" @@ -1677,11 +378,6 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== -"@types/node@*": - version "18.15.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.5.tgz#3af577099a99c61479149b716183e70b5239324a" - integrity sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew== - "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" @@ -1692,7 +388,7 @@ resolved "https://registry.yarnpkg.com/@types/object.omit/-/object.omit-3.0.0.tgz#0d31e1208eac8fe2ad5c9499a1016a8273bbfafc" integrity sha512-I27IoPpH250TUzc9FzXd0P1BV/BMJuzqD3jOz98ehf9dQqGkxlq+hO1bIqZGWqCg5bVOy0g4AUVJtnxe0klDmw== -"@types/object.pick@^1.3.1": +"@types/object.pick@^1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/object.pick/-/object.pick-1.3.2.tgz#9eb28118240ad8f658b9c9c6caf35359fdb37150" integrity sha512-sn7L+qQ6RLPdXRoiaE7bZ/Ek+o4uICma/lBFPyJEKDTPTBP1W8u0c4baj3EiS4DiqLs+Hk+KUGvMVJtAw3ePJg== @@ -1702,185 +398,32 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/prettier@^2.0.0": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/strip-bom@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" - integrity sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ== - -"@types/strip-json-comments@0.0.30": - version "0.0.30" - resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" - integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== - "@types/throttle-debounce@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz#1c3df624bfc4b62f992d3012b84c56d41eab3776" integrity sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ== -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^15.0.0": - version "15.0.15" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" - integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== - dependencies: - "@types/yargs-parser" "*" - -"@vitejs/plugin-vue@^4.0.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.1.0.tgz#b6a9d83cd91575f7ee15593f6444397f68751073" - integrity sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ== - -"@vue/compiler-core@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz#3e07c684d74897ac9aa5922c520741f3029267f8" - integrity sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig== - dependencies: - "@babel/parser" "^7.16.4" - "@vue/shared" "3.2.47" - estree-walker "^2.0.2" - source-map "^0.6.1" - -"@vue/compiler-dom@3.2.47", "@vue/compiler-dom@^3.0.1": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305" - integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ== - dependencies: - "@vue/compiler-core" "3.2.47" - "@vue/shared" "3.2.47" - -"@vue/compiler-sfc@3.2.47", "@vue/compiler-sfc@^3.0.5": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d" - integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ== - dependencies: - "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.47" - "@vue/compiler-dom" "3.2.47" - "@vue/compiler-ssr" "3.2.47" - "@vue/reactivity-transform" "3.2.47" - "@vue/shared" "3.2.47" - estree-walker "^2.0.2" - magic-string "^0.25.7" - postcss "^8.1.10" - source-map "^0.6.1" - -"@vue/compiler-ssr@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee" - integrity sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw== - dependencies: - "@vue/compiler-dom" "3.2.47" - "@vue/shared" "3.2.47" - -"@vue/reactivity-transform@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz#e45df4d06370f8abf29081a16afd25cffba6d84e" - integrity sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA== - dependencies: - "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.47" - "@vue/shared" "3.2.47" - estree-walker "^2.0.2" - magic-string "^0.25.7" - -"@vue/reactivity@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6" - integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ== - dependencies: - "@vue/shared" "3.2.47" - -"@vue/runtime-core@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.47.tgz#406ebade3d5551c00fc6409bbc1eeb10f32e121d" - integrity sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA== - dependencies: - "@vue/reactivity" "3.2.47" - "@vue/shared" "3.2.47" - -"@vue/runtime-dom@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz#93e760eeaeab84dedfb7c3eaf3ed58d776299382" - integrity sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA== - dependencies: - "@vue/runtime-core" "3.2.47" - "@vue/shared" "3.2.47" - csstype "^2.6.8" - -"@vue/server-renderer@3.2.47", "@vue/server-renderer@^3.0.1": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz#8aa1d1871fc4eb5a7851aa7f741f8f700e6de3c0" - integrity sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA== - dependencies: - "@vue/compiler-ssr" "3.2.47" - "@vue/shared" "3.2.47" - -"@vue/shared@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c" - integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ== - -"@vue/test-utils@^2.0.0-rc.1": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.3.2.tgz#b47ce6d7be7bf9700e0bb4322410e4cd8724d277" - integrity sha512-hJnVaYhbrIm0yBS0+e1Y0Sj85cMyAi+PAbK4JHqMRUZ6S622Goa+G7QzkRSyvCteG8wop7tipuEbHoZo26wsSA== - dependencies: - js-beautify "1.14.6" - optionalDependencies: - "@vue/compiler-dom" "^3.0.1" - "@vue/server-renderer" "^3.0.1" - -abab@^2.0.3, abab@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -abbrev@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== +"@vue/reactivity@~3.1.1": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.1.5.tgz#dbec4d9557f7c8f25c2635db1e23a78a729eb991" + integrity sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg== dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + "@vue/shared" "3.1.5" -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +"@vue/shared@3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.1.5.tgz#74ee3aad995d0a3996a6bb9533d4d280514ede03" + integrity sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA== -acorn@^7.1.1, acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +"@yr/monotone-cubic-spline@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz#7272d89f8e4f6fb7a1600c28c378cc18d3b577b9" + integrity sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA== -acorn@^8.2.4: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.10.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== adjust-sourcemap-loader@3.0.0: version "3.0.0" @@ -1890,19 +433,12 @@ adjust-sourcemap-loader@3.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.10.0, ajv@^6.12.4: +ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1922,19 +458,14 @@ ajv@^8.0.1: require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== +alpinejs@^3.12.3: + version "3.12.3" + resolved "https://registry.yarnpkg.com/alpinejs/-/alpinejs-3.12.3.tgz#d7f311b39318c5144e99205ab69557c0d90a552a" + integrity sha512-fLz2dfYQ3xCk7Ip8LiIpV2W+9brUyex2TAE7Z0BCvZdUDklJE+n+a8gCgLWzfZ0GzZNZu7HUP8Z0z6Xbm6fsSA== dependencies: - type-fest "^0.21.3" + "@vue/reactivity" "~3.1.1" -ansi-regex@^5.0.0, ansi-regex@^5.0.1: +ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -1946,22 +477,14 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -1969,12 +492,18 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== +apexcharts@^3.42.0: + version "3.42.0" + resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-3.42.0.tgz#143eb4a12d93c59a37dd88efcf0c7ed0d9ab8735" + integrity sha512-hYhzZqh2Efny9uiutkGU2M/EarJ4Nn8s6dxZ0C7E7N+SV4d1xjTioXi2NLn4UKVJabZkb3HnpXDoumXgtAymwg== dependencies: - sprintf-js "~1.0.2" + "@yr/monotone-cubic-spline" "^1.0.3" + svg.draggable.js "^2.2.2" + svg.easing.js "^2.0.0" + svg.filter.js "^2.0.2" + svg.pathmorphing.js "^0.1.3" + svg.resize.js "^1.4.3" + svg.select.js "^3.0.1" argparse@^2.0.1: version "2.0.1" @@ -1986,41 +515,16 @@ arity-n@^1.0.4: resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" integrity sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ== -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" @@ -2036,99 +540,14 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -axios@^1.2.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" - integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -babel-jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" - integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== - dependencies: - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.6.2" - chalk "^4.0.0" - graceful-fs "^4.2.4" - slash "^3.0.0" - -babel-plugin-istanbul@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" - integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" - -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +axios@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" + integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" - integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== - dependencies: - babel-plugin-jest-hoist "^26.6.2" - babel-preset-current-node-syntax "^1.0.0" + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" balanced-match@^1.0.0: version "1.0.2" @@ -2140,19 +559,6 @@ balanced-match@^2.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -2171,29 +577,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -2201,56 +584,6 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.21.3, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -2265,34 +598,17 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@5.3.1, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001449: - version "1.0.30001469" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001469.tgz#3dd505430c8522fdc9f94b4a19518e330f5c945a" - integrity sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -case-anything@^2.1.10: - version "2.1.10" - resolved "https://registry.yarnpkg.com/case-anything/-/case-anything-2.1.10.tgz#d18a6ca968d54ec3421df71e3e190f3bced23410" - integrity sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ== +case-anything@^2.1.13: + version "2.1.13" + resolved "https://registry.yarnpkg.com/case-anything/-/case-anything-2.1.13.tgz#0cdc16278cb29a7fcdeb072400da3f342ba329e9" + integrity sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng== -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2301,19 +617,6 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - "chokidar@>=3.0.0 <4.0.0": version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -2329,35 +632,6 @@ char-regex@^1.0.2: optionalDependencies: fsevents "~2.3.2" -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cjs-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" - integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -2367,24 +641,6 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2421,16 +677,6 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^2.19.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - compose-function@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" @@ -2443,14 +689,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -config-chain@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - convert-source-map@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" @@ -2463,23 +701,6 @@ convert-source-map@^0.3.3: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" integrity sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg== -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - -core-js-compat@^3.25.1: - version "3.29.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.29.1.tgz#15c0fb812ea27c973c18d425099afa50b934b41b" - integrity sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA== - dependencies: - browserslist "^4.21.5" - cosmiconfig@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" @@ -2492,36 +713,16 @@ cosmiconfig@^7.1.0: yaml "^1.10.0" crelt@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94" - integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA== - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" + version "1.0.6" + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" + integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== css-functions-list@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.1.0.tgz#cf5b09f835ad91a00e5959bcfc627cd498e1321b" integrity sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w== -css@^2.0.0, css@^2.1.0: +css@^2.0.0: version "2.2.4" resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== @@ -2536,28 +737,6 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@^2.6.8: - version "2.6.21" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" - integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== - d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" @@ -2571,29 +750,13 @@ dash-get@^1.0.2: resolved "https://registry.yarnpkg.com/dash-get/-/dash-get-1.0.2.tgz#4c9e9ad5ef04c4bf9d3c9a451f6f7997298dcc7c" integrity sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ== -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: +debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -2607,63 +770,21 @@ decamelize@^1.1.0, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decimal.js@^10.2.1: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - decode-uri-component@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.0.0, deepmerge@^4.2.2: +deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" - integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -2671,40 +792,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -editorconfig@^0.15.3: - version "0.15.3" - resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" - integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== - dependencies: - commander "^2.19.0" - lru-cache "^4.1.5" - semver "^5.6.0" - sigmund "^1.0.1" - -electron-to-chromium@^1.4.284: - version "1.4.335" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.335.tgz#69c08baa608bbb58e290d83320190fa82c835efe" - integrity sha512-l/eowQqTnrq3gu+WSrdfkhfNHnPgYqlKAwxz7MTOj6mom19vpEDHNXl6dxDxyTiYuhemydprKr/HCrHfgk+OfQ== - -emittery@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" - integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -2715,20 +802,6 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - entities@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" @@ -2795,239 +868,16 @@ esbuild@^0.17.5: "@esbuild/win32-ia32" "0.17.12" "@esbuild/win32-x64" "0.17.12" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-plugin-vue@^7.6.0: - version "7.20.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz#98c21885a6bfdf0713c3a92957a5afeaaeed9253" - integrity sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw== - dependencies: - eslint-utils "^2.1.0" - natural-compare "^1.4.0" - semver "^6.3.0" - vue-eslint-parser "^7.10.0" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint@^7.20.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" - integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== - dependencies: - "@jest/types" "^26.6.2" - ansi-styles "^4.0.0" - jest-get-type "^26.3.0" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - ext@^1.1.2: version "1.7.0" resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" @@ -3035,42 +885,6 @@ ext@^1.1.2: dependencies: type "^2.7.2" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extract-from-css@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/extract-from-css/-/extract-from-css-0.4.4.tgz#1ea7df2e7c7c6eb9922fa08e8adaea486f6f8f92" - integrity sha512-41qWGBdtKp9U7sgBxAQ7vonYqSXzgW/SiAYzq4tdWSVhAShvpVCH1nyvPQgjse6EdgbW7Y7ERdT3674/lKr65A== - dependencies: - css "^2.1.0" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -3092,11 +906,6 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - fastest-levenshtein@^1.0.16: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -3109,13 +918,6 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -3123,16 +925,6 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -3140,7 +932,7 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -3161,25 +953,18 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +focus-trap@^6.6.1: + version "6.9.4" + resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-6.9.4.tgz#436da1a1d935c48b97da63cd8f361c6f3aa16444" + integrity sha512-v2NTsZe2FF59Y+sDykKY+XjqZ0cPfhq/hikWVL88BqLivnNiEffAsac6rP6H45ff9wG9LL5ToiDqrLEP9GX9mw== + dependencies: + tabbable "^5.3.3" + follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -3189,19 +974,12 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.1.2, fsevents@~2.3.2: +fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -3211,54 +989,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -3266,7 +996,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -3278,17 +1008,6 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.3: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -3305,18 +1024,6 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.6.0, globals@^13.9.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -3334,16 +1041,6 @@ globjoin@^0.1.4: resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== -graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== - hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" @@ -3359,42 +1056,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -3402,11 +1063,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hash-sum@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" - integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -3419,57 +1075,11 @@ hosted-git-info@^4.0.1: dependencies: lru-cache "^6.0.0" -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - html-tags@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - ignore@^5.2.0, ignore@^5.2.1: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -3480,7 +1090,7 @@ immutable@^4.0.0: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -3493,14 +1103,6 @@ import-lazy@^4.0.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -3524,25 +1126,11 @@ inherits@2, inherits@^2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.4, ini@^1.3.5: +ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -3555,18 +1143,6 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - is-core-module@^2.5.0, is-core-module@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" @@ -3574,49 +1150,7 @@ is-core-module@^2.5.0, is-core-module@^2.9.0: dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.0, is-extendable@^1.0.1: +is-extendable@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== @@ -3633,25 +1167,13 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -3662,7 +1184,7 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -3674,551 +1196,21 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" - integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== - dependencies: - "@jest/types" "^26.6.2" - execa "^4.0.0" - throat "^5.0.0" - -jest-cli@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" - integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== - dependencies: - "@jest/core" "^26.6.3" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.6.3" - jest-util "^26.6.2" - jest-validate "^26.6.2" - prompts "^2.0.1" - yargs "^15.4.1" - -jest-config@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" - integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.6.3" - "@jest/types" "^26.6.2" - babel-jest "^26.6.3" - chalk "^4.0.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.4" - jest-environment-jsdom "^26.6.2" - jest-environment-node "^26.6.2" - jest-get-type "^26.3.0" - jest-jasmine2 "^26.6.3" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - micromatch "^4.0.2" - pretty-format "^26.6.2" - -jest-diff@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" - integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== - dependencies: - chalk "^4.0.0" - diff-sequences "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== - dependencies: - detect-newline "^3.0.0" - -jest-each@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" - integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== - dependencies: - "@jest/types" "^26.6.2" - chalk "^4.0.0" - jest-get-type "^26.3.0" - jest-util "^26.6.2" - pretty-format "^26.6.2" - -jest-environment-jsdom@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" - integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - jsdom "^16.4.0" - -jest-environment-node@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== - -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== - dependencies: - "@jest/types" "^26.6.2" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.1.2" - -jest-jasmine2@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" - integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^26.6.2" - is-generator-fn "^2.0.0" - jest-each "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - pretty-format "^26.6.2" - throat "^5.0.0" - -jest-leak-detector@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" - integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== - dependencies: - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-matcher-utils@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" - integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== - dependencies: - chalk "^4.0.0" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" - slash "^3.0.0" - stack-utils "^2.0.2" - -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== - -jest-resolve-dependencies@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" - integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== - dependencies: - "@jest/types" "^26.6.2" - jest-regex-util "^26.0.0" - jest-snapshot "^26.6.2" - -jest-resolve@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" - integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== - dependencies: - "@jest/types" "^26.6.2" - chalk "^4.0.0" - graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.2" - jest-util "^26.6.2" - read-pkg-up "^7.0.1" - resolve "^1.18.1" - slash "^3.0.0" - -jest-runner@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" - integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.7.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-docblock "^26.0.0" - jest-haste-map "^26.6.2" - jest-leak-detector "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - jest-runtime "^26.6.3" - jest-util "^26.6.2" - jest-worker "^26.6.2" - source-map-support "^0.5.6" - throat "^5.0.0" - -jest-runtime@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" - integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/globals" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - cjs-module-lexer "^0.6.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - slash "^3.0.0" - strip-bom "^4.0.0" - yargs "^15.4.1" - -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" - -jest-snapshot@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" - integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.0.0" - chalk "^4.0.0" - expect "^26.6.2" - graceful-fs "^4.2.4" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - jest-haste-map "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - natural-compare "^1.4.0" - pretty-format "^26.6.2" - semver "^7.3.2" - -jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" - -jest-validate@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== - dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" - chalk "^4.0.0" - jest-get-type "^26.3.0" - leven "^3.1.0" - pretty-format "^26.6.2" - -jest-watcher@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" - integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== - dependencies: - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^26.6.2" - string-length "^4.0.1" - -jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" - integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== - dependencies: - "@jest/core" "^26.6.3" - import-local "^3.0.2" - jest-cli "^26.6.3" - -js-beautify@1.14.6: - version "1.14.6" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.6.tgz#b23ca5d74a462c282c7711bb51150bcc97f2b507" - integrity sha512-GfofQY5zDp+cuHc+gsEXKPpNw2KbPddreEo35O6jT6i0RVK6LhsoYBhq5TvK4/n74wnA0QbK8gGd+jUZwTMKJw== - dependencies: - config-chain "^1.1.13" - editorconfig "^0.15.3" - glob "^8.0.3" - nopt "^6.0.0" - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsdom@^16.4.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -4234,11 +1226,6 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - json5@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -4246,74 +1233,29 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.2: +json5@^2.1.2: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - known-css-properties@^0.26.0: version "0.26.0" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.26.0.tgz#008295115abddc045a9f4ed7e2a84dc8b3a77649" integrity sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg== -laravel-vite-plugin@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/laravel-vite-plugin/-/laravel-vite-plugin-0.7.4.tgz#563afc730191c134fa28c44311e26c9fb9ad68b0" - integrity sha512-NlIuXbeuI+4NZzRpWNpGHRVTwuFWessvD7QoD+o2MlyAi7qyUS4J8r4/yTlu1dl9lxcR7iKoYUmHQqZDcrw2KA== +laravel-vite-plugin@^0.7.8: + version "0.7.8" + resolved "https://registry.yarnpkg.com/laravel-vite-plugin/-/laravel-vite-plugin-0.7.8.tgz#0fd0c577389ed5f4c5bb61cfbd9da5d18c9b58dc" + integrity sha512-HWYqpQYHR3kEQ1LsHX7gHJoNNf0bz5z5mDaHBLzS+PGLCTmYqlU5/SZyeEgObV7z7bC/cnStYcY9H1DI1D5Udg== dependencies: picocolors "^1.0.0" vite-plugin-full-reload "^1.0.5" -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -4327,9 +1269,9 @@ linkify-it@^4.0.1: uc.micro "^1.0.1" linkifyjs@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-4.1.0.tgz#0460bfcc37d3348fa80e078d92e7bbc82588db15" - integrity sha512-Ffv8VoY3+ixI1b3aZ3O+jM6x17cOsgwfB1Wq7pkytbo1WlyRp6ZO0YDMqiWT/gQPY/CmtiGuKfzDIVqxh1aCTA== + version "4.1.1" + resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-4.1.1.tgz#73d427e3bbaaf4ca8e71c589ad4ffda11a9a5fde" + integrity sha512-zFN/CTVmbcVef+WaDXT63dNzzkfRBKT1j464NJQkV7iSgJU0sLBus9W0HBwnXK13/hf168pbrx/V/bjEHOXNHA== loader-utils@^1.2.3: version "1.4.2" @@ -4356,51 +1298,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.21, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -4408,37 +1310,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -magic-string@^0.25.7: - version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - make-error@^1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -4449,13 +1325,6 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - markdown-it@^13.0.1: version "13.0.1" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" @@ -4495,36 +1364,12 @@ meow@^9.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: +micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -4544,30 +1389,18 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -4577,24 +1410,11 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.2.0: +minimist@^1.2.0: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -4605,28 +1425,6 @@ nanoid@^3.3.4: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - neo-async@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -4637,40 +1435,6 @@ next-tick@^1.1.0: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-notifier@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" - integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.2" - shellwords "^0.1.1" - uuid "^8.3.0" - which "^2.0.2" - -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== - -nopt@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" - integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== - dependencies: - abbrev "^1.0.0" - normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -4691,63 +1455,11 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nprogress@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" - integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== - -nwsapi@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - object.omit@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-3.0.0.tgz#0e3edc2fce2ba54df5577ff529f6d97bd8a522af" @@ -4762,58 +1474,17 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - orderedmap@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.0.tgz#819457082fa3a06abd316d83a281a1ca467437cd" - integrity sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA== - -p-each-series@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" - integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + version "2.1.1" + resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2" + integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== p-limit@^2.2.0: version "2.3.0" @@ -4851,16 +1522,6 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -4871,16 +1532,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -4901,23 +1552,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pirates@^4.0.1: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - postcss-media-query-parser@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" @@ -4933,6 +1567,11 @@ postcss-safe-parser@^6.0.0: resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== +postcss-scss@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.6.tgz#5d62a574b950a6ae12f2aa89b60d63d9e4432bfd" + integrity sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ== + postcss-selector-parser@^6.0.11: version "6.0.11" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" @@ -4955,7 +1594,7 @@ postcss@7.0.36: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^8.1.10, postcss@^8.2.4, postcss@^8.4.19, postcss@^8.4.21: +postcss@^8.2.4, postcss@^8.4.19, postcss@^8.4.21: version "8.4.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== @@ -4964,75 +1603,42 @@ postcss@^8.1.10, postcss@^8.2.4, postcss@^8.4.19, postcss@^8.4.21: picocolors "^1.0.0" source-map-js "^1.0.2" -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== - dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - prosemirror-changeset@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/prosemirror-changeset/-/prosemirror-changeset-2.2.0.tgz#22c05da271a118be40d3e339fa2cace789b1254b" - integrity sha512-QM7ohGtkpVpwVGmFb8wqVhaz9+6IUXcIQBGZ81YNAKYuHiFJ1ShvSzab4pKqTinJhwciZbrtBEk/2WsqSt2PYg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz#dae94b63aec618fac7bb9061648e6e2a79988383" + integrity sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ== dependencies: prosemirror-transform "^1.0.0" prosemirror-collab@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/prosemirror-collab/-/prosemirror-collab-1.3.0.tgz#601d33473bf72e6c43041a54b860c84c60b37769" - integrity sha512-+S/IJ69G2cUu2IM5b3PBekuxs94HO1CxJIWOFrLQXUaUDKL/JfBx+QcH31ldBlBXyDEUl+k3Vltfi1E1MKp2mA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz#0e8c91e76e009b53457eb3b3051fb68dad029a33" + integrity sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ== dependencies: prosemirror-state "^1.0.0" -prosemirror-commands@^1.0.0, prosemirror-commands@^1.3.1, prosemirror-commands@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.5.1.tgz#89ddfa14e144dcc7fb0938aa0e2568c7fdde306f" - integrity sha512-ga1ga/RkbzxfAvb6iEXYmrEpekn5NCwTb8w1dr/gmhSoaGcQ0VPuCzOn5qDEpC45ql2oDkKoKQbRxLJwKLpMTQ== +prosemirror-commands@^1.0.0, prosemirror-commands@^1.1.4, prosemirror-commands@^1.3.1, prosemirror-commands@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz#e94aeea52286f658cd984270de9b4c3fff580852" + integrity sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ== dependencies: prosemirror-model "^1.0.0" prosemirror-state "^1.0.0" prosemirror-transform "^1.0.0" -prosemirror-dropcursor@^1.5.0, prosemirror-dropcursor@^1.6.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.7.1.tgz#b6921ef866ca95b6f6c8b197767f60dc39598416" - integrity sha512-GmWk9bAwhfHwA8xmJhBFjPcebxUG9zAPYtqpIr7NTDigWZZEJCgUYyUQeqgyscLr8ZHoh9aeprX9kW7BihUT+w== +prosemirror-dropcursor@^1.3.2, prosemirror-dropcursor@^1.5.0, prosemirror-dropcursor@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz#49b9fb2f583e0d0f4021ff87db825faa2be2832d" + integrity sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw== dependencies: prosemirror-state "^1.0.0" prosemirror-transform "^1.1.0" prosemirror-view "^1.1.0" -prosemirror-gapcursor@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.1.tgz#8cfd874592e4504d63720e14ed680c7866e64554" - integrity sha512-GKTeE7ZoMsx5uVfc51/ouwMFPq0o8YrZ7Hx4jTF4EeGbXxBveUV8CGv46mSHuBBeXGmvu50guoV2kSnOeZZnUA== +prosemirror-gapcursor@^1.1.5, prosemirror-gapcursor@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz#5fa336b83789c6199a7341c9493587e249215cb4" + integrity sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ== dependencies: prosemirror-keymap "^1.0.0" prosemirror-model "^1.0.0" @@ -5040,84 +1646,85 @@ prosemirror-gapcursor@^1.3.1: prosemirror-view "^1.0.0" prosemirror-history@^1.0.0, prosemirror-history@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.3.0.tgz#bf5a1ff7759aca759ddf0c722c2fa5b14fb0ddc1" - integrity sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA== + version "1.3.2" + resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.3.2.tgz#ce6ad7ab9db83e761aee716f3040d74738311b15" + integrity sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g== dependencies: prosemirror-state "^1.2.2" prosemirror-transform "^1.0.0" + prosemirror-view "^1.31.0" rope-sequence "^1.3.0" -prosemirror-inputrules@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.2.0.tgz#476dde2dc244050b3aca00cf58a82adfad6749e7" - integrity sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ== +prosemirror-inputrules@^1.1.2, prosemirror-inputrules@^1.1.3, prosemirror-inputrules@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.2.1.tgz#8faf3d78c16150aedac71d326a3e3947417ce557" + integrity sha512-3LrWJX1+ULRh5SZvbIQlwZafOXqp1XuV21MGBu/i5xsztd+9VD15x6OtN6mdqSFI7/8Y77gYUbQ6vwwJ4mr6QQ== dependencies: prosemirror-state "^1.0.0" prosemirror-transform "^1.0.0" -prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.1.tgz#3839e7db66cecddae7451f4246e73bdd8489be1d" - integrity sha512-kVK6WGC+83LZwuSJnuCb9PsADQnFZllt94qPP3Rx/vLcOUV65+IbBeH2nS5cFggPyEVJhGkGrgYFRrG250WhHQ== +prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.1.4, prosemirror-keymap@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz#14a54763a29c7b2704f561088ccf3384d14eb77e" + integrity sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ== dependencies: prosemirror-state "^1.0.0" w3c-keyname "^2.2.0" prosemirror-markdown@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.10.1.tgz#e20468201cda1916a6182686159398b242bb78ab" - integrity sha512-s7iaTLiX+qO5z8kF2NcMmy2T7mIlxzkS4Sp3vTKSYChPtbMpg6YxFkU0Y06rUg2WtKlvBu7v1bXzlGBkfjUWAA== + version "1.11.2" + resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.11.2.tgz#f6e529e669d11fa3eec859e93c0d2c91788d6c80" + integrity sha512-Eu5g4WPiCdqDTGhdSsG9N6ZjACQRYrsAkrF9KYfdMaCmjIApH75aVncsWYOJvEk2i1B3i8jZppv3J/tnuHGiUQ== dependencies: markdown-it "^13.0.1" prosemirror-model "^1.0.0" prosemirror-menu@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prosemirror-menu/-/prosemirror-menu-1.2.1.tgz#94d99a8547b7ba5680c20e9c497ce19846ce3b2c" - integrity sha512-sBirXxVfHalZO4f1ZS63WzewINK4182+7dOmoMeBkqYO8wqMBvBS7wQuwVOHnkMWPEh0+N0LJ856KYUN+vFkmQ== + version "1.2.2" + resolved "https://registry.yarnpkg.com/prosemirror-menu/-/prosemirror-menu-1.2.2.tgz#c545a2de0b8cb79babc07682b1d93de0f273aa33" + integrity sha512-437HIWTq4F9cTX+kPfqZWWm+luJm95Aut/mLUy+9OMrOml0bmWDS26ceC6SNfb2/S94et1sZ186vLO7pDHzxSw== dependencies: crelt "^1.0.0" prosemirror-commands "^1.0.0" prosemirror-history "^1.0.0" prosemirror-state "^1.0.0" -prosemirror-model@^1.0.0, prosemirror-model@^1.16.0, prosemirror-model@^1.18.1, prosemirror-model@^1.19.0, prosemirror-model@^1.8.1: - version "1.19.0" - resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.19.0.tgz#d7ad9a65ada0bb12196f64fe0dd4fc392c841c29" - integrity sha512-/CvFGJnwc41EJSfDkQLly1cAJJJmBpZwwUJtwZPTjY2RqZJfM8HVbCreOY/jti8wTRbVyjagcylyGoeJH/g/3w== +prosemirror-model@^1.0.0, prosemirror-model@^1.13.1, prosemirror-model@^1.16.0, prosemirror-model@^1.18.1, prosemirror-model@^1.19.0, prosemirror-model@^1.8.1: + version "1.19.3" + resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.19.3.tgz#f0d55285487fefd962d0ac695f716f4ec6705006" + integrity sha512-tgSnwN7BS7/UM0sSARcW+IQryx2vODKX4MI7xpqY2X+iaepJdKBPc7I4aACIsDV/LTaTjt12Z56MhDr9LsyuZQ== dependencies: orderedmap "^2.0.0" prosemirror-schema-basic@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.1.tgz#a5a137a6399d1a829873332117d2fe8131d291d0" - integrity sha512-vYBdIHsYKSDIqYmPBC7lnwk9DsKn8PnVqK97pMYP5MLEDFqWIX75JiaJTzndBii4bRuNqhC2UfDOfM3FKhlBHg== + version "1.2.2" + resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.2.tgz#6695f5175e4628aab179bf62e5568628b9cfe6c7" + integrity sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw== dependencies: prosemirror-model "^1.19.0" -prosemirror-schema-list@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.2.2.tgz#bafda37b72367d39accdcaf6ddf8fb654a16e8e5" - integrity sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w== +prosemirror-schema-list@^1.1.4, prosemirror-schema-list@^1.2.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz#05374702cf35a3ba5e7ec31079e355a488d52519" + integrity sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A== dependencies: prosemirror-model "^1.0.0" prosemirror-state "^1.0.0" - prosemirror-transform "^1.0.0" + prosemirror-transform "^1.7.3" -prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.4.2.tgz#f93bd8a33a4454efab917ba9b738259d828db7e5" - integrity sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ== +prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.3.3, prosemirror-state@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.4.3.tgz#94aecf3ffd54ec37e87aa7179d13508da181a080" + integrity sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q== dependencies: prosemirror-model "^1.0.0" prosemirror-transform "^1.0.0" prosemirror-view "^1.27.0" -prosemirror-tables@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-1.3.2.tgz#ca208c6a55d510af14b652d23e800e00ba6bebd4" - integrity sha512-/9JTeN6s58Zq66HXaxP6uf8PAmc7XXKZFPlOGVtLvxEd6xBP6WtzaJB9wBjiGUzwbdhdMEy7V62yuHqk/3VrnQ== +prosemirror-tables@^1.1.1, prosemirror-tables@^1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-1.3.4.tgz#0b7cc16d49f90c5b834c9f29291c545478ce9ab0" + integrity sha512-z6uLSQ1BLC3rgbGwZmpfb+xkdvD7W/UOsURDfognZFYaTtc0gsk7u/t71Yijp2eLflVpffMk6X0u0+u+MMDvIw== dependencies: prosemirror-keymap "^1.1.2" prosemirror-model "^1.8.1" @@ -5126,76 +1733,56 @@ prosemirror-tables@^1.3.0: prosemirror-view "^1.13.3" prosemirror-trailing-node@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.3.tgz#213fc0e545a434ff3c37b5218a0de69561bf3892" - integrity sha512-lGrjMrn97KWkjQSW/FjdvnhJmqFACmQIyr6lKYApvHitDnKsCoZz6XzrHB7RZYHni/0NxQmZ01p/2vyK2SkvaA== + version "2.0.7" + resolved "https://registry.yarnpkg.com/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.7.tgz#ba782a7929f18bcae650b1c7082a2d10443eab19" + integrity sha512-8zcZORYj/8WEwsGo6yVCRXFMOfBo0Ub3hCUvmoWIZYfMP26WqENU0mpEP27w7mt8buZWuGrydBewr0tOArPb1Q== dependencies: - "@babel/runtime" "^7.13.10" - "@remirror/core-constants" "^2.0.0" - "@remirror/core-helpers" "^2.0.1" + "@remirror/core-constants" "^2.0.2" + "@remirror/core-helpers" "^3.0.0" escape-string-regexp "^4.0.0" -prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.7.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.7.1.tgz#b516e818c3add0bdf960f4ca8ccb9d057a3ba21b" - integrity sha512-VteoifAfpt46z0yEt6Fc73A5OID9t/y2QIeR5MgxEwTuitadEunD/V0c9jQW8ziT8pbFM54uTzRLJ/nLuQjMxg== +prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.7.3.tgz#cc2225cd1bf88a3c62404b9eb051ff73e9c716a6" + integrity sha512-qDapyx5lqYfxVeUWEw0xTGgeP2S8346QtE7DxkalsXlX89lpzkY6GZfulgfHyk1n4tf74sZ7CcXgcaCcGjsUtA== + dependencies: + prosemirror-model "^1.0.0" + +prosemirror-transform@^1.7.0: + version "1.7.4" + resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.7.4.tgz#ea878c90563f3586064dd5ccf6cabb50b2753fd9" + integrity sha512-GO38mvqJ2yeI0BbL5E1CdHcly032Dlfn9nHqlnCHqlNf9e9jZwJixxp6VRtOeDZ1uTDpDIziezMKbA41LpAx3A== dependencies: prosemirror-model "^1.0.0" -prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.27.0, prosemirror-view@^1.28.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.30.2.tgz#57a9d15c5baa454f0d0f4a3028ddbd9be1e8ed9b" - integrity sha512-nTNzZvalQf9kHeEyO407LiV6DoOs/pXsid88UqW9Vvybo4ozJW2PJhkfZUxCUF1hR/9vJLdhxX84wuw9P9HsXA== +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.16.5, prosemirror-view@^1.27.0: + version "1.31.6" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.31.6.tgz#fb297606724fc4c827a31bf65376c05290177690" + integrity sha512-wwgErp+EWnuW4kGAYKrt90hhOetaoWpYNdOpnuQMXo1m4x/+uhauFeQoCCm8J30ZqAa4LgIER4yzKSO545gRfA== dependencies: prosemirror-model "^1.16.0" prosemirror-state "^1.0.0" prosemirror-transform "^1.1.0" -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== +prosemirror-view@^1.28.2, prosemirror-view@^1.31.0: + version "1.31.7" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.31.7.tgz#dccb2879314e1e1a24d48044c15374754e50ef00" + integrity sha512-Pr7w93yOYmxQwzGIRSaNLZ/1uM6YjnenASzN2H6fO6kGekuzRbgZ/4bHbBTd1u4sIQmL33/TcGmzxxidyPwCjg== + dependencies: + prosemirror-model "^1.16.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -qs@^6.9.0: - version "6.11.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" - integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== - dependencies: - side-channel "^1.0.4" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -5206,11 +1793,6 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -5239,115 +1821,22 @@ readdirp@~3.6.0: redent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" + indent-string "^4.0.0" + strip-indent "^3.0.0" regex-parser@^2.2.11: version "2.2.11" resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -5379,7 +1868,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== -resolve@^1.10.0, resolve@^1.14.2, resolve@^1.18.1: +resolve@^1.10.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -5388,11 +1877,6 @@ resolve@^1.10.0, resolve@^1.14.2, resolve@^1.18.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -5411,7 +1895,7 @@ rework@1.0.1: convert-source-map "^0.3.3" css "^2.0.0" -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -5426,14 +1910,9 @@ rollup@^3.20.2: fsevents "~2.3.2" rope-sequence@^1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.3.tgz#3f67fc106288b84b71532b4a5fd9d4881e4457f0" - integrity sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q== - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + version "1.3.4" + resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.4.tgz#df85711aaecd32f1e756f76e43a415171235d425" + integrity sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ== run-parallel@^1.1.9: version "1.2.0" @@ -5447,33 +1926,6 @@ safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - sass-loader@^8.0.0: version "8.0.2" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" @@ -5494,13 +1946,6 @@ sass@^1.32.4: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - schema-utils@^2.6.1: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" @@ -5510,38 +1955,23 @@ schema-utils@^2.6.1: ajv "^6.12.4" ajv-keywords "^3.5.2" -"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5": version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: +semver@^7.3.4: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -5549,59 +1979,11 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -sigmund@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g== - -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.7: +signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -5616,42 +1998,12 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: +source-map-resolve@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== @@ -5662,44 +2014,16 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.6: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-url@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== - -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@0.6.1, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - spdx-correct@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" @@ -5726,47 +2050,12 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -sprucecss@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/sprucecss/-/sprucecss-1.2.1.tgz#f0d111cde55ec2105029623097a4bf39d664939b" - integrity sha512-9+V+yO47GlvhwB2LB9CHg9CHjtlz5Mq5n7gtWVmo112kJmLyiURIbYufWLpgF9jIK/ZcH83L0+XRUduAu8zxRw== - -stack-utils@^2.0.2: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" +sprucecss@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/sprucecss/-/sprucecss-2.2.1.tgz#dddd6ec0a20cbee046763188930a34f42977fbeb" + integrity sha512-5g2IaMo5UGflku8Pkd+uCpLLyITwg3L+UrjzhDukbSiuhTa1TUsJgye3pNIPGrVVwrjdQhY9EwHwdK7KPHPncQ== -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5775,33 +2064,13 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -5809,21 +2078,29 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - style-search@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== +stylelint-config-sass-guidelines@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-10.0.0.tgz#ace99689eb6769534c9b40d62e2a8562b1ddc9f2" + integrity sha512-+Rr2Dd4b72CWA4qoj1Kk+y449nP/WJsrD0nzQAWkmPPIuyVcy2GMIcfNr0Z8JJOLjRvtlkKxa49FCNXMePBikQ== + dependencies: + postcss-scss "^4.0.6" + stylelint-scss "^4.4.0" + +stylelint-scss@^4.4.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-4.7.0.tgz#f986bf8c5a4b93eae2b67d3a3562eef822657908" + integrity sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg== + dependencies: + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + stylelint@^14.2.0: version "14.16.1" resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.16.1.tgz#b911063530619a1bbe44c2b875fd8181ebdc742d" @@ -5882,14 +2159,14 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0, supports-hyperlinks@^2.3.0: +supports-hyperlinks@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== @@ -5907,12 +2184,67 @@ svg-tags@^1.0.0: resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +svg.draggable.js@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz#c514a2f1405efb6f0263e7958f5b68fce50603ba" + integrity sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw== + dependencies: + svg.js "^2.0.1" + +svg.easing.js@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/svg.easing.js/-/svg.easing.js-2.0.0.tgz#8aa9946b0a8e27857a5c40a10eba4091e5691f12" + integrity sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA== + dependencies: + svg.js ">=2.3.x" + +svg.filter.js@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/svg.filter.js/-/svg.filter.js-2.0.2.tgz#91008e151389dd9230779fcbe6e2c9a362d1c203" + integrity sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw== + dependencies: + svg.js "^2.2.5" + +svg.js@>=2.3.x, svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/svg.js/-/svg.js-2.7.1.tgz#eb977ed4737001eab859949b4a398ee1bb79948d" + integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA== + +svg.pathmorphing.js@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz#c25718a1cc7c36e852ecabc380e758ac09bb2b65" + integrity sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww== + dependencies: + svg.js "^2.4.0" + +svg.resize.js@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/svg.resize.js/-/svg.resize.js-1.4.3.tgz#885abd248e0cd205b36b973c4b578b9a36f23332" + integrity sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw== + dependencies: + svg.js "^2.6.5" + svg.select.js "^2.1.2" + +svg.select.js@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/svg.select.js/-/svg.select.js-2.1.2.tgz#e41ce13b1acff43a7441f9f8be87a2319c87be73" + integrity sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ== + dependencies: + svg.js "^2.2.5" + +svg.select.js@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/svg.select.js/-/svg.select.js-3.0.1.tgz#a4198e359f3825739226415f82176a90ea5cc917" + integrity sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw== + dependencies: + svg.js "^2.6.5" -table@^6.0.9, table@^6.8.1: +tabbable@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.3.3.tgz#aac0ff88c73b22d6c3c5a50b1586310006b47fbf" + integrity sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA== + +table@^6.8.1: version "6.8.1" resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== @@ -5923,69 +2255,48 @@ table@^6.0.9, table@^6.8.1: string-width "^4.2.3" strip-ansi "^6.0.1" -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== - throttle-debounce@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== -tippy.js@^6.3.7: - version "6.3.7" - resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" - integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ== - dependencies: - "@popperjs/core" "^2.9.0" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" +tiptap-commands@^1.17.1: + version "1.17.1" + resolved "https://registry.yarnpkg.com/tiptap-commands/-/tiptap-commands-1.17.1.tgz#a8974a26d87db57b2fd4fc56a552520c69e43a4a" + integrity sha512-CyGvMD/c6fNer5LThWGtrVMXHAqHn93ivGQpqJ58x3HNZFuoIiF9QTWXAiWbY/4QrG0ANYHKCSe9n5afickTqw== + dependencies: + prosemirror-commands "^1.1.4" + prosemirror-inputrules "^1.1.2" + prosemirror-model "^1.13.1" + prosemirror-schema-list "^1.1.4" + prosemirror-state "^1.3.3" + prosemirror-tables "^1.1.1" + tiptap-utils "^1.13.1" + +tiptap-utils@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/tiptap-utils/-/tiptap-utils-1.13.1.tgz#f2150ded432465d66aa03a5ab333803415cddd20" + integrity sha512-RoCvMfkdu7fp9u7nsRr1OgsYU8RFjoHKHEKpx075rJ9X0t+j5Vxah9n6QzTTr4yjvcavq22WO2flFacm36zYtA== + dependencies: + prosemirror-model "^1.13.1" + prosemirror-state "^1.3.3" + prosemirror-tables "^1.1.1" + +tiptap@^1.32.2: + version "1.32.2" + resolved "https://registry.yarnpkg.com/tiptap/-/tiptap-1.32.2.tgz#cd6259e853652bfc6860758ff44ebb695d5edd1c" + integrity sha512-5IwVj8nGo8y5V3jbdtoEd7xNUsi8Q0N6WV2Nfs70olqz3fldXkiImBrDhZJ4Anx8vhyP6PIBttrg0prFVmwIvw== + dependencies: + prosemirror-commands "^1.1.4" + prosemirror-dropcursor "^1.3.2" + prosemirror-gapcursor "^1.1.5" + prosemirror-inputrules "^1.1.3" + prosemirror-keymap "^1.1.4" + prosemirror-model "^1.13.1" + prosemirror-state "^1.3.3" + prosemirror-view "^1.16.5" + tiptap-commands "^1.17.1" + tiptap-utils "^1.13.1" to-regex-range@^5.0.1: version "5.0.1" @@ -5994,82 +2305,16 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -tsconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" - integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== - dependencies: - "@types/strip-bom" "^3.0.0" - "@types/strip-json-comments" "0.0.30" - strip-bom "^3.0.0" - strip-json-comments "^2.0.0" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -6080,7 +2325,7 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^2.0.0: +type-fest@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== @@ -6095,77 +2340,11 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@^4.1.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -6178,43 +2357,16 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@^8.3.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: +v8-compile-cache@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" - integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -6242,156 +2394,23 @@ vite@^4.3.0: optionalDependencies: fsevents "~2.3.2" -vue-eslint-parser@^7.10.0: - version "7.11.0" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz#214b5dea961007fcffb2ee65b8912307628d0daf" - integrity sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg== - dependencies: - debug "^4.1.1" - eslint-scope "^5.1.1" - eslint-visitor-keys "^1.1.0" - espree "^6.2.1" - esquery "^1.4.0" - lodash "^4.17.21" - semver "^6.3.0" - -vue-jest@^5.0.0-alpha.7: - version "5.0.0-alpha.10" - resolved "https://registry.yarnpkg.com/vue-jest/-/vue-jest-5.0.0-alpha.10.tgz#4326977b3b0268b1def140f3b69113c2d82fb090" - integrity sha512-iN62cTi4AL0UsgxEyVeJtHG6qXEv+8Ci2wX1vP3b/dAZvyBRmqy5aJHQrP6VCEuio+HgHQ1LAZ+ccM2pouBmlg== - dependencies: - "@babel/plugin-transform-modules-commonjs" "^7.2.0" - chalk "^2.1.0" - convert-source-map "^1.6.0" - extract-from-css "^0.4.4" - source-map "0.5.6" - tsconfig "^7.0.0" - -vue-loader@^16.1.0: - version "16.8.3" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.8.3.tgz#d43e675def5ba9345d6c7f05914c13d861997087" - integrity sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA== - dependencies: - chalk "^4.1.0" - hash-sum "^2.0.0" - loader-utils "^2.0.0" - -vue@^3.2.39: - version "3.2.47" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.47.tgz#3eb736cbc606fc87038dbba6a154707c8a34cff0" - integrity sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ== - dependencies: - "@vue/compiler-dom" "3.2.47" - "@vue/compiler-sfc" "3.2.47" - "@vue/runtime-dom" "3.2.47" - "@vue/server-renderer" "3.2.47" - "@vue/shared" "3.2.47" - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - w3c-keyname@^2.2.0: - version "2.2.6" - resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz#8412046116bc16c5d73d4e612053ea10a189c85f" - integrity sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg== - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7, walker@~1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" + version "2.2.8" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" + integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== - -which@^1.2.9, which@^1.3.1: +which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" @@ -6400,36 +2419,6 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -6440,32 +2429,7 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^20.2.3: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@^15.4.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2"