diff --git a/.editorconfig b/.editorconfig index 340ce2a..aad9567 100644 --- a/.editorconfig +++ b/.editorconfig @@ -26,6 +26,7 @@ insert_final_newline = ignore [*.md] trim_trailing_whitespace = false +max_line_length = 80 [Makefile] indent_style = tab diff --git a/.env.example b/.env.example index 3773fe6..df1ec05 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1 @@ -FTP_HOST= -FTP_USER= -FTP_PASSWORD= +SITE_BASE_URL=https://gulp-devstack.cebre.us diff --git a/.env.local b/.env.local new file mode 100644 index 0000000..34e8339 --- /dev/null +++ b/.env.local @@ -0,0 +1,6 @@ +NODE_ENV=development +NODE_OPTIONS="--no-deprecation" +LOG_LEVEL=info # info (standard) | debug (extended) | verbose (maximum) + +SITE_BASE_URL=http://localhost:3000 + diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 89c23f1..0000000 --- a/.eslintignore +++ /dev/null @@ -1,23 +0,0 @@ -############################ -# Folders -############################ - -.cache -.idea -.temp -.tmp -build -dist -nbproject -node_modules -ssl -static -temp - -############################ -# Files -############################ - -*.html -*.min.* -package-lock.json diff --git a/.eslintrc.yml b/.eslintrc.yml deleted file mode 100755 index 6e00f0e..0000000 --- a/.eslintrc.yml +++ /dev/null @@ -1,46 +0,0 @@ -env: - browser: true - commonjs: false - es2021: true - -extends: - - 'airbnb-base' - - 'eslint:recommended' - - 'plugin:jsdoc/recommended' - - 'plugin:prettier/recommended' - - 'plugin:regexp/recommended' -plugins: - - import - - jsdoc - - prettier - - regexp - -overrides: - - files: - - '*.js' - -parser: '@babel/eslint-parser' -parserOptions: - requireConfigFile: false - babelrc: false - configFile: false - ecmaVersion: latest - sourceType: module - presets: - - '@babel/preset-env' - -rules: - no-param-reassign: - - error - - props: false - sort-imports: - - warn - - ignoreCase: false - ignoreDeclarationSort: false - ignoreMemberSort: false - memberSyntaxSortOrder: - - none - - all - - multiple - - single - allowSeparatedGroups: false diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 29e2514..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,12 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -updates: - - package-ecosystem: "npm" - directory: "/" - target-branch: "develop" - schedule: - interval: "weekly" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c24cf49..2ad3326 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -16,13 +16,13 @@ Replace [ ] by [x] to check these checkboxes! #### My PR is a: -* [ ] πŸ’₯ Breaking change -* [ ] πŸ› Bug fix -* [ ] πŸ’… Enhancement -* [ ] πŸš€ New feature +- [ ] πŸ’₯ Breaking change +- [ ] πŸ› Bug fix +- [ ] πŸ’… Enhancement +- [ ] πŸš€ New feature #### Main update on the: -* [ ] Templates and Code -* [ ] Framework -* [ ] Documentation +- [ ] Templates and Code +- [ ] Framework +- [ ] Documentation diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index cd61d81..0000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,72 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: 'CodeQL' - -on: - workflow_dispatch: - push: - branches: ['master'] - pull_request: - # The branches below must be a subset of the branches above - branches: ['master'] - schedule: - - cron: '31 4 * * 6' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: ['javascript'] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] - # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - - # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - # ℹ️ Command-line programs to run using the OS shell. - # πŸ“š See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - # If the Autobuild fails above, remove it and uncomment the following three lines. - # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. - - # - run: | - # echo "Run, Build Application using script" - # ./location_of_script_within_repo/buildscript.sh - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/github-pages-deploy-pnpm.yml b/.github/workflows/github-pages-deploy-pnpm.yml index 1a95459..6abc45e 100644 --- a/.github/workflows/github-pages-deploy-pnpm.yml +++ b/.github/workflows/github-pages-deploy-pnpm.yml @@ -1,10 +1,15 @@ -name: Build and Deploy +name: Deploy Pages (pnpm) -on: +'on': push: branches: ['master'] workflow_dispatch: - branches: ['master', 'develop'] + inputs: + skip_integration: + description: 'Skip integration tests (manual runs only)' + required: false + type: boolean + default: false permissions: contents: read @@ -12,51 +17,94 @@ permissions: id-token: write concurrency: - group: 'pages' - cancel-in-progress: false + group: pages-${{ github.ref }} + cancel-in-progress: true + +env: + NODE_VERSION: '22' + PNPM_VERSION: '10' jobs: - build-and-deploy: + verify-and-deploy: + name: Build and Deploy Pipeline runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} + outputs: + page_url: ${{ steps.deployment.outputs.page_url }} steps: - - name: Checkout πŸ”„ + - name: Checkout uses: actions/checkout@v4 - - name: Setup PNPM πŸ“¦ + with: + fetch-depth: 1 + + - name: Setup pnpm uses: pnpm/action-setup@v4 with: - version: 9 - - name: Setup Node.js ${{ matrix.node-version }} 🟒 + version: ${{ env.PNPM_VERSION }} + run_install: false + + - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} - cache: 'pnpm' - - name: Cache dependencies πŸ—„οΈ - uses: actions/cache@v4 - with: - path: ~/.pnpm-store - key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}- - - name: Install dependencies ⬇️ - run: pnpm install --ignore-scripts + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + cache-dependency-path: pnpm-lock.yaml + + - name: Install dependencies + run: pnpm install --frozen-lockfile --prefer-offline env: CI: true - - name: Build project πŸ”¨ - run: pnpm build - - name: Inspect build output πŸ” - run: | - ls -lah ./build - du -sh ./build - - name: Setup Pages βš™οΈ + + - name: Unit tests + run: pnpm run test:unit + + - name: Integration tests + if: ${{ !(github.event_name == 'workflow_dispatch' && inputs.skip_integration) }} + run: pnpm run test:integration + + - name: Build project + run: pnpm run build + + - name: Smoke Tests (Output Verification) + run: pnpm test:smoke + + - name: Validate built HTML + run: pnpm run build:validate:html + + - name: Setup Pages uses: actions/configure-pages@v5 - - name: Upload artifact πŸ“€ + + - name: Upload Pages artifact uses: actions/upload-pages-artifact@v3 with: - path: 'build' - - name: Deploy to GitHub Pages πŸš€ + path: build-prod + + - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 + + e2e-tests: + name: E2E Tests (Post-Deploy) + needs: verify-and-deploy + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: read + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: E2E tests against deployed site + run: node --test tests/e2e/**/*.test.js + env: + E2E_BASE_URL: ${{ needs.verify-and-deploy.outputs.page_url }} + E2E_RETRY_COUNT: '4' + E2E_RETRY_DELAY_MS: '15000' diff --git a/.github/workflows/github-pages-deploy.yml b/.github/workflows/github-pages-deploy.yml deleted file mode 100644 index bcea813..0000000 --- a/.github/workflows/github-pages-deploy.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Build and Deploy -on: - push: - branches: ['master'] - workflow_dispatch: - branches: ['master', 'develop'] - -permissions: - contents: write - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - - steps: - - name: Checkout πŸ”„ - uses: actions/checkout@v3 - - - name: Cache dependencies πŸ—„οΈ - id: cache - uses: actions/cache@v3 - with: - path: ./node_modules - key: modules-${{ hashFiles('package-lock.json') }} - - - name: Install dependencies ⬇️ - if: steps.cache.outputs.cache-hit != 'true' - run: npm ci --legacy-peer-deps - - - name: Build project πŸ”¨ - run: | - npm run build - - - name: Deploy to GitHub Pages πŸš€ - uses: JamesIves/github-pages-deploy-action@v4 - with: - folder: build diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml new file mode 100644 index 0000000..be31b78 --- /dev/null +++ b/.github/workflows/pr-checks.yml @@ -0,0 +1,189 @@ +name: PR Checks + +'on': + pull_request: + branches: ['master'] + workflow_dispatch: + inputs: + run_unit: + description: 'Run Unit Tests' + type: boolean + default: true + run_integration: + description: 'Run Integration Tests' + type: boolean + default: true + run_smoke: + description: 'Run Smoke Tests' + type: boolean + default: true + run_e2e: + description: 'Run E2E Tests' + type: boolean + default: true + +permissions: + contents: read + +env: + NODE_VERSION: '22' + PNPM_VERSION: '10' + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + timeout-minutes: 5 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: ${{ env.PNPM_VERSION }} + run_install: false + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run linters (fail on error) + run: pnpm lint:ci + + unit-test: + name: Unit Tests + runs-on: ubuntu-latest + timeout-minutes: 10 + # Run on PRs OR if manually enabled (defaulting to true) + if: github.event_name == 'pull_request' || inputs.run_unit != false + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: ${{ env.PNPM_VERSION }} + run_install: false + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run unit tests + run: pnpm test:unit + + integration-test: + name: Integration Tests + runs-on: ubuntu-latest + timeout-minutes: 10 + if: github.event_name == 'pull_request' || inputs.run_integration != false + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: ${{ env.PNPM_VERSION }} + run_install: false + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run integration tests + run: pnpm test:integration + + smoke-test: + name: Smoke Tests + runs-on: ubuntu-latest + timeout-minutes: 10 + needs: [lint] + if: github.event_name == 'pull_request' || inputs.run_smoke != false + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: ${{ env.PNPM_VERSION }} + run_install: false + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build artifact + run: pnpm run build + + - name: Run smoke tests + run: pnpm test:smoke + + e2e-test: + name: E2E Tests + runs-on: ubuntu-latest + timeout-minutes: 15 + needs: [lint] + if: github.event_name == 'pull_request' || inputs.run_e2e != false + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: ${{ env.PNPM_VERSION }} + run_install: false + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Install Playwright Browsers + run: npx playwright install --with-deps chromium + + - name: Run E2E tests + run: pnpm test:e2e diff --git a/.gitignore b/.gitignore index 32ad577..92bcd85 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ ############################ -# OS X +# OS ############################ ._* @@ -8,58 +8,29 @@ .LSOverride .Spotlight-V100 .Trashes -Icon - - -############################ -# Linux -############################ - -*~ - - -############################ -# Windows -############################ - -*.cab -*.msi -*.msm -*.msp -$RECYCLE.BIN/ Desktop.ini -ehthumbs.db +Icon Thumbs.db - +*~ ############################ -# Packages +# Archives & binaries ############################ *.7z -*.class -*.com -*.csv -*.dat -*.dll -*.dmg -*.exe *.gz -*.iso -*.jar -*.o -*.out -*.pid *.rar -*.seed -*.so -*.swm -*.swn -*.swo -*.swp *.tar *.zip +############################ +# Swap & editor files +############################ + +*.bak +*.code-workspace +*.sw[mnop] +*# ############################ # Logs and databases @@ -67,32 +38,28 @@ Thumbs.db *.log *.sql -*.sqlite -*.sqlite3 - +*.sqlite* ############################ # Misc. ############################ .cache +.claude .dccache -.env +.env* +!.env.example .eslintcache -.husky .idea .temp .tmp -*.bak -*# -build +build* dist export nbproject ssl temp - ############################ # Node.js ############################ @@ -105,10 +72,11 @@ node_modules pids results - ############################ # Tests ############################ coverage testApp +tests/.sandboxes +graphify-out/ diff --git a/.njklintrc.json b/.njklintrc.json new file mode 100644 index 0000000..2290643 --- /dev/null +++ b/.njklintrc.json @@ -0,0 +1,6 @@ +{ + "customFilters": ["md", "mdInline", "date"], + "rules": { + "checkFilters": true + } +} diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 081e89e..0000000 --- a/.npmrc +++ /dev/null @@ -1,4 +0,0 @@ -engine-strict = true -link-workspace-packages = true -shamefully-hoist = true -strict-peer-dependencies=false diff --git a/.nvmrc b/.nvmrc index 3f430af..78a26fa 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v18 +v24.10.0 diff --git a/.prettierignore b/.prettierignore index 1a96fb6..2c49d9e 100644 --- a/.prettierignore +++ b/.prettierignore @@ -13,6 +13,7 @@ node_modules ssl static temp +tests/.sandboxes ############################ # Files @@ -24,3 +25,7 @@ _variables.scss package-lock.json u-debugger.scss u-show-grid.scss +pnpm-lock.yaml + +# Ignore Markdown files, Remark handles formatting for them +**/*.md diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..21e647c --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,48 @@ +const config = { + arrowParens: 'always', + bracketSameLine: false, + bracketSpacing: true, + endOfLine: 'lf', + semi: false, + singleQuote: true, + tabWidth: 2, + trailingComma: 'es5', + useTabs: false, + importOrder: [ + '', + '^gulp$', + '^./gulpconfig', + '', + '^[./]', + ], + plugins: [ + '@ianvs/prettier-plugin-sort-imports', + 'prettier-plugin-jinja-template', + ], + overrides: [ + { + files: '*.njk', + options: { + parser: 'jinja-template', + printWidth: 120, + htmlWhitespaceSensitivity: 'strict', + }, + }, + { + files: '*.js', + options: { + printWidth: 80, + singleQuote: true, + arrowParens: 'always', + }, + }, + { + files: '*.json', + options: { + useTabs: true, + }, + }, + ], +} + +export default config diff --git a/.prettierrc.yml b/.prettierrc.yml deleted file mode 100644 index fc743a9..0000000 --- a/.prettierrc.yml +++ /dev/null @@ -1,32 +0,0 @@ -endOfLine: lf -tabWidth: 2 -useTabs: false -singleQuote: true -bracketSpacing: true -semi: true -arrowParens: always - -overrides: - - files: - - '*.js' - options: - printWidth: 80 - - files: - - '*.json' - options: - useTabs: true - # - files: - # - 'Makefile' - # options: - # useTabs: true - - files: - - '*.yml' - - '*.yaml' - - 'package.json' - options: - tabWidth: 2 - useTabs: false - # - files: - # - '*.html' - # options: - # htmlWhitespaceSensitivity: ignore diff --git a/.release-it.yml b/.release-it.yml index 90eaa5b..ab6aecc 100644 --- a/.release-it.yml +++ b/.release-it.yml @@ -50,7 +50,7 @@ plugins: - file: content/pages/index.md search: v\d+\.\d+\.\d+ replace: v{{versionWithoutPrerelease}} - - file: src/templates/layout-default.html + - file: src/routes/layout-default.njk search: data-version="\d+\.\d+\.\d+ replace: data-version="{{versionWithoutPrerelease}} - file: gulpconfig.build.js diff --git a/.remarkignore b/.remarkignore index 4d88608..683a8a3 100644 --- a/.remarkignore +++ b/.remarkignore @@ -7,9 +7,13 @@ .temp .tmp build +build-export +build-prod dist nbproject node_modules ssl static temp +tests/.sandboxes +graphify-out diff --git a/.remarkrc.js b/.remarkrc.js new file mode 100644 index 0000000..ef934a0 --- /dev/null +++ b/.remarkrc.js @@ -0,0 +1,35 @@ +// .remarkrc.js +import remarkFrontmatter from 'remark-frontmatter' +import remarkGfm from 'remark-gfm' +import remarkLintCode from 'remark-lint-code' +import remarkLintHeadingWhitespace from 'remark-lint-heading-whitespace' +import remarkLintNoDuplicateHeadings from 'remark-lint-no-duplicate-headings' +import remarkPresetLintConsistent from 'remark-preset-lint-consistent' +import remarkPresetLintRecommended from 'remark-preset-lint-recommended' + +/** @type {import('unified').Preset} */ +const config = { + settings: { + bullet: '-', + listItemIndent: 'one', + rule: '-', + ruleSpaces: false, + tightDefinitions: true, + }, + plugins: [ + remarkFrontmatter, + remarkGfm, + remarkPresetLintRecommended, + remarkPresetLintConsistent, + remarkLintCode, + remarkLintHeadingWhitespace, + ], + overrides: [ + { + files: 'src/routes/**/*.md', + plugins: [remarkLintNoDuplicateHeadings], + }, + ], +} + +export default config diff --git a/.remarkrc.yml b/.remarkrc.yml deleted file mode 100644 index a0eba81..0000000 --- a/.remarkrc.yml +++ /dev/null @@ -1,10 +0,0 @@ -plugins: - - remark-preset-lint-markdown-style-guide - - remark-gfm - - remark-frontmatter - - remark-lint-match-punctuation - - remark-preset-lint-consistent - - remark-preset-lint-recommended - - remark-lint-heading-whitespace - - remark-lint-no-dead-urls - - remark-lint-code diff --git a/.snyk b/.snyk deleted file mode 100644 index cb554d7..0000000 --- a/.snyk +++ /dev/null @@ -1,4 +0,0 @@ -# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. -version: v1.25.0 -ignore: {} -# patches apply the minimum changes required to fix a vulnerability diff --git a/.stylelintignore b/.stylelintignore index 3cb7a1a..6044157 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -13,6 +13,7 @@ node_modules ssl static temp +tests/.sandboxes ############################ # Files diff --git a/.stylelintrc.js b/.stylelintrc.js new file mode 100644 index 0000000..f4aa29c --- /dev/null +++ b/.stylelintrc.js @@ -0,0 +1,55 @@ +export default { + plugins: [ + 'stylelint-high-performance-animation', + 'stylelint-selector-bem-pattern', + ], + extends: [ + 'stylelint-config-standard-scss', + '@visionappscz/stylelint-config', + '@visionappscz/stylelint-config/order', + '@visionappscz/stylelint-config/scss', + ], + customSyntax: 'postcss-scss', + rules: { + 'unit-allowed-list': [ + 'px', + 'rem', + 'em', + '%', + 's', + 'deg', + 'vh', + 'vw', + 'dvw', + 'ch', + 'fr', + 'ms', + ], + 'plugin/no-low-performance-animation-properties': true, + 'at-rule-empty-line-before': null, + 'scss/operator-no-newline-after': null, + 'plugin/selector-bem-pattern': { + preset: 'bem', + implicitComponents: '**/c-*.scss', + componentName: '(([a-z0-9]+(?!-$)-?)+)', + componentSelectors: { + initial: + "\\.{componentName}(((__|--)(([a-z0-9\\[\\]'=]+(?!-$)-?)+))+)?$", + }, + implicitUtilities: '**/u-*.scss', + utilitySelectors: '^\\.u-[a-z]+$', + }, + // Reset for visionapps + 'selector-nested-pattern': null, + 'selector-class-pattern': null, + 'order/order': [ + 'dollar-variables', + 'custom-properties', + { name: 'extend', type: 'at-rule' }, + 'declarations', + { name: 'include', type: 'at-rule' }, + 'rules', + ], + }, + ignoreFiles: ['**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx'], +} diff --git a/.stylelintrc.yml b/.stylelintrc.yml deleted file mode 100644 index e72845c..0000000 --- a/.stylelintrc.yml +++ /dev/null @@ -1,29 +0,0 @@ -plugins: - - stylelint-high-performance-animation - - stylelint-selector-bem-pattern - -extends: - - '@visionappscz/stylelint-config' - - '@visionappscz/stylelint-config/order' - - '@visionappscz/stylelint-config/scss' - -rules: - indentation: 2 - linebreaks: 'unix' - unit-allowed-list: ['px', 'rem', 'em', '%', 's', 'deg', 'vh', 'vw'] - - plugin/no-low-performance-animation-properties: true - - plugin/selector-bem-pattern: - preset: 'bem' - implicitComponents: '**/c-*.scss' - componentName: '(([a-z0-9]+(?!-$)-?)+)' - componentSelectors: - initial: "\\.{componentName}(((__|--)(([a-z0-9\\[\\]'=]+(?!-$)-?)+))+)?$" - implicitUtilities: '**/u-*.scss' - utilitySelectors: "^\\.u-[a-z]+$" - - # Reset for visionapps - string-quotes: single - selector-nested-pattern: null - selector-class-pattern: diff --git a/.textlintrc.yml b/.textlintrc.yml deleted file mode 100644 index dbc38f4..0000000 --- a/.textlintrc.yml +++ /dev/null @@ -1,10 +0,0 @@ -rules: - common-misspellings: true - diacritics: true - no-dead-link: true - terminology: true - write-good: - adverb: false - passive: false - tooWordy: false - weasel: false diff --git a/CHANGELOG.md b/CHANGELOG.md index b57f3f2..b2bce6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,29 +1,146 @@ # Front-end Gulp DevStack Changelog +## [5.0.0](https://github.com/cebreus/gulp-devstack/compare/4.5.0...5.0.0) (2026-07-02) + +> **Major release!** Ported to the new Gulp 5 architecture, added a new showcase page, replaced Husky with Lefthook, and upgraded Node.js to >=24.10.0 along with various dependencies. + +### ⚠️ BREAKING CHANGES + +- refactor!(build): port to the new Gulp 5 architecture and split monolithic tasks into domain modules +- chore(deps): bump node engine requirement to >=24.10.0 + +### πŸš€ New Features + +- feat(showcase): add new showcase page with template, markdown content, and route-local styles +- feat(scripts): extract template operations into dedicated content and package modules +- feat(scripts): apply file purge policy to strip external tests and agent memories +- feat(scripts): remove internal test scripts from generated package configuration +- feat(scripts): add comprehensive unit and acceptance tests for template generation +- feat(scripts): update module boundary tests to verify internal boundaries +- feat(content): Implement calculateReadingTime with Markdown stripping +- feat(content): Integrate into processData task to provide readingTime metadata +- feat(content): Add unit and integration tests + +### Other changes + +#### Developer Experience (DX) + +- chore(dx): Git hooks now managed by Lefthook, replacing Husky. +- chore(dx): Extracted lint-staged configuration to dedicated file. +- chore(dx): `lefthook.yml` defines pre-commit, commit-msg, pre-push, and prepare-commit-msg hooks. +- chore(dx): Updated prepare script to install Lefthook. +- chore(dx): `README.md` updated to reflect the new Git hook manager. +- docs(dx): Provide specific sharp installation troubleshooting steps +- docs(dx): Detail source map policy for dev, build, and export pipelines +- docs(dx): Document testing philosophy, conventions, and visual parity tests +- docs(dx): Clarify routing and template data processing pipeline behavior +- docs(dx): Restructure `AGENTS.md` to symlink agent guidelines to `GEMINI.md` +- refactor(dx): Migrate ESLint to flat config syntax using direct plugin imports. +- refactor(dx): Add new ESLint rules for code quality, complexity, and unused imports. +- refactor(dx): Restrict JSDoc enforcement to only exported functions outside tests. +- refactor(dx): Adjust Stylelint rules to avoid conflicts and improve flexibility. +- refactor(dx): Relax specific lint rules for config and test files. +- chore(dx): ignore build output directories + +#### Build & Refactoring + +- refactor(build): delete monolithic `navigation.js` and replace with `route-data.js`, `html-output.js`, and `navigation-assets.js` +- refactor(build): extract sass compilation logic into `sass-pipeline.js` +- refactor(build): add `sass-dependency-cache.js` for incremental mtime-based skip logic +- refactor(build): extract image optimisation logic into `image-pipeline.js` +- refactor(build): add `private-streams.js` and `html-rendering.js` as focused utilities +- refactor(build): add `changed-filter.js` for file-change filtering +- refactor(build): remove `generate-todo.js` task +- refactor(build): refactor `gulpfile` to use createPipelines and selectDefaultPipeline helpers +- refactor(build): add cssBootstrap, cssProject, and cssRoutes as discrete named tasks +- refactor(build): add granular file-event watchers for route styles and scripts +- build: Upgrade multiple devDependencies to latest versions +- build: Resolve entry points before invoking processing task +- build: Skip processing when no matching files are identified +- build: Enhance configuration to support explicit entry points +- chore(build): add node-gyp dev dependency +- chore(build): skip integrity generation for compiled component styles +- chore(build): remove internal jsdoc block from javascript pipeline +- fix(build): implement Windows-compatible path processing in gulp utilities +- fix(build): quote glob patterns in `package.json` to prevent shell expansion errors +- fix(build): extract inline node scripts from `lefthook.yml` to dedicated files +- fix(build): update test suites to accommodate Windows path formats +- refactor(build): Tune Sharp compression effort for WebP, AVIF, and PNG formats +- refactor(build): Rename configuration constants for image optimization and favicon generation +- fix(build): Add POSIX path normalization to core utilities +- fix(build): Apply forward slash formatting consistently in route resolution +- fix(build): Add robust unit tests for Windows path compatibility +- fix(build): Improve config tests for environment path normalization and cleanup + +#### Dependencies + +- chore(deps): add `pnpm-workspace.yaml` with allowBuilds entries for native packages +- chore(deps): move dependency overrides to `pnpm-workspace.yaml` per pnpm 11+ rules +- chore(deps): upgrade eslint to v10, cssnano to v8, html-validate to v11 +- chore(deps): add eslint-plugin-unused-imports and @eslint-community/eslint-plugin-eslint-comments +- chore(deps): drop npm-run-all, rimraf, gulp-newer, gulp-sass, gulp-todo, and other unused packages +- chore(deps): add svgo v4 as direct dependency for SVG optimisation +- chore(deps): Upgraded various development libraries to latest versions +- chore(deps): Removed node-gyp, prompts, and remark-lint dev dependencies + +#### Tests + +- test(suite): add unit tests for changed-filter, private-streams, validate-html, and run-njklint +- test(suite): add unit tests for `gulpfile` structure and module boundaries +- test(suite): add integration tests for clean-build, copy-static, process-html, and process-js-routes +- test(suite): rename `images-final.test.js` to `images-final.test.js` for naming consistency +- test(suite): add runInSandbox and silenceConsole helpers to test-helpers +- test(suite): rename mockEnv to createMockEnvironment +- test(suite): suppress logger warn and error output in passing test runs +- test(suite): refactor visual parity suite to explicit named test cases +- test(suite): add documentation synchronization end-to-end test +- test(suite): implement fallback watch target resolution in development server test +- test(suite): add dependency symlink helper and cleanup resilience to test sandbox + +#### Source & Initialization + +- chore(src): add `run-njklint.js` to wrap nunjucklinter CLI invocations +- chore(src): split `init-template.js` into `init-template-content.js` and `init-template-ops.js` +- chore(src): update about page template and markdown content +- chore(src): update hero component styles and markup +- chore(src): update `env.js` config and JS entry points +- chore(src): update plopfile for new component generator structure +- chore(init): The component script is no longer available. +- chore(init): All associated content generation, file operations, and package setup removed. +- chore(init): Dedicated unit and integration tests for the initialization process are deleted. +- chore(src): remove default components, hero sections, and showcase routes +- chore(src): delete dummy fonts, logos, and vector assets +- chore(src): remove obsolete github instructions, unused codeql workflow, and init script +- chore(src): drop size-limit configuration and dependencies +- chore(src): update `README.md`, AI agent documentation, and repository rules +- chore(src): clean up outdated visual parity and unit test suites + ## [4.5.0](https://github.com/cebreus/gulp-devstack/compare/4.4.0...4.5.0) (2024-05-13) -> It contains Bootstrap 5.3.2, Node,je version bump to 18.x, security updates and major package upgrades. +> It contains Bootstrap 5.3.2, Node,je version bump to 18.x, security updates +> and major package upgrades. ### ⚠️ BREAKING CHANGES -* Node.js version bump to 18.x -* Update GitHub Actions to latest versions +- Node.js version bump to 18.x +- Update GitHub Actions to latest versions ### πŸš€ New Features -* Update Bootstrap to 5.3.2 +- Update Bootstrap to 5.3.2 ### Other changes -* fix: `gulp-todo.js` -* fix: callbacks -* refactor: logging -* refactor: documentation -* refactor: linters +- fix: `gulp-todo.js` +- fix: callbacks +- refactor: logging +- refactor: documentation +- refactor: linters ## [4.4.1](https://github.com/cebreus/gulp-devstack/compare/4.0.0...4.4.1) (2023-07-03) -> Fix a glob in the `copyStaticFnc()` function, refactor the `buildTodo()` function and security updates. +> Fix a glob in the `copyStaticFnc()` function, refactor the `buildTodo()` +> function and security updates. ## [4.4.0](https://github.com/cebreus/gulp-devstack/compare/4.0.0...4.4.0) (2023-06-12) @@ -31,8 +148,8 @@ ### πŸš€ New Features -* feat: upgrade Bootstrap to 5.3.0 -* feat: new GitHub action for deployment to GitHub Pages +- feat: upgrade Bootstrap to 5.3.0 +- feat: new GitHub action for deployment to GitHub Pages ## Release [4.3.1](https://github.com/cebreus/gulp-devstack/compare/4.0.0...4.3.1) (2023-05-30) @@ -44,7 +161,8 @@ ## Release [4.2.0](https://github.com/cebreus/gulp-devstack/compare/4.0.0...4.2.0) (2023-03-29) -> Security updates, minor enhancements and upgrade of gulp-imagemin to version 8. +> Security updates, minor enhancements and upgrade of gulp-imagemin to +> version 8. ## Release [4.1.1](https://github.com/cebreus/gulp-devstack/compare/4.0.0...4.1.1) (2023-03-29) @@ -52,52 +170,54 @@ ## Release [4.1.0](https://github.com/cebreus/gulp-devstack/compare/4.0.0...4.1.0) (2023-01-29) -> Code cleanup, security fixes, major code maintenance, Stylelint fixes and Babel upgrade. +> Code cleanup, security fixes, major code maintenance, Stylelint fixes and +> Babel upgrade. ### πŸš€ New Features -* feat: update Bootstrap to 5.2.3 +- feat: update Bootstrap to 5.2.3 ## Release [4.0.0](https://github.com/cebreus/gulp-devstack/compare/3.5.0...4.0.0) (2022-10-05) -> **Major release!** Refactored all Gulp tasks and scripts. Contains Bootstrap 5.2.2 and security updates. +> **Major release!** Refactored all Gulp tasks and scripts. Contains Bootstrap +> 5.2.2 and security updates. ### ⚠️ BREAKING CHANGES -* refactor: all Gulp tasks and scripts +- refactor: all Gulp tasks and scripts ### πŸš€ New Features -* feat: update Bootstrap to 5.2.2 -* feat: new header on 404 page +- feat: update Bootstrap to 5.2.2 +- feat: new header on 404 page ### Other changes -* refactor: textlint rules -* refactor: eslint rules -* refactor: npm script 'todo' -* refactor: release process -* fix: use local instance of the Gulp -* fix: npm script 'prepare' -* chore: npm up +- refactor: textlint rules +- refactor: eslint rules +- refactor: npm script 'todo' +- refactor: release process +- fix: use local instance of the Gulp +- fix: npm script 'prepare' +- chore: npm up ## Release [3.5.0](https://github.com/cebreus/gulp-devstack/compare/3.4.0...3.5.0) (2022-06-20) > Security updates, Bootstrap 5.2.0 and minor fixes and refactors. -* feat: update Bootstrap to 5.2.0 -* refactor: calling if the npm scripts -* fix: unresolved variable -* fix: fs-read() encoding to 'utf8' +- feat: update Bootstrap to 5.2.0 +- refactor: calling if the npm scripts +- fix: unresolved variable +- fix: fs-read() encoding to 'utf8' ## Release [3.4.0](https://github.com/cebreus/gulp-devstack/compare/3.3.1...3.4.0) (2022-02-02) > Update to Node.js 16 and cross-platform fixes. -* Node.js 16 -* Prefix relative paths in export with '.' -* Add caching to GitHub workflow -* Add VS code extensions recommendations +- Node.js 16 +- Prefix relative paths in export with '.' +- Add caching to GitHub workflow +- Add VS code extensions recommendations ## Release [3.3.1](https://github.com/cebreus/gulp-devstack/compare/3.3.0...3.3.1) (2021-12-01) @@ -107,9 +227,9 @@ ### πŸš€ New Features -* Brand new landing page. -* Refactor Twitter cards markup. -* GitHub workflow for install, build and deploy to GitHub Pages. +- Brand new landing page. +- Refactor Twitter cards markup. +- GitHub workflow for install, build and deploy to GitHub Pages. ## Release [3.2.0](https://github.com/cebreus/gulp-devstack/compare/3.1.1...3.2.0) (2021-11-11) @@ -117,21 +237,23 @@ Updated npm packages include `gulp-sass` (version 5) & `sass` (Dart Sass). ### πŸš€ New Features -* feat: Bootstrap 5.1.3 [`60da2f6`](https://github.com/cebreus/gulp-devstack/commit/60da2f6b6d7343c41c09983cdfd8ba604a6195c1) +- feat: Bootstrap 5.1.3 + [`60da2f6`](https://github.com/cebreus/gulp-devstack/commit/60da2f6b6d7343c41c09983cdfd8ba604a6195c1) ## Release [3.1.1](https://github.com/cebreus/gulp-devstack/compare/3.1.0...3.1.1) (2021-09-22) Required node 14.x, updated npm packages -* fix: husky execute -* fix: validation of HTML -* refactor: remove gitmodule git-release +- fix: husky execute +- fix: validation of HTML +- refactor: remove gitmodule git-release ## Release [3.1.0](https://github.com/cebreus/gulp-devstack/compare/3.0.0...3.1.0) (2021-05-30) ### πŸš€ New Features -* feat: Bootstrap 5.0.1 [`507d13c`](https://github.com/cebreus/gulp-devstack/commit/507d13c45b77e1fc47ee8c232ddba165649946a6) +- feat: Bootstrap 5.0.1 + [`507d13c`](https://github.com/cebreus/gulp-devstack/commit/507d13c45b77e1fc47ee8c232ddba165649946a6) ## Release [3.0.0](https://github.com/cebreus/gulp-devstack/compare/2.0.0...3.0.0) (2021-03-10) diff --git a/GEMINI.md b/GEMINI.md new file mode 100644 index 0000000..a07beef --- /dev/null +++ b/GEMINI.md @@ -0,0 +1,84 @@ +# GEMINI + +## Project + +Gulp DevStack is a static-site build system for Nunjucks, Markdown, SCSS, and JS. +This file is the canonical instruction set for AI agents in this repository. + +## Stack + +- Node.js `>=24.10.0` +- pnpm +- ESM-first JavaScript +- Gulp 5, Nunjucks, Markdown, Dart Sass, PostCSS, esbuild, Sharp +- Tests: `node:test` + `node:assert` +- Types: JSDoc only +- No TypeScript + +## Commands + +```bash +pnpm install +pnpm dev +pnpm build +pnpm export +pnpm test +pnpm test:e2e +pnpm lint +pnpm format +pnpm verify:pipeline +pnpm run component +``` + +## Architecture + +- Keep side-effects at boundaries: file system, build pipelines, streams, external tools. +- Keep core logic pure, deterministic, and directly unit-testable. +- Prefer domain modules over mixed utilities. +- Preserve public seams unless all callers and tests are updated. + +## Rules + +- IMPORTANT: Treat `package.json`, `eslint.config.js`, and relevant lint/test configs as executable project policy; inspect them before coding. +- IMPORTANT: TDD first. Write or update a failing test before implementation, then make it pass, then refactor. +- IMPORTANT: Code must stay strictly testable. Isolate side-effects at boundaries. +- IMPORTANT: If a fix expands into multi-file refactoring or architecture change, stop and ask for approval. +- IMPORTANT: Do not guess. If context is missing, say "I don't know" and inspect code, config, or command output. +- IMPORTANT: Never claim success unless the relevant tests or commands were run and verified in the current turn. +- IMPORTANT: Commits are forbidden by default. +- IMPORTANT: Exception: commit only to safeguard a fully verified, atomic chunk before a risky change. +- Lint covers only part of repository policy. +- Prefer named functions in production JS. +- Avoid classes for app logic. +- Use `node:` stdlib imports. +- Fail fast. +- Preserve `Error.cause` when rethrowing. +- Keep `validate*` return shape `{ isValid: boolean, error: string | null }`. +- Use libraries instead of custom reinventions when a standard package already fits. +- Passing tests must not emit expected `warn`/`error` noise that looks like a real failure. + +## Workflow + +1. Read the touched files, `package.json`, and the relevant project config first. +2. If the task touches JS, inspect `eslint.config.js`. +3. If the task touches styles, templates, or docs, inspect the matching linter/formatter config and scripts. +4. If `graphify` CLI is available and `graphify-out/graph.json` exists, try using it before manual spelunking. +5. Refresh the graph only if it is stale and the task warrants it. +6. If the task touches architecture, build pipeline, dependencies, or tricky logic, read the relevant file in `memories/`. + - For Build Pipeline-related constraints, read memories/build-pipeline-gotchas.md + - For Dependency-related constraints, read memories/dependency-gotchas.md + - For Logic/Correctness-related constraints, read memories/logic-correctness-gotchas.md + - For Architectural-related constraints, read memories/architectural-gotchas.md +7. Add or update the failing test first. +8. Implement the smallest possible change. +9. Refactor only with tests green and only inside the approved scope. +10. Run the narrowest relevant verification, then broader checks if needed. +11. Report only facts verified from files, tests, config, or command output in the current turn. + +## Out of scope + +- Do not perform broad refactors without approval. +- Do not reduce testability by hiding logic inside gulp glue, streams, or orchestration. +- Do not regenerate whole files when a surgical edit preserves context better. +- Do not invent tool results, architecture facts, or bug causes. +- Do not commit, rewrite history, or make destructive repo changes unless explicitly allowed above. diff --git a/README.md b/README.md index 7187599..5cd410e 100644 --- a/README.md +++ b/README.md @@ -1,325 +1,85 @@ -[![Build\&Deploy GitHub pages](https://github.com/cebreus/gulp-devstack/actions/workflows/github-pages-deploy-pnpm.yml/badge.svg)](https://github.com/cebreus/gulp-devstack/actions/workflows/github-pages-deploy-pnpm.yml) -[![Netlify](https://img.shields.io/netlify/80dd73b9-7dff-450b-a038-4fba020d577a)](https://app.netlify.com/sites/gulp-devstack/deploys) -![Maintenance](https://img.shields.io/maintenance/yes/2024) -![Contributions welcome](https://img.shields.io/badge/contributions-welcome-green.svg) +# Gulp DevStack -[![Codacy Badge](https://app.codacy.com/project/badge/Grade/16e0c62b123d4dbfb27c216f5107f464)](https://www.codacy.com/gh/cebreus/gulp-devstack/dashboard?utm_source=github.com\&utm_medium=referral\&utm_content=cebreus/gulp-devstack\&utm_campaign=Badge_Grade) -![GitHub open issues](https://img.shields.io/github/issues/cebreus/gulp-devstack) -![License](https://img.shields.io/github/license/cebreus/gulp-devstack) +High-control static web workflow with predictable output and zero-trust validation. Built on **Gulp 5**, **Nunjucks**, **Dart Sass**, **PostCSS**, **esbuild**, and **Sharp**. -# Front-end Gulp DevStack +- **Project Website**: [gulp-devstack.cebre.us](https://gulp-devstack.cebre.us) +- **Documentation**: [Technical Guides](https://gulp-devstack.cebre.us/about) +- **Reference**: [Showcase & Components](https://gulp-devstack.cebre.us/showcase) -> Gulp stack for building optimized static pages and exports for collaboration between coders and programmers. +--- -
-
- Table of contents (click to expand) +## Architectural Philosophy - +Gulp DevStack is designed for developers who demand precision. It rejects framework abstractions in favor of explicit control and deterministic output. -* [Typical use cases](#typical-use-cases) -* [Features](#features) - * [Something more under the hood](#something-more-under-the-hood) -* [Getting Started](#getting-started) - * [Installation](#installation) -* [Project structure](#project-structure) -* [Workflow](#workflow) - * [Development](#development) - * [Production Build](#production-build) - * [Export Build](#export-build) -* [Updates from devstack to your existing project](#updates-from-devstack-to-your-existing-project) -* [Inject devstack to your new project](#inject-devstack-to-your-new-project) -* [Roadmap and Known issues](#roadmap-and-known-issues) -* [Contributing](#contributing) -* [License](#license) -* [Contact](#contact) +### 1. Template-Based Routing - +Every routable Nunjucks template in `src/routes/` maps directly to public HTML. Internal layout files use the `layout-*.njk` prefix and are excluded from output. -
-
+- `src/routes/index.njk` β†’ `/` +- `src/routes/404.njk` β†’ `/404.html` +- `src/routes/about/index.njk` β†’ `/about/` -## Typical use cases +### 2. Hybrid Data Architecture (The Merge Pattern) -* Developing landing pages or prototypes (`npm run dev`). -* Building carefully compiled and formated files for collaboration (`npm run export`). -* Building the final (production) bundle, ready for deployment (`npm run deploy`). +Routes support an "Override & Merge" pattern. If a folder contains both `.njk` (template) and `.md` (data), the build engine automatically merges them. The `.md` frontmatter and content are compiled into `.temp/pages/*.json` and injected into the Nunjucks context as `page`, allowing a clean split between presentation and content. -When you want to build whole web sites from the data sources as API or many markdown files, go with Static Page Generators (SGC). For example [Gridsome](https://gridsome.org/) (VueJS), [Gatsby](https://www.gatsbyjs.org/) (React) or [Hugo](https://gohugo.io/) (Go) will work for you much better. +### 3. Isolated Page Assets -## Features +To prevent bundle bloat, the pipeline supports **Asset Autodiscovery**. If you create `src/routes/my-page/index.scss` or `index.js`, they are automatically compiled and injected *only* into that specific page. -* SEO-friendly β€” Open Graph and Twiter Cards markup, self/canonical. -* User-friendly β€” image optimizations, favicons, webmanifest and all sources minification to smallest bundle. -* Developer-friendly β€” [ESLint](https://eslint.org/), [Prettier](https://prettier.io/), [Remark](https://remark.js.org/), [Stylelint](https://stylelint.io/) via tasks or with [Husky](https://github.com/typicode/husky) and [Lint staged](https://github.com/okonet/lint-staged). -* Separate tasks for Development, Export and Build with automatic renaming and hashing all critical assets. -* Ready for implementation Git based CMS as [Tina CMS](https://tina.io/) or [Netlify CMS](https://www.netlifycms.org/) etc. β€” Front Matter (Markdown files metadata and content). -* HTML temlates uses [Nunjucks](https://mozilla.github.io/nunjucks/). Fully customisable [Bootstrap 5.3](https://getbootstrap.com/) extended with [BEM](https://en.bem.info/). JavaScript processed with [Babel](https://babeljs.io/) or injected from CDN or as static files. +--- -*** +## Technical Standards & Pipeline -| | Preprocessing / Linting | πŸ› οΈ Development
Postprocessing | πŸ‘οΈ Export
Postprocessing | πŸ’― Build
Postprocessing | -| ---------------------- | :------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **CSS** | [SASS](https://github.com/dlmanning/gulp-sass) / [Stylelint](https://stylelint.io/) | [PostCSS](https://github.com/postcss/postcss) ([Autoprefixer](https://github.com/postcss/autoprefixer), [prettify](https://github.com/beautify-web/js-beautify)) | [PostCSS](https://github.com/postcss/postcss) ([Autoprefixer](https://github.com/postcss/autoprefixer), [prettify](https://github.com/beautify-web/js-beautify)) | [PostCSS](https://github.com/postcss/postcss) ([Autoprefixer](https://github.com/postcss/autoprefixer), [cssnano](https://github.com/ben-eb/cssnano), [PurgeCSS](https://purgecss.com/)) | -| **JavaScript** | [Babel](https://babeljs.io/) / [ESLint](https://eslint.org/) | only concatenate | concatenate & [uglify](https://github.com/terinjokes/gulp-uglify) | concatenate & [uglify](https://github.com/terinjokes/gulp-uglify) | -| **HTML** | [Nunjucks](https://github.com/carlitoplatanito/gulp-nunjucks-render) | [prettify](https://github.com/beautify-web/js-beautify) | [prettify](https://github.com/beautify-web/js-beautify) | [minify](https://github.com/kangax/html-minifier) | -| **Content & Metadata** | [Markdown](https://daringfireball.net/projects/markdown/) / [Remark](https://remark.js.org/) | | | | -| **JPG**, **SVG** | | [imagemin](https://github.com/sindresorhus/gulp-imagemin) | [imagemin](https://github.com/sindresorhus/gulp-imagemin) | [imagemin](https://github.com/sindresorhus/gulp-imagemin) | -| **PNG** | | [UPNG.js](https://github.com/photopea/UPNG.js/) | [UPNG.js](https://github.com/photopea/UPNG.js/) | [UPNG.js](https://github.com/photopea/UPNG.js/) | -| **Fonts** | | [gulp-google-webfonts](https://github.com/battlesnake/gulp-google-webfonts) | [gulp-google-webfonts](https://github.com/battlesnake/gulp-google-webfonts) | [gulp-google-webfonts](https://github.com/battlesnake/gulp-google-webfonts) | -| **Favicons** | | | [Favicons](https://github.com/itgalaxy/favicons) | [Favicons](https://github.com/itgalaxy/favicons) | -| **Workflow hints** | | [Browsersync](https://browsersync.io/) | | | +### Triple-Pipeline Strategy -### Something more under the hood +1. **Development Mode** (`pnpm dev`): Optimized for speed. Hot-reloading via BrowserSync (strictly on port 3000), source maps, and incremental builds. +2. **Production Build** (`pnpm build`): Optimized for security and performance. Assets are revisioned (fingerprinted), SRI hashes are injected, and CSS is purged. +3. **Export Mode** (`pnpm export`): A clean handoff mode. It keeps readable, non-hashed CSS/JS and formats HTML, while preserving the same route structure as the production build. -* Linting all commit messages by [CommitLint](https://commitlint.js.org/), see more about [Semantic Commit Messages](https://seesparkbox.com/foundry/semantic_commit_messages) and [Conventional Commits](https://www.conventionalcommits.org/) -* Commit guide on the CLI by [git-cz](https://github.com/streamich/git-cz) -* Automatic releases with [Release It!](https://github.com/release-it/release-it), see more about [Semantic Versioning](https://semver.org/) -* Changelog with [Conventional Changelog](https://github.com/conventional-changelog/conventional-changelog) -* [Gitflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) -* Build and deployment to FTP. +### Zero-Trust Verification -## Getting Started +The `verify:pipeline` command ensures the project never regresses: -### Installation +- **WCAG Audits**: Automated accessibility checks via Playwright and Axe-core. +- **Link Integrity**: Exhaustive validation of all internal links and anchors. +- **Visual Parity**: Automated screenshot comparison between Build and Export modes to ensure visual consistency across pipelines. +- **Strict Validation**: HTML5 structure verification via `html-validate`. +- **Graph Awareness**: `graphify update .` refreshes `graphify-out/graph.json`, `graphify-out/graph.html`, and `graphify-out/GRAPH_REPORT.md` after code changes. -1. [Node.js and npm](https://nodejs.org/en/) are required. +--- -2. Clone the repository into the new project directory `PROJECT_NAME` +## Project Structure - ```bash - git clone https://github.com/cebreus/gulp-devstack/ ./PROJECT_NAME - ``` - -3. Go to project directory `PROJECT_NAME` and install npm dependencies - - ```bash - cd PROJECT_NAME && npm i - ``` - -4.
- Optional clenup (click to expand) - - * Clean `CHANGELOG.md` - - ```bash - > CHANGELOG.md - ``` - - * Change or remove `LICENSE.txt` by `rm LICENSE` - - ```bash - rm LICENSE - ``` - - * Change this `README.md` according to your new project or replace it from the template - - ```bash - curl https://gist.githubusercontent.com/cebreus/a6010a2a95a4f2375830b0af3193f2f9/raw/cde6d9c68f2605b34eb5b8710bd553e7ad28a678/minimalistic-readme > README.md - ``` - - * Change these data in the `package.json` accordng to your new project - * `name` - * `description` - * `keywords` - * `author` - * `license` - * `private` - * `repository` - * `homepage` - * `bugs` - -
- -## Project structure - -* ### `/.github` - - Specialties designed for GitHub. - -* ### `/content` - - * `/pages` β€” each `*.md` is data source for templates; each file corresponds to the template `./src/pages/*.html` - * `site.md` β€” contains default data for all pages - -* ### `/gulp-tasks` - - Common Gulp tasks for Development workflow. Do not edit unless you know what you are doing. - -* ### `/gulp-tasks-build` - - Common Gulp tasks for Build workflow. Do not edit unless you know what you are doing. - -* ### `/gulp-tasks-export` - - Common Gulp tasks for Export workflow (compiled and formated bundles). Do not edit unless you know what you are doing. - -* ### `/src` - - Development directory. This is place of developers creativity. Change anything as you wish. - - * `/gfx` β€” graphic assets - * `/js` β€” JavaScripts, all files in this directory will be concatenated into one file; files are sorted by name - * `/scss` - * `_variables.scss` β€” copy from the Bootstrap core for your customization. - * `bootstrap.scss` β€” copy from the Bootstrap core for your customization. - * `c-article.scss` β€” example of the [BEM component](https://csswizardry.com/2015/03/more-transparent-ui-code-with-namespaces/#component-namespaces-c-) Article. - * `custom.scss` β€” main stlesheet for customization of the project. Contains additions and overriding of the Bootstrap. - * `u-debugger.scss` β€” only in Developmnet workflow adds outline and info around HTML element with \[BEM namespaces]\([BEM component](https://csswizardry.com/2015/03/more-transparent-ui-code-with-namespaces/). Outlines [objects](https://csswizardry.com/2015/03/more-transparent-ui-code-with-namespaces/#object-namespaces-o-) `o-`, [component](https://csswizardry.com/2015/03/more-transparent-ui-code-with-namespaces/#component-namespaces-c-) `c-` and [utilities](https://csswizardry.com/2015/03/more-transparent-ui-code-with-namespaces/#utility-namespaces-u-) `u-`. To enable functionality set `$show-debugger` to `true` in the file `_variables.scss`. - * `u-show-grid.scss` β€” only in Developmnet workflow adds small box into bottom right corner with information about current viewport size accoding to Bootstrap. In the file `_variables.scss` set `$show-grid` to `true` and see bars as Bootstrap grid columns. - * `/templates` - * `/pages` β€” every `*.html` file will be rendered as standalone HTML page on own URL (directory name). Meta attributes passes from according Markdown file in `./content` directory. - * `/partials` β€” - * `layout-default.html` β€” main layout which extends files in `./templates/pages` - * `font.list` β€” tab-delimeted format for [gulp-google-webfonts](https://github.com/battlesnake/gulp-google-webfonts) which download font files and CSS to the project. - -* ### `/static` - - Content of this directory will be coppied into target (temp, export or build directory). - - * `/.well-known/security.txt` β€” definition of the security policies. [Further info](https://securitytxt.org/) - * `humans.txt` β€” detailed public information about project e.g. team members, technologies etc. [Further info](http://humanstxt.org/) - -* ### `/` (root) - - * `.browserslistrc` β€” [Browserslist](https://github.com/browserslist/browserslist) configuration to share target browsers versions between different front-end tools as Autoprefixer, Babel etc. The configuration is a copy of the Bootstrap configuration in this repo. - * `.editorconfig` β€” basic definition of code formatting for different code editors and IDEs. These settings are used as a baseline for language specialised linters in this repo. [Further info](http://editorconfig.org/) - * `.env.example` β€” template of the `.env` file, where stored fragments of the code shouldn’t be part of repo’s codebase, e.g. login to FTP. - * `.eslintignore` β€” list of the files and directories to be ignore by [Eslint](https://eslint.org/). - * `.eslintrc.yml` β€” [Eslint](https://eslint.org/) configuration to specify and configure rules of JavaScript linting. [Further info](https://eslint.org/docs/user-guide/configuring) - * `.gitattributes` β€” path-specific settings used by [Git](https://git-scm.com/). Settings that Git applies to certain subdirectories or subsets of files - for example EOL (End Of Line) setting. [Further info](https://git-scm.com/docs/gitattributes) - * `.gitignore` β€” list of path-specific pattern to be ignored (not commited) by [Git](https://git-scm.com/). [Further info](https://git-scm.com/docs/gitignore) - * `.prettierignore` β€” list of the files and directories to be ignore by [Prettier](https://prettier.io/). - * `.prettierrc.yml` β€” [Prettier](https://prettier.io/) configuration to specify and configure rules of language specific code formatting. - * `.release-it.yml` β€” [Release It!](https://github.com/release-it/release-it) configuration to specify behaviour of the versioning and package publishing related tasks. - * `.remarkignore` β€” list of the files and directories to be ignore by [Remark](https://remark.js.org/). - * `.remarkrc.yml` β€” [Remark](https://remark.js.org/) configuration to specify and configure rules of [Markdown](https://daringfireball.net/projects/markdown/) lintng. - * `.stylelintignore` β€” list of the files and directories to be ignore by [Stylelint](https://stylelint.io/). - * `.stylelintrc.yml` β€” [Stylelint](https://stylelint.io/) configuration to specify and configure rules of CSS (SCSS) linting. See used plugins! [Further info](https://stylelint.io/user-guide/configuration/) - * `commitlint.config.js` β€” [commitlint](https://commitlint.js.org/) configuration to help adhering to a commit convention. - * `gulpconfig.js` β€” configuration for πŸ› οΈ **development** Gulp file `gulpfile.js`. Contains variables and setting which are specific for Development workflow purposes. - * `gulpconfig-build.js` β€” configuration for πŸ’― **build** Gulp file `gulpfile.build.js`. Contains variables and setting which are specific for Build workflow purposes. - * `gulpconfig-export.js` β€” configuration for πŸ‘οΈ **export** Gulp file `gulpfile.export.js`. Contains variables and setting which are specific for Export workflow purposes. - * `gulpfile.js` β€” [Gulp](https://gulpjs.com/) πŸ› οΈ **development** configuration and definition of automation tasks. [Further info](https://www.sitepoint.com/introduction-gulp-js/) - * `gulpfile.build.js` β€” [Gulp](https://gulpjs.com/) πŸ’― **build** configuration and definition of automation tasks. [Further info](https://www.sitepoint.com/introduction-gulp-js/) - * `gulpfile.export.js` β€” [Gulp](https://gulpjs.com/) πŸ‘οΈ **export** configuration and definition of automation tasks. [Further info](https://www.sitepoint.com/introduction-gulp-js/) - * `CHANGELOG.md` β€” list of the notable changes in this project. - * `LICENSE` β€” Open source license of [Git](https://git-scm.com/) repository. It enables others to freely use, change and distribute the project in the repository. [Further info](https://help.github.com/articles/adding-a-license-to-a-repository/) - * `package.json` β€” [NPM](https://www.npmjs.com/) packages specifics. It lists the packages (with their versions) your project depends on. [Further info](https://docs.npmjs.com/files/package.json) - * `package-lock.json` β€” [NPM](https://www.npmjs.com/) manifest. Automatically generated with change of `node_modules` or `package.json` if working with NPM. Holds information about which versions of each dependency were installed in order to get consistent installs across machines. [Further info](https://docs.npmjs.com/files/package-lock.json) - * `README.md` β€” It’s me! - -## Workflow - -### Development - -Starts watchers, compilers etc., for development with hot-reload in the browser. - -1. Run development task - - ```bash - npm run dev - ``` - -2. Open Browser on URL `http://localhost:4000` or what you see in command-line. - -3. Modify files in `src` directory a sub-directories. - -4. Changes in the configuration files requires a restart. Stop dev task and run `npm run dev` again. - -### Production Build - -Produces optimized files in production quality. - -1. Run build task - - ```bash - npm run build - ``` - -2. See files in `build` directory. - -### Export Build - -Produces optimized and formated files with good readability of the code. - -1. Run build task - - ```bash - npm run export - ``` - -2. See files in `export` directory. - -## Updates from devstack to your existing project - -1. create a branch in your project’s repo (e.g. `devstack-update`) - - ```bash - git checkout -b devstack-update - ``` - -2. Add this Gulp DevStack as a remote to your project `devstack` - - ```bash - git remote add devstack git@github.com:cebreus/gulp-devstack.git - ``` - -3. Fetch remote - - ```bash - git fetch devstack - ``` - -4. Merge `devstack-update` to your branch (e.g. `master`) (use `--allow-unrelated-histories` if necessary) - - ```bash - git merge master - ``` - -5. solve eventual conflicts - -6. push the devstack-update branch - - ```bash - git push -u devstack-update - ``` - -7. create PR from `devstack-update` to your master - -## Inject devstack to your new project - -```bash -git remote add devstack git@github.com:cebreus/gulp-devstack.git -git fetch devstack -git merge devstack/master --squash --allow-unrelated-histories -git commit -m "feat: Gulp DevStack init" -git merge devstack/blankenize --squash --allow-unrelated-histories -X theirs -git commit -m "refactor: Gulp DevStack clean-up" +```text +β”œβ”€β”€ gulp/ # Modular task definitions & pipeline logic +β”œβ”€β”€ scripts/ # Release, lint wrapper, and hook support scripts +β”œβ”€β”€ src/ +β”‚ β”œβ”€β”€ assets/ # Global images, fonts, and icons +β”‚ β”œβ”€β”€ config/ # Centralized site metadata (site.js, env.js) +β”‚ β”œβ”€β”€ js/ # Global scripts bundled via esbuild +β”‚ β”œβ”€β”€ lib/ # Shared Nunjucks components & partials +β”‚ β”œβ”€β”€ routes/ # Source for pages (Routing & Content) +β”‚ └── scss/ # Global styles (Bootstrap 5.3 + Custom overrides) +β”œβ”€β”€ tests/ +β”‚ β”œβ”€β”€ unit/ # Pure logic testing +β”‚ β”œβ”€β”€ integration/ # Pipeline & Gulp task validation +β”‚ β”œβ”€β”€ e2e/ # Browser-based integrity & A11y checks +β”‚ └── visual/ # Cross-pipeline visual parity checks +β”œβ”€β”€ docs/ # Technical documentation +β”œβ”€β”€ memories/ # Agent-maintained project gotchas +└── graphify-out/ # Knowledge graph outputs ``` -Don't forget to customize for your project by replacing some strings or deleting files like in section "Optional clenup". - -## Roadmap and Known issues - -See the [open issues](https://github.com/cebreus/gulp-devstack/issues) for a list of proposed features (and known issues). - -## Contributing +## Advanced Commands -Contributions are what makes the open-source community such a fantastic place to learn, inspire, and create. Any contributions you make are **much appreciated**. - -1. Fork the Project -2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) -3. Commit your changes (\`git commit -m "feat: Add some AmazingFeature") -4. Push to the branch (`git push origin feature/AmazingFeature`) -5. Open a Pull Request +- `pnpm verify:pipeline` - The canonical CI/CD check. +- `pnpm test:ci` - Runs `test`, `test:smoke`, and `test:e2e`; requires a build artifact first. +- `pnpm test:visual` - Run visual regression tests. +- `pnpm run component` - Scaffold new Nunjucks/SCSS components via Plop. +- `graphify update .` - Refresh the local code graph after code changes. ## License -It is distributed under the MIT License. See `LICENSE` for more information. - -## Contact - -Jaroslav VrΓ‘na β€” , [web site](https://www.cebre.us/) - -Project Link: [github.com/cebreus/gulp-devstack](https://github.com/cebreus/gulp-devstack) +MIT - Developed by [Jaroslav Vrana](https://github.com/cebreus) diff --git a/commitlint.config.js b/commitlint.config.js index 7bf3352..125c05a 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1,4 +1,5 @@ -module.exports = { +// This configuration extends the conventional commit format. +export default { extends: ['@commitlint/config-conventional'], rules: { 'type-case': [2, 'always', ['camel-case', 'lower-case']], @@ -20,4 +21,4 @@ module.exports = { ], ], }, -}; +} diff --git a/content/pages/index.md b/content/pages/index.md deleted file mode 100644 index 4f404a2..0000000 --- a/content/pages/index.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -type: page -title_h1: -excerpt: -hero: - title: Build static sites, develop with live reload, export optimized sources - excerpt: Front-end Gulp stack based on Bootsrap for building optimized static pages and exports for collaboration between coders and programmers. - content: |- - - - Currently **v4.5.0**  Β·  All releases - - [![Codacy Badge](https://app.codacy.com/project/badge/Grade/16e0c62b123d4dbfb27c216f5107f464)](https://www.codacy.com/gh/cebreus/gulp-devstack/dashboard?utm_source=github.com\&utm_medium=referral\&utm_content=cebreus/gulp-devstack\&utm_campaign=Badge_Grade) - ![GitHub open issues](https://img.shields.io/github/issues/cebreus/gulp-devstack) - ![License](https://img.shields.io/github/license/cebreus/gulp-devstack) - - [![Build\&Deploy GitHub pages](https://github.com/cebreus/gulp-devstack/actions/workflows/github-pages-deploy-pnpm.yml/badge.svg)](https://github.com/cebreus/gulp-devstack/actions/workflows/github-pages-deploy-pnpm.yml) - [![Netlify](https://img.shields.io/netlify/80dd73b9-7dff-450b-a038-4fba020d577a)](https://app.netlify.com/sites/gulp-devstack/deploys) -entity_status: - date: 2020-02-01T11:00 - updated_at: 2021-11-21T12:00:00 - workflow_step: publish -seo: - title: Front-end Gulp DevStack - description: Gulp stack for building optimized static pages and exports for collaboration between coders and programmers. - robots: index,follow - canonical: 'https://gulp-devstack.cebre.us/' -open_graph: - use: true - type: website - title: '' - description: '' -twitter_cards: - use: true - title: '' - description: '' ---- - -## Typical use cases - -* **Developing** landing pages or prototypes (`npm run dev`). -* **Exporting** carefully compiled and formated files for collaboration (`npm run export`). -* **Building** the final (production) bundle, ready for deployment (`npm run deploy`). - -When you want to build whole web sites from the data sources as API or many markdown files, go with Static Page Generators (SGC). For example [Gridsome](https://gridsome.org/) (VueJS), [Gatsby](https://www.gatsbyjs.org/) (React) or [Hugo](https://gohugo.io/) (Go) will work for you much better. - -## Features - -* **SEO-friendly** β€” Open Graph and Twiter Cards markup, self/canonical. -* **User-friendly** β€” image optimizations, favicons, webmanifest and all sources minification to smallest bundle. -* **Developer-friendly** β€” [ESLint](https://eslint.org/), [Prettier](https://prettier.io/), [Remark](https://remark.js.org/), [Stylelint](https://stylelint.io/) via tasks or with [Husky](https://github.com/typicode/husky) and [Lint staged](https://github.com/okonet/lint-staged). -* Separate tasks for Development, Export and Build with automatic renaming and hashing all critical assets. -* Ready for implementation Git based CMS as [Tina CMS](https://tina.io/) or [Netlify CMS](https://www.netlifycms.org/) etc. β€” Front Matter (Markdown files metadata and content). -* HTML temlates uses [Nunjucks](https://mozilla.github.io/nunjucks/). Fully customisable [Bootstrap 5.3](https://getbootstrap.com/) extended with [BEM](https://en.bem.info/). JavaScript processed with [Babel](https://babeljs.io/) or injected from CDN or as static files. - -**Usefull scripts** - -* Deploy to FTP (`npm run deploy-ftp`) or Netlify etc. -* Validating output HTML (`npm run build:validate:html` or `npm run export:validate:html`). -* Listing all TODO’s (`npm run todo:show`). diff --git a/content/site.md b/content/site.md deleted file mode 100644 index 4de2903..0000000 --- a/content/site.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -type: settings -copyright: Code licensed MIT -baseUrl: https://gulp-devstack.cebre.us -meta: - lang: en - charset: utf-8 - author: humans.txt -seo: - title: π•Šπ•šπ•₯𝕖 SEO Title - description: π•Šπ•šπ•₯𝕖 SEO Description - robots: index,follow - canonical: https://gulp-devstack.cebre.us/ - iclude_to_sitemap: false -open_graph: - use: true - type: website - app_id: '' - site_name: Gulp DevStack - image: - - /assets/images/gulp-devstack-open-graph.png - image_text: π•Šπ•šπ•₯𝕖 Open Graph Image Text -twitter_cards: - use: false - type: summary_large_image - image: [] - site: '@cebreus69' - creator: '@cebreus69' ---- diff --git a/docs/COMPONENTS.md b/docs/COMPONENTS.md new file mode 100644 index 0000000..c6c0934 --- /dev/null +++ b/docs/COMPONENTS.md @@ -0,0 +1,94 @@ +# UI Components Architecture + +Gulp DevStack uses a **"Component-First"** approach for UI. This keeps your CSS and Nunjucks templates organized, scalable, and easy to reuse. Components are self-contained structural units stored in `src/lib/components/`. + +## 1. Core Principles + +- **Atomic Design**: We build small, isolated parts (atoms) and combine them into bigger ones (molecules). +- **BEM Naming**: We use **Block-Element-Modifier** to keep CSS class names clear and prevent global style leakage: + - `c-card`: The Block (Component Root) + - `c-card__title`: The Element (Child) + - `c-card--featured`: The Modifier (State/Variation) +- **JavaScript Isolation**: Component logic (`.js` files) **does not belong** in the component directory. To preserve esbuild's tree-shaking and performance, explicitly import and define your logic in `src/js/`. + +## 2. Component Generation CLI + +The safest and fastest way to create a component is via our Plop-powered CLI. + +```bash +pnpm run component +``` + +This generates a dedicated folder `src/lib/components/[name]/` containing: + +- `[name].njk`: The Nunjucks boilerplate. +- `[name].scss`: The scoped SCSS file using the `.c-[name]` BEM class. +- `[name].md`: API documentation and expected data contract. + +The generator does not automatically import the SCSS into a shared entrypoint. Wire shared component styles through `src/scss/components.scss`, or keep page-only styles beside the route under `src/routes/`. + +## 3. Integrating Components + +### SCSS Integration + +Component styles are emitted through the build pipeline, but not all into one catch-all bundle. + +- Global shared styles live in dedicated assets such as `bootstrap.css`, `custom.css`, and `components.css`. +- Route-local styles under `src/routes/` are compiled to matching route assets and injected only where needed. +- If a component needs a shared global stylesheet, register that explicitly in the Sass build plan instead of assuming everything lands in one `main.css`. + +### Nunjucks Integration + +There are two ways to use components in Nunjucks, depending on their complexity: + +**A. Standard Partials (Default)** + +For simple structural components generated by the CLI, use the `include` tag: + +```jinja +{% include "lib/components/hero/hero.njk" %} +``` + +**B. Nunjucks Macros (Advanced)** + +For components requiring strict parameters, type-safety, and complex logic (like cards or heroes), convert the partial into a `{% macro %}` and use the `import` tag: + +```jinja +{% from "lib/components/hero/hero.njk" import hero %} + +{{ hero(title="Welcome Home", badge="New") }} +``` + +**C. Content Injections (`call`)** + +When using macros, use the Nunjucks `call` block to pass complex HTML structures directly into the component's body (accessible via `caller()` inside the macro): + +```jinja +{% call hero(title="Interactive Hero") %} + +{% endcall %} +``` + +## 4. Implementation Best Practices + +- **Framework-First Strategy**: BEM is recommended for complex UI blocks, but it's not a strict requirement. You are encouraged to combine BEM with **Bootstrap 5 utility classes** (`d-flex`, `mt-3`, etc.) to avoid writing redundant CSS. +- **Don't Over-Engineer**: If a piece of UI is unique to a single page, keep it in the page template. Only extract to `src/lib/components/` if it will be reused. +- **Strict Defaults**: Use Nunjucks `default` filters (`{{ title | default("No Title") }}`) inside reusable macros when the missing-data fallback is intentional. Let required data fail loudly when a broken page should stop the build. +- **CMS Readiness**: When you isolate UI into components, you can easily map complex data from a Headless CMS (via `.md` frontmatter) straight into your Macros. This decoupling of data and presentation is what makes the project enterprise-ready. + +## Component List + +*(This section is automatically updated by `pnpm run component`. Do not remove the heading below.)* + +### favicons + +- **Path**: `src/lib/components/favicons` +- **Status**: System + +### meta-rich-snippets + +- **Path**: `src/lib/components/meta-rich-snippets` +- **Status**: System diff --git a/docs/NUNJUCKS-BLOCKS.md b/docs/NUNJUCKS-BLOCKS.md new file mode 100644 index 0000000..487310b --- /dev/null +++ b/docs/NUNJUCKS-BLOCKS.md @@ -0,0 +1,115 @@ +# Nunjucks Template Blocks + +Gulp DevStack uses a modular block system in `src/routes/layout-default.njk`. This lets individual pages extend one global HTML shell while overriding only the sections they need. + +## 0. Template Vocabulary + +Understanding the hierarchy of Nunjucks elements is key to mastering this architecture: + +- **Layout**: The top-level HTML wrapper (`layout-default.njk`). It defines the global structure and blocks. +- **Page**: The specific template (e.g., `index.njk`) or content source (`index.md`) that extends a Layout. +- **Block**: An overrideable placeholder defined in a Layout (e.g., `{% block content %}`). +- **Macro**: A reusable templating function (like a "Component function"), stored in `src/lib/components/`. +- **Component**: A modular UI element (e.g., Hero, Card) built using Nunjucks Macros for full reuse. + +## 1. Block Hierarchy + +### Direct Overrides (Common) + +These blocks are the most frequent targets for customization in your `.njk` templates. + +- `css`: External and route-specific styles. +- `content`: The primary content area. +- `js`: External and route-specific scripts. + +### Full Hierarchy (Default Layout) + +- `head_tag`: Entire `` container. + - `css`: Global and page styles. + - `head_custom`: Generic hook for custom scripts/styles. + - `meta_seo`: SEO metadata (via `seo.njk`). + - `favicons`: Favicons (via `favicons.njk`). +- `body`: Entire `` container. + - `header`: Optional page/header component. + - `main`: Wrapper for the central content. + - `content`: Rendered Markdown body. + - `footer`: Optional page/footer component. + - `js`: Global and page scripts. + - `scripts`: Custom inline scripts hook. + +## 2. Practical Usage + +### Overriding Content + +In `layout-default.njk`, the `content` block is nested inside `main`. Overriding it preserves the standard page structure: + +```nunjucks +{% extends "layout-default.njk" %} + +{% block header %} +
Custom Page Header
+{% endblock %} +``` + +```nunjucks +{% block content %} +
+

Coming Soon

+

Our site is under construction.

+
+{% endblock %} +``` + +### Extending a Block (`super()`) + +Use `{{ super() }}` to keep the original content and add more to it: + +```nunjucks +{% block css %} + {{ super() }} + +{% endblock %} +``` + +## 5. Macros & Advanced Templating + +Gulp DevStack utilizes Nunjucks `macro` calls with content blocks. For fundamental documentation, see the [Nunjucks Macro Guide](https://mozilla.github.io/nunjucks/templating.html#macro). + +### The Power of `{% call %}` + +The `call` tag is the equivalent of "children" or "slots" in modern frontend frameworks (React, Vue). It allows you to pass a full block of HTML into a macro: + +```nunjucks +{% from "components/example/example.njk" import example %} + +{% call example(title="Welcome Page", badge="Announcement") %} +
+ + +
+{% endcall %} +``` + +**Why it's beneficial**: Inside the component, the content above is rendered using `{{ caller() if caller }}`. This keeps the component logic clean while allowing the page to define its own complex layouts inside the macro. + +### Using `{% set %}` for Content Buffering + +Sometimes you need to prepare complex data or HTML snippets before passing them into a macro: + +```nunjucks +{% set custom_hero_description %} + Our project reached v5.0.0! Check out the documentation. +{% endset %} + +{{ example(description = custom_hero_description) }} +``` + +**Why it's beneficial**: It prevents template bloat and avoids messy string concatenations inside macro parameters. It keeps your templates readable and modular. + +--- + +## 6. Key Conventions + +- **`{{ super() }}`**: Appends content to an inherited block (common in `css` and `js` blocks). +- **Root Wrappers**: Following Nunjucks hierarchy, layouts serve as top-level wrappers. Individual pages populate pre-defined blocks without overriding the global HTML shell. +- **`layout-` Prefix**: Files with this prefix in `src/routes/` are internal templates and are excluded from the final routable HTML generation. diff --git a/docs/ROUTING.md b/docs/ROUTING.md new file mode 100644 index 0000000..3feb51f --- /dev/null +++ b/docs/ROUTING.md @@ -0,0 +1,84 @@ +# Page Routing & Layouts + +Gulp DevStack uses a **"File-Based Routing"** system combined with a hybrid Nunjucks/Markdown data architecture. This provides strict separation between presentation logic and content. + +## 1. How Routing Works + +Every routable `.njk` template in `src/routes/` deterministically maps to a public URL. Files named `layout-*.njk` are internal layout templates and are excluded from output. Markdown files provide page data and content; they do not produce HTML by themselves unless a matching `.njk` template renders them. + +| Source Files | Build Output | Final URL | +| :------------------------------------------------- | :------------------ | :------------- | +| `src/routes/index.njk` + optional `index.md` | `/index.html` | `/` (Homepage) | +| `src/routes/about/index.njk` + optional `index.md` | `/about/index.html` | `/about/` | +| `src/routes/404.njk` + optional `404.md` | `/404.html` | `/404.html` | + +> \[!TIP] +> Use `src/routes/404.njk` instead of `404/index.njk`. Most static hosting providers (Netlify, GitHub Pages) expect a top-level `404.html` file to act as the global error catch-all. + +## 2. Hybrid Pages (The Override Pattern) + +A single route can be composed of multiple files working together. Gulp DevStack supports an **"Override & Merge"** pattern: + +1. **`.njk` (Template)**: The primary presentation logic. It defines the structure and layout. +2. **`.md` (Data)**: The content source. +3. **Merge**: If both `index.njk` and `index.md` exist in the same folder, the `.njk` file is the routable template, and all data from the `.md` file (YAML frontmatter and content) is **automatically injected** into the Nunjucks context as `page`. + +This pattern is essential for "Headless CMS Readiness." You can keep your UI logic in `.njk` while a CMS writes data purely to `.md` files. + +## 3. Layout Injection + +Every page needs a layout (e.g., standard header and footer vs. a minimal error page). Layouts are stored in `src/routes/` and prefixed with `layout-` (e.g., `layout-default.njk`). + +To define or change a layout, use the native Nunjucks `extends` tag at the very top of your `.njk` route file: + +```jinja +{# src/routes/404.njk #} +{% extends "layout-default.njk" %} + +{% block content %} +
+

Page Not Found

+ Back to Home +
+{% endblock %} +``` + +## 4. Isolated Page Assets (Autodiscovery) + +To prevent global CSS/JS bundle bloat, you can isolate assets strictly to the pages that need them. The build pipeline automatically detects, compiles, and injects these assets based on the route structure. + +### File Naming Convention + +The system looks for assets in the same directory as your route template, matching either the **filename** or using the **index** convention: + +| Route Template | Detected Style | Detected Script | +| :---------------- | :------------------------------------ | :-------------------------------- | +| `about/index.njk` | `about/index.scss` | `about/index.js` | +| `404.njk` | `404.scss` | `404.js` | +| `blog/post.njk` | `blog/post.scss` OR `blog/index.scss` | `blog/post.js` OR `blog/index.js` | + +### How it Works + +1. **Detection**: During the build, Gulp scans `src/routes/` for `.scss` and `.js` files. +2. **Compilation**: These files are compiled into `build-*/assets/css/` and `build-*/assets/js/`, preserving the directory hierarchy in all pipelines. +3. **Injection**: The `processHtml` task identifies matching assets and injects them **only** into the specific page's `` (for CSS) and at the end of the `` (for JS). +4. **Linking Model**: Assets are linked as external `` and ``; - }, - }, - ), - ) - // Improve acessibility of basic tables - .pipe(replace(//g, '')) - // Remove multi/line comments - .pipe(replace(/( )*\n*/g, '')) - // Minify HTML - fix HTML structure like missng closing tags - .pipe( - minify({ - collapseWhitespace: true, - collapseBooleanAttributes: true, - }), - ) - .pipe( - gulpif( - renameCondition, - rename({ - dirname: '/', - basename: params.rename, - extname: '.html', - }), - ), - ) - .pipe(gulp.dest(params.output)) - .on('end', () => { - params.cb(); - }) - ); -}; - -module.exports = buildHtml; diff --git a/gulp-tasks-build/gulp-process-js.js b/gulp-tasks-build/gulp-process-js.js deleted file mode 100644 index f7cefad..0000000 --- a/gulp-tasks-build/gulp-process-js.js +++ /dev/null @@ -1,73 +0,0 @@ -const babel = require('gulp-babel'); -const gulp = require('gulp'); -const gulpConcat = require('gulp-concat'); -const gulpif = require('gulp-if'); -const log = require('fancy-log'); -const newer = require('gulp-newer'); -const plumber = require('gulp-plumber'); -const uglify = require('gulp-uglify'); - -/** - * Process JavaScript files. - * @param {string|string[]} input - The input file(s) or glob pattern(s). - * @param {string} output - The output directory. - * @param {object} [params] - Optional parameters. - * @param {Function} [params.cb] - Callback function to be executed after processing. - * @param {boolean} [params.rewriteExisting] - Whether to rewrite existing files. - * @param {boolean} [params.concatFiles] - Whether to concatenate files. - * @param {string} [params.outputConcatPrefixFileName] - The prefix for the concatenated output file name. - * @param {boolean} [params.verbose] - Whether to log verbose output. - * @returns {void} - The gulp stream. - * @throws {Error} - If the callback parameter is not a function. - */ -const processJs = (input, output, params = {}) => { - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - const rewriteExisting = !!( - params.rewriteExisting && - typeof params.rewriteExisting === 'boolean' && - params.rewriteExisting === true - ); - - const concatFiles = !!( - params.concatFiles && - typeof params.concatFiles === 'boolean' && - params.concatFiles === true - ); - - const outputConcatFileName = `${params.outputConcatPrefixFileName}.min.js`; - - return gulp - .src(input) - .pipe(plumber()) - .pipe(gulpif(!rewriteExisting, newer(output))) - .pipe( - babel({ - presets: [ - [ - '@babel/preset-env', - { - targets: { - browsers: ['last 2 versions'], - }, - }, - ], - ], - }), - ) - .pipe(uglify()) - .pipe(gulpif(concatFiles, gulpConcat(outputConcatFileName))) - .pipe(gulp.dest(output)) - .on('end', () => { - if (params.verbose) { - log(` JS files processed.`); - } - cb(); - }); -}; - -module.exports = processJs; diff --git a/gulp-tasks-build/gulp-purgecss.js b/gulp-tasks-build/gulp-purgecss.js deleted file mode 100644 index c8ddd95..0000000 --- a/gulp-tasks-build/gulp-purgecss.js +++ /dev/null @@ -1,53 +0,0 @@ -const gulp = require('gulp'); -const log = require('fancy-log'); -const plumber = require('gulp-plumber'); -const purgecss = require('gulp-purgecss'); - -/** - * Purges unused CSS from the input CSS file based on the selectors used in the input HTML file. - * @param {string} inputCss - The path to the input CSS file. - * @param {string} inputHtml - The path to the input HTML file. - * @param {string} outputCss - The path to the output CSS file. - * @param {object} [params] - Optional parameters. - * @param {Function} [params.cb] - The callback function to be executed after the purge is complete. - * @param {boolean} [params.verbose] - Whether to log verbose output. - * @throws {Error} If the callback in params is not a function. - * @returns {void} The gulp stream for further processing. - */ -const purgeCss = (inputCss, inputHtml, outputCss, params = {}) => { - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - return gulp - .src(inputCss) - .pipe(plumber()) - .pipe( - purgecss({ - content: inputHtml, - safelist: { - standard: [ - 'active', - 'collapsing', - 'fade', - 'offcanvas-backdrop', - 'open', - 'scroll', - 'show', - ], - }, - // rejected: true, - }), - ) - .pipe(gulp.dest(outputCss)) - .on('end', () => { - if (params.verbose) { - log(` PurgeCSS done.`); - } - cb(); - }); -}; - -module.exports = purgeCss; diff --git a/gulp-tasks-build/gulp-revision.js b/gulp-tasks-build/gulp-revision.js deleted file mode 100644 index 5f8ec93..0000000 --- a/gulp-tasks-build/gulp-revision.js +++ /dev/null @@ -1,54 +0,0 @@ -const gulp = require('gulp'); -const log = require('fancy-log'); -const revDelete = require('gulp-rev-delete-original'); -const revReplace = require('gulp-rev-replace'); -const revRewrite = require('gulp-rev-rewrite'); -const { loadPlugin } = require('../gulp-tasks/helpers'); - -/** - * Performs asset revisioning by adding unique hashes to the filenames and updating HTML references. - * @param {object} params - The parameters for the revision task. - * @param {Function} params.cb - The callback function to be executed after the revision task is complete. - * @param {string} params.inputRevision - The input path for the files to be revised. - * @param {string} params.outputRevision - The output path for the revised files. - * @param {string} params.ouputManifest - The output path for the manifest file. - * @param {string} params.inputRewrite - The input path for the files to be rewritten. - * @param {string} params.manifestFile - The path to the manifest file. - * @param {string} params.outputRewrite - The output path for the rewritten files. - * @param {boolean} params.verbose - Determines whether to log verbose output. - * @returns {void} - A stream representing the revision task. - * @throws {Error} - If the callback in params is not a function. - */ -const revision = async (params) => { - const rev = await loadPlugin('gulp-rev'); - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - return ( - gulp - .src(params.inputRevision) - .pipe(rev()) - .pipe(revReplace()) - .pipe(revDelete()) - .pipe(gulp.dest(params.outputRevision)) - .pipe(gulp.dest(params.ouputManifest)) - .pipe(gulp.src(params.inputRewrite)) - .pipe(revRewrite(params.manifestFile)) - .pipe(gulp.dest(params.outputRewrite)) - // .pipe(gulpBrotli()) - // .pipe(gulp.dest(params.outputRewrite)) - .on('end', () => { - if (params.verbose) { - log( - ` Unique asset hashes, updates HTML references, removes old hashes done.`, - ); - } - cb(); - }) - ); -}; - -module.exports = revision; diff --git a/gulp-tasks-build/gulp-sri-hash.js b/gulp-tasks-build/gulp-sri-hash.js deleted file mode 100644 index 3d607f3..0000000 --- a/gulp-tasks-build/gulp-sri-hash.js +++ /dev/null @@ -1,44 +0,0 @@ -const gulp = require('gulp'); -const log = require('fancy-log'); -const minify = require('gulp-htmlmin'); -const sri = require('gulp-sri-hash'); - -/** - * Generates SRI (Subresource Integrity) hashes for the files in the specified input directory and writes them to the output directory. - * @param {string} input - The input directory containing the files to generate SRI hashes for. - * @param {string} output - The output directory where the files with SRI hashes will be written. - * @param {object} [params] - Optional parameters. - * @param {Function} [params.cb] - A callback function to be executed after the SRI hashes are generated and written. - * @param {boolean} [params.verbose] - Specifies whether to log verbose output. - * @throws {Error} Throws an error if the callback in params is not a function. - * @returns {void} Returns a stream representing the Gulp task. - */ -const sriHash = (input, output, params = {}) => { - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - return ( - gulp - .src(input) - .pipe(sri()) - // Duplicate from `./gulp-html-build.js` because 'sri' converts `defer` to `defer=""` - .pipe( - minify({ - collapseWhitespace: true, - collapseBooleanAttributes: true, - }), - ) - .pipe(gulp.dest(output)) - .on('end', () => { - if (params.verbose) { - log(` SRI integrity hashes rewrite in ${output}`); - } - cb(); - }) - ); -}; - -module.exports = sriHash; diff --git a/gulp-tasks-export/gulp-compile-sass.js b/gulp-tasks-export/gulp-compile-sass.js deleted file mode 100644 index f00cf68..0000000 --- a/gulp-tasks-export/gulp-compile-sass.js +++ /dev/null @@ -1,58 +0,0 @@ -const gulp = require('gulp'); -const gulpConcat = require('gulp-concat'); -const gulpEmptyPipe = require('gulp-empty-pipe'); -const log = require('fancy-log'); -const plumber = require('gulp-plumber'); -const postcss = require('gulp-postcss'); -const postcssSyntax = require('postcss-scss'); -const prettify = require('gulp-jsbeautifier'); -const replace = require('gulp-replace'); -const sass = require('gulp-sass')(require('sass')); -const sassGlob = require('gulp-sass-glob'); - -/** - * Compiles Sass files and performs additional transformations. - * @param {string} input - The input file or glob pattern. - * @param {string} output - The output directory. - * @param {string} outputConcatFileName - The name of the concatenated output file (optional). - * @param {Array} postcssPluginsBase - An array of PostCSS plugins to apply. - * @param {object} params - Additional parameters (optional). - * @param {Function} params.cb - A callback function to execute after compilation. - * @returns {object} - A Gulp stream representing the compilation process. - */ -const compileSass = ( - input, - output, - outputConcatFileName, - postcssPluginsBase, - params = {}, -) => { - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - const processFile = outputConcatFileName ? gulpConcat : gulpEmptyPipe; - - return gulp - .src(input) - .pipe(plumber()) - .pipe(sassGlob()) - .pipe(sass()) - .on('error', sass.logError) - .pipe(replace(/\/\*!/g, '/*')) - .pipe(replace('@charset "UTF-8";', '')) - .pipe(postcss(postcssPluginsBase, { syntax: postcssSyntax })) - .pipe(prettify({ indent_size: 4 })) - .pipe(processFile(outputConcatFileName)) - .pipe(gulp.dest(output)) - .on('end', () => { - if (params.verbose) { - log(` SASS processed`); - } - cb(); - }); -}; - -module.exports = compileSass; diff --git a/gulp-tasks-export/gulp-html-build.js b/gulp-tasks-export/gulp-html-build.js deleted file mode 100644 index c297493..0000000 --- a/gulp-tasks-export/gulp-html-build.js +++ /dev/null @@ -1,237 +0,0 @@ -const data = require('gulp-data'); -const dateFilter = require('nunjucks-date-filter-locale'); -const fs = require('fs'); -const gulp = require('gulp'); -const gulpif = require('gulp-if'); -const inject = require('gulp-inject'); -const log = require('fancy-log'); -const markdown = require('nunjucks-markdown-filter'); -const minify = require('gulp-htmlmin'); -const nunjucksRender = require('gulp-nunjucks-render'); -const plumber = require('gulp-plumber'); -const prettify = require('gulp-html-beautify'); -const rename = require('gulp-rename'); -const replace = require('gulp-replace'); -require('dotenv').config(); - -/** - * Builds HTML files based on the provided parameters. - * @param {object} params - The build parameters. - * @param {string} params.siteConfig - The path to the site configuration file. - * @param {string|string[]} params.dataSource - The path(s) to the data source file(s). - * @param {string} params.templates - The path to the templates directory. - * @param {string} params.input - The input file(s) to process. - * @param {string} params.rename - The new name for the output file(s). - * @param {string} params.output - The output directory for the processed files. - * @param {Function} params.cb - The callback function to execute after the build is complete. - * @param {string[]} params.injectCss - The CSS files to inject into the HTML. - * @param {string} params.injectIgnorePath - The path to ignore when injecting CSS files. - * @param {string[]} params.injectCdnJs - The CDN URLs for JavaScript files to inject into the HTML. - * @param {string[]} params.injectJs - The local JavaScript files to inject into the HTML. - * @param {string[]} params.processPaths - The paths to process during rendering. - * @returns {void} - The stream of processed HTML files. - */ -const buildHtml = (params) => { - // eslint-disable-next-line global-require, import/no-dynamic-require - const localeSettings = require(`.${params.siteConfig}`); - const renameCondition = !!params.rename; - dateFilter.setLocale(localeSettings.meta.lang); - let currentFile = ''; - let existsJson = false; - let findJson = true; - let oldDataSource = ''; - - if (params.dataSource.includes('.json')) { - if (typeof params.dataSource !== 'object') { - params.dataSource = [params.dataSource]; - } - - params.dataSource.forEach((element) => { - try { - fs.accessSync(element); - existsJson = true; - findJson = false; - } catch (error) { - log.error(`buildHtml(): JSON file ${element} doesn't exists.`); - existsJson = false; - findJson = false; - } - }); - } - - nunjucksRender.nunjucks.configure(params.templates, { - watch: false, - lstripBlocks: true, - throwOnUndefined: true, - trimBlocks: true, - stream: true, - }); - - return ( - gulp - .src(params.input) - .pipe(plumber()) - .pipe( - rename((path) => { - currentFile = path; - if (currentFile.dirname !== '.') { - const file = JSON.parse( - fs.readFileSync( - `${process.cwd()}/${params.dataSource}/${ - currentFile.dirname - }.json`, - 'utf8', - ), - ); - oldDataSource = currentFile.dirname; - if (file.seo.slug) { - currentFile.dirname = file.seo.slug; - } - } - }), - ) - // Add access to site configuration - .pipe( - data(() => { - let file = params.siteConfig; - file = { - SITE: { - ...JSON.parse(fs.readFileSync(file)), - }, - }; - return file; - }), - ) - .pipe( - gulpif( - existsJson, - data(() => { - let file; - params.dataSource.forEach((element) => { - file = { - ...file, - ...JSON.parse(fs.readFileSync(element)), - }; - }); - return file; - }), - ), - ) - .pipe( - gulpif( - findJson, - data(() => { - if (currentFile.dirname === '.') { - return JSON.parse( - fs.readFileSync( - `${process.cwd()}/${params.dataSource}/index.json`, - ), - ); - } - const file = JSON.parse( - fs.readFileSync( - `${process.cwd()}/${params.dataSource}/${oldDataSource}.json`, - ), - ); - return file; - }), - ), - ) - .pipe( - nunjucksRender({ - data: { SOURCE: process.env.SOURCE }, - path: params.processPaths, - manageEnv: (enviroment) => { - enviroment.addFilter('date', dateFilter); - enviroment.addFilter('md', markdown); - enviroment.addFilter( - 'unique', - (arr) => - (arr instanceof Array && - arr.filter((e, i, arr1) => arr1.indexOf(e) === i)) || - arr, - ); - enviroment.addGlobal('toDate', (date) => { - return date ? new Date(date) : new Date(); - }); - }, - }), - ) - .pipe( - inject( - gulp.src(params.injectCss, { - read: false, - }), - { - relative: false, - ignorePath: params.injectIgnorePath, - addRootSlash: true, - removeTags: true, - quiet: true, - }, - ), - ) - // Allows content of 'export' dir to place in any depth of dirs on the server/domain - .pipe(replace(/(href=["'])(\/assets)/g, '$1.$2')) - .pipe( - replace( - '', - params.injectCdnJs.toString().replace(/[, ]+/g, ' '), - ), - ) - .pipe( - inject( - gulp.src(params.injectJs, { - read: false, - }), - { - relative: false, - ignorePath: params.injectIgnorePath, - addRootSlash: true, - removeTags: true, - transform(filepath) { - // Performance optimisation on local JS libraries on end of - // `.` allows content of 'export' dir to place in any depth of dirs on the server/domain - return ``; - }, - }, - ), - ) - // Improve acessibility of basic tables - .pipe(replace(//g, '')) - // Remove multi/line comments - .pipe(replace(/( )*\n*/g, '')) - // Minify HTML - fix HTML structure like missng closing tags - .pipe( - minify({ - collapseWhitespace: true, - collapseBooleanAttributes: true, - }), - ) - // Beautify HTML - .pipe( - prettify({ - indentSize: 4, - indent_char: ' ', - indent_with_tabs: false, - preserve_newlines: false, - }), - ) - .pipe( - gulpif( - renameCondition, - rename({ - dirname: '/', - basename: params.rename, - extname: '.html', - }), - ), - ) - .pipe(gulp.dest(params.output)) - .on('end', () => { - params.cb(); - }) - ); -}; - -module.exports = buildHtml; diff --git a/gulp-tasks-export/gulp-process-js.js b/gulp-tasks-export/gulp-process-js.js deleted file mode 100644 index f8983c1..0000000 --- a/gulp-tasks-export/gulp-process-js.js +++ /dev/null @@ -1,72 +0,0 @@ -const babel = require('gulp-babel'); -const gulp = require('gulp'); -const gulpConcat = require('gulp-concat'); -const gulpif = require('gulp-if'); -const log = require('fancy-log'); -const newer = require('gulp-newer'); -const plumber = require('gulp-plumber'); -const uglify = require('gulp-uglify'); -/** - * Process JavaScript files. - * @param {string|string[]} input - The input file(s) or glob pattern(s). - * @param {string} output - The output directory. - * @param {object} [params] - Optional parameters. - * @param {Function} [params.cb] - Callback function to be executed after processing. - * @param {boolean} [params.rewriteExisting] - Whether to rewrite existing files. - * @param {boolean} [params.concatFiles] - Whether to concatenate files. - * @param {string} [params.outputConcatPrefixFileName] - The prefix for the concatenated output file name. - * @param {boolean} [params.verbose] - Whether to log verbose output. - * @returns {void} - The gulp stream. - * @throws {Error} - If the callback parameter is not a function. - */ -const processJs = (input, output, params = {}) => { - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - const rewriteExisting = !!( - params.rewriteExisting && - typeof params.rewriteExisting === 'boolean' && - params.rewriteExisting === true - ); - - const concatFiles = !!( - params.concatFiles && - typeof params.concatFiles === 'boolean' && - params.concatFiles === true - ); - - const outputConcatFileName = `${params.outputConcatPrefixFileName}.min.js`; - - return gulp - .src(input) - .pipe(plumber()) - .pipe(gulpif(!rewriteExisting, newer(output))) - .pipe( - babel({ - presets: [ - [ - '@babel/preset-env', - { - targets: { - browsers: ['last 2 versions'], - }, - }, - ], - ], - }), - ) - .pipe(uglify()) - .pipe(gulpif(concatFiles, gulpConcat(outputConcatFileName))) - .pipe(gulp.dest(output)) - .on('end', () => { - if (params.verbose) { - log(` JS files processed.`); - } - cb(); - }); -}; - -module.exports = processJs; diff --git a/gulp-tasks/gulp-clean.js b/gulp-tasks/gulp-clean.js deleted file mode 100644 index 49d5813..0000000 --- a/gulp-tasks/gulp-clean.js +++ /dev/null @@ -1,34 +0,0 @@ -const gulp = require('gulp'); -const gulpClean = require('gulp-clean'); -const log = require('fancy-log'); -const plumber = require('gulp-plumber'); - -/** - * Cleans the specified input files or directories. - * @param {string|string[]} input - The file(s) or directory(s) to clean. - * @param {object} [params] - Optional parameters. - * @param {Function} [params.cb] - The callback function to be called after cleaning is complete. - * @param {boolean} [params.verbose] - Whether to log verbose output. - * @returns {void} - * @throws {Error} If the callback in params is not a function. - */ -const clean = (input, params = {}) => { - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - return gulp - .src(input, { read: false, allowEmpty: true }) - .pipe(plumber()) - .pipe(gulpClean()) - .on('end', () => { - if (params.verbose) { - log(` Files in '${input}' deleted.`); - } - cb(); - }); -}; - -module.exports = clean; diff --git a/gulp-tasks/gulp-compile-sass.js b/gulp-tasks/gulp-compile-sass.js deleted file mode 100644 index fddd882..0000000 --- a/gulp-tasks/gulp-compile-sass.js +++ /dev/null @@ -1,59 +0,0 @@ -const gulp = require('gulp'); -const gulpConcat = require('gulp-concat'); -const gulpEmptyPipe = require('gulp-empty-pipe'); -const log = require('fancy-log'); -const plumber = require('gulp-plumber'); -const postcss = require('gulp-postcss'); -const postcssSyntax = require('postcss-scss'); -const prettify = require('gulp-jsbeautifier'); -const replace = require('gulp-replace'); -const sass = require('gulp-sass')(require('sass')); -const sassGlob = require('gulp-sass-glob'); - -/** - * Compiles Sass files and performs additional processing. - * @param {string} input - The input file or glob pattern. - * @param {string} output - The output directory. - * @param {string} outputConcatFileName - The name of the concatenated output file (optional). - * @param {Array} postcssPluginsBase - An array of PostCSS plugins to apply. - * @param {object} params - Additional parameters (optional). - * @param {Function} params.cb - Callback function to execute after processing (optional). - * @param {boolean} params.verbose - Whether to log verbose output (optional). - * @returns {object} - The Gulp stream. - * @throws {Error} - If the callback in params is not a function. - */ -const compileSass = ( - input, - output, - outputConcatFileName, - postcssPluginsBase, - params = {}, -) => { - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - const processFile = outputConcatFileName ? gulpConcat : gulpEmptyPipe; - - return gulp - .src(input) - .pipe(plumber()) - .pipe(sassGlob()) - .pipe(sass()) - .on('error', sass.logError) - .pipe(replace('@charset "UTF-8";', '')) - .pipe(postcss(postcssPluginsBase, { syntax: postcssSyntax })) - .pipe(prettify({ indent_size: 4 })) - .pipe(processFile(outputConcatFileName)) - .pipe(gulp.dest(output)) - .on('end', () => { - if (params.verbose) { - log(` SASS processed`); - } - cb(); - }); -}; - -module.exports = compileSass; diff --git a/gulp-tasks/gulp-copy-static.js b/gulp-tasks/gulp-copy-static.js deleted file mode 100644 index b550a35..0000000 --- a/gulp-tasks/gulp-copy-static.js +++ /dev/null @@ -1,35 +0,0 @@ -const gulp = require('gulp'); -const log = require('fancy-log'); -const plumber = require('gulp-plumber'); - -/** - * Copies files from the specified input path to the output path. - * @param {string|string[]} input - The path or an array of paths to the files to be copied. - * @param {string} basePath - The base path for the input files. - * @param {string} output - The path to copy the files to. - * @param {object} [params] - Additional parameters. - * @param {Function} [params.cb] - The callback function to be executed after the files are copied. - * @param {boolean} [params.verbose] - Whether to log verbose output. - * @throws {Error} If the callback in params is not a function. - * @returns {void} A Node.js ReadWriteStream representing the copy operation. - */ -const copy = (input, basePath, output, params = {}) => { - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - return gulp - .src(input, { base: basePath }) - .pipe(plumber()) - .pipe(gulp.dest(output)) - .on('end', () => { - if (params.verbose) { - log(` Copied files from '${input}' to '${output}'`); - } - cb(); - }); -}; - -module.exports = copy; diff --git a/gulp-tasks/gulp-dataset-prepare.js b/gulp-tasks/gulp-dataset-prepare.js deleted file mode 100644 index ed4d8f2..0000000 --- a/gulp-tasks/gulp-dataset-prepare.js +++ /dev/null @@ -1,64 +0,0 @@ -const { marked } = require('marked'); -const gulp = require('gulp'); -const log = require('fancy-log'); -const markdownToJSON = require('gulp-markdown-to-json'); -const plumber = require('gulp-plumber'); -const rename = require('gulp-rename'); -const through2 = require('through2'); - -marked.setOptions({ - mangle: false, - headerIds: false, -}); - -/** - * Prepares a dataset by converting Markdown files to JSON format and saving them to the specified output directory. - * @param {string|string[]} input - The input file(s) or glob pattern(s) to be processed. - * @param {string} output - The output directory where the converted JSON files will be saved. - * @param {object} [params] - Optional parameters. - * @param {boolean} [params.verbose] - Whether to log verbose output. - * @param {Function} params.cb - Callback function to be called after the dataset preparation is complete. - * @returns {void} - A Node.js ReadWriteStream representing the dataset preparation process. - */ -const datasetPrepare = (input, output, params = {}) => { - const files = []; - - return gulp - .src(input) - .pipe(plumber()) - .pipe(markdownToJSON(marked)) - .pipe( - rename((path) => { - if (path.dirname === '.' && path.basename === 'index') { - return { - basename: path.basename, - dirname: '/', - extname: '.json', - }; - } - if (path.dirname !== '.') { - return { - basename: path.dirname, - dirname: '/', - extname: '.json', - }; - } - return ''; - }), - ) - .pipe(gulp.dest(output)) - .pipe( - through2.obj((file, enc, cb) => { - files.push(file.path); - cb(); - }), - ) - .on('end', () => { - if (params.verbose) { - log(` ${files.length} JSON written`); - } - params.cb(); - }); -}; - -module.exports = datasetPrepare; diff --git a/gulp-tasks/gulp-deploy-ftp.js b/gulp-tasks/gulp-deploy-ftp.js deleted file mode 100644 index f21e55f..0000000 --- a/gulp-tasks/gulp-deploy-ftp.js +++ /dev/null @@ -1,44 +0,0 @@ -const ftp = require('vinyl-ftp'); -const gulp = require('gulp'); -const log = require('fancy-log'); -require('dotenv').config(); - -/** - * Deploys files to an FTP server. - * @param {string|string[]} input - The file(s) or glob pattern(s) to deploy. - * @param {string} basePath - The base path for the file(s) to deploy. - * @param {string} output - The destination path on the FTP server. - * @param {object} [params] - Additional parameters. - * @param {Function} [params.cb] - The callback function to execute after deployment. - * @param {boolean} [params.verbose] - Whether to log verbose output. - * @throws {Error} If the callback in params is not a function. - * @returns {void} A readable and writable stream. - */ -const deployFtp = (input, basePath, output, params = {}) => { - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - const conn = ftp.create({ - host: process.env.FTP_HOST, - user: process.env.FTP_USER, - password: process.env.FTP_PASSWORD, - parallel: 10, - log, - }); - - return gulp - .src(input, { basePath, buffer: false }) - .pipe(conn.newer(input)) - .pipe(conn.dest(output)) - .on('end', () => { - if (params.verbose) { - log(` Done upload to FTP from '${input}' to '${output}'`); - } - cb(); - }); -}; - -module.exports = deployFtp; diff --git a/gulp-tasks/gulp-favicons.js b/gulp-tasks/gulp-favicons.js deleted file mode 100644 index fd52b60..0000000 --- a/gulp-tasks/gulp-favicons.js +++ /dev/null @@ -1,36 +0,0 @@ -const gulp = require('gulp'); -const log = require('fancy-log'); -const { loadPlugin } = require('./helpers'); - -/** - * Generates favicons using the specified input, output, and parameters. - * @param {string} input - The input source for generating favicons. - * @param {string} output - The output directory for the generated favicons. - * @param {object} params - Additional parameters for generating favicons. - * @param {Function} params.cb - Optional callback function to be executed after generating favicons. - * @param {object} params.config - Configuration options for generating favicons. - * @param {boolean} params.verbose - Flag indicating whether to log verbose output. - * @returns {Promise} A promise that resolves when the favicons are generated. - * @throws {Error} If the callback in params is not a function. - */ -const iconGenerator = async (input, output, params) => { - const favicons = await loadPlugin('gulp-favicons'); - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - return gulp - .src(input) - .pipe(favicons(params.config)) - .pipe(gulp.dest(output)) - .on('end', () => { - if (params.verbose) { - log(` Favicons created`); - } - cb(); - }); -}; - -module.exports = iconGenerator; diff --git a/gulp-tasks/gulp-font-load.js b/gulp-tasks/gulp-font-load.js deleted file mode 100644 index 0eb6c9d..0000000 --- a/gulp-tasks/gulp-font-load.js +++ /dev/null @@ -1,35 +0,0 @@ -const googleWebFonts = require('gulp-google-webfonts'); -const gulp = require('gulp'); -const log = require('fancy-log'); - -/** - * Loads fonts from the specified input directory, processes them, and saves them to the output directory. - * @param {string} input - The input directory path where the fonts are located. - * @param {string} output - The output directory path where the processed fonts will be saved. - * @param {object} params - Additional parameters for font loading. - * @param {Function} params.cb - Optional callback function to be called after the fonts are processed. - * @param {boolean} params.verbose - Optional flag to enable verbose logging. - * @param {object} params.config - Configuration options for the font loading process. - * @returns {void} - A stream representing the font loading process. - * @throws {Error} - If the callback in params is not a function. - */ -const fontLoad = (input, output, params) => { - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - return gulp - .src(input) - .pipe(googleWebFonts(params.config)) - .pipe(gulp.dest(output)) - .on('end', () => { - if (params.verbose) { - log(' Font processed'); - } - cb(); - }); -}; - -module.exports = fontLoad; diff --git a/gulp-tasks/gulp-hotreload.js b/gulp-tasks/gulp-hotreload.js deleted file mode 100644 index 2a539b1..0000000 --- a/gulp-tasks/gulp-hotreload.js +++ /dev/null @@ -1,43 +0,0 @@ -const browsersync = require('browser-sync').create(); -const config = require('../gulpconfig'); - -/** - *Initialize BrowserSync with given configuration - */ -function browserSync() { - browsersync.init({ - server: { - baseDir: config.buildBase, - }, - port: 4000, - notify: false, - open: false, - }); -} - -/** - * Reloads the browser using BrowserSync. - * @param {Function} done - The callback function to be called when the browser is reloaded. - */ - -/** - * - * @param done - */ -function browserSyncRefresh(done) { - browsersync.reload(); - done(); -} - -/** - * Reload BrowserSync - */ - -/** - * - */ -function browserSyncReload() { - browsersync.reload(); -} - -module.exports = { browserSync, browserSyncRefresh, browserSyncReload }; diff --git a/gulp-tasks/gulp-html-build.js b/gulp-tasks/gulp-html-build.js deleted file mode 100644 index a218ce5..0000000 --- a/gulp-tasks/gulp-html-build.js +++ /dev/null @@ -1,225 +0,0 @@ -const data = require('gulp-data'); -const dateFilter = require('nunjucks-date-filter-locale'); -const fs = require('fs'); -const gulp = require('gulp'); -const gulpif = require('gulp-if'); -const inject = require('gulp-inject'); -const log = require('fancy-log'); -const markdown = require('nunjucks-markdown-filter'); -const nunjucksRender = require('gulp-nunjucks-render'); -const plumber = require('gulp-plumber'); -const prettify = require('gulp-html-beautify'); -const rename = require('gulp-rename'); -const replace = require('gulp-replace'); -require('dotenv').config(); - -/** - * Builds HTML files based on the provided parameters. - * @param {object} params - The build parameters. - * @param {string} params.siteConfig - The path to the site configuration file. - * @param {string|string[]} params.dataSource - The path(s) to the data source file(s). - * @param {string} params.templates - The path to the templates directory. - * @param {string} params.input - The input file(s) to process. - * @param {string} params.rename - The new name for the output file(s). - * @param {string} params.output - The output directory for the processed files. - * @param {Function} params.cb - The callback function to execute after the build is complete. - * @param {string[]} params.injectCss - The CSS files to inject into the HTML. - * @param {string} params.injectIgnorePath - The path to ignore when injecting CSS files. - * @param {string[]} params.injectCdnJs - The CDN URLs for JavaScript files to inject into the HTML. - * @param {string[]} params.injectJs - The local JavaScript files to inject into the HTML. - * @param {string[]} params.processPaths - The paths to process during rendering. - * @returns {void} - The stream of processed HTML files. - */ -const buildHtml = (params) => { - // eslint-disable-next-line global-require, import/no-dynamic-require - const localeSettings = require(`.${params.siteConfig}`); - const renameCondition = !!params.rename; - dateFilter.setLocale(localeSettings.meta.lang); - let currentFile = ''; - let existsJson = false; - let findJson = true; - let oldDataSource = ''; - - if (params.dataSource.includes('.json')) { - if (typeof params.dataSource !== 'object') { - params.dataSource = [params.dataSource]; - } - - params.dataSource.forEach((element) => { - try { - fs.accessSync(element); - existsJson = true; - findJson = false; - } catch (error) { - log.error(`buildHtml(): JSON file ${element} doesn't exists.`); - existsJson = false; - findJson = false; - } - }); - } - - nunjucksRender.nunjucks.configure(params.templates, { - watch: false, - lstripBlocks: true, - throwOnUndefined: true, - trimBlocks: true, - stream: true, - }); - - return ( - gulp - .src(params.input) - .pipe(plumber()) - .pipe( - rename((path) => { - currentFile = path; - if (currentFile.dirname !== '.') { - const file = JSON.parse( - fs.readFileSync( - `${process.cwd()}/${params.dataSource}/${ - currentFile.dirname - }.json`, - 'utf8', - ), - ); - oldDataSource = currentFile.dirname; - if (file.seo.slug) { - currentFile.dirname = file.seo.slug; - } - } - }), - ) - // Add access to site configuration - .pipe( - data(() => { - let file = params.siteConfig; - file = { - SITE: { - ...JSON.parse(fs.readFileSync(file)), - }, - }; - return file; - }), - ) - .pipe( - gulpif( - existsJson, - data(() => { - let file; - params.dataSource.forEach((element) => { - file = { - ...file, - ...JSON.parse(fs.readFileSync(element)), - }; - }); - return file; - }), - ), - ) - .pipe( - gulpif( - findJson, - data(() => { - if (currentFile.dirname === '.') { - return JSON.parse( - fs.readFileSync( - `${process.cwd()}/${params.dataSource}/index.json`, - ), - ); - } - const file = JSON.parse( - fs.readFileSync( - `${process.cwd()}/${params.dataSource}/${oldDataSource}.json`, - ), - ); - return file; - }), - ), - ) - .pipe( - nunjucksRender({ - data: { SOURCE: process.env.SOURCE }, - path: params.processPaths, - manageEnv: (enviroment) => { - enviroment.addFilter('date', dateFilter); - enviroment.addFilter('md', markdown); - enviroment.addFilter( - 'unique', - (arr) => - (arr instanceof Array && - arr.filter((e, i, arr1) => arr1.indexOf(e) === i)) || - arr, - ); - enviroment.addGlobal('toDate', (date) => { - return date ? new Date(date) : new Date(); - }); - }, - }), - ) - .pipe( - inject( - gulp.src(params.injectCss, { - read: false, - }), - { - relative: false, - ignorePath: params.injectIgnorePath, - addRootSlash: true, - removeTags: true, - quiet: false, - }, - ), - ) - .pipe( - replace( - '', - params.injectCdnJs.toString().replace(/[, ]+/g, ' '), - ), - ) - .pipe( - inject( - gulp.src(params.injectJs, { - read: false, - }), - { - relative: false, - ignorePath: params.injectIgnorePath, - addRootSlash: true, - removeTags: true, - transform(filepath) { - // Performance optimisation on local JS libraries on end of - return ``; - }, - }, - ), - ) - // Improve acessibility of basic tables - .pipe(replace(//g, '')) - // Remove multi/line comments - .pipe(replace(/( )*\n*/g, '')) - .pipe( - prettify({ - indentSize: 4, - indent_char: ' ', - indent_with_tabs: false, - preserve_newlines: false, - }), - ) - .pipe( - gulpif( - renameCondition, - rename({ - dirname: '/', - basename: params.rename, - extname: '.html', - }), - ), - ) - .pipe(gulp.dest(params.output)) - .on('end', () => { - params.cb(); - }) - ); -}; - -module.exports = buildHtml; diff --git a/gulp-tasks/gulp-html-validate.js b/gulp-tasks/gulp-html-validate.js deleted file mode 100644 index c9ddfd1..0000000 --- a/gulp-tasks/gulp-html-validate.js +++ /dev/null @@ -1,34 +0,0 @@ -const gulp = require('gulp'); -const log = require('fancy-log'); -const validate = require('gulp-html-validate'); - -/** - * Validates HTML files using gulp-html-validate. - * @param {string|string[]} input - The file path(s) or glob pattern(s) of the HTML file(s) to validate. - * @param {object} params - Additional parameters for customization. - * @param {Function} params.cb - Callback function to execute after the validation is complete. - * @param {boolean} params.verbose - Whether to log verbose output. - * @throws {Error} If the callback in params is not a function. - * @returns {void} - */ -const htmlValidate = (input, params) => { - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - return gulp - .src(input) - .pipe(validate()) - .pipe(validate.format()) - .pipe(validate.failAfterError()) - .on('end', () => { - if (params.verbose) { - log(` HTML validation in ${input}`); - } - cb(); - }); -}; - -module.exports = htmlValidate; diff --git a/gulp-tasks/gulp-optimize-images.js b/gulp-tasks/gulp-optimize-images.js deleted file mode 100644 index 20d1cc2..0000000 --- a/gulp-tasks/gulp-optimize-images.js +++ /dev/null @@ -1,106 +0,0 @@ -const gulp = require('gulp'); -const gulpif = require('gulp-if'); -const log = require('fancy-log'); -const newer = require('gulp-newer'); -const plumber = require('gulp-plumber'); -const upng = require('gulp-upng'); -const { loadPlugin } = require('./helpers'); - -/** - * Process images using gulp-imagemin plugin. - * @param {string} input - The input path or glob pattern for the images. - * @param {string} output - The output path for the optimized images. - * @param {Array} plugins - An array of imagemin plugins to use for optimization. - * @param {object} [params] - Additional parameters for customization. - * @param {boolean} [params.rewriteExisting] - Whether to rewrite existing images. - * @param {boolean} [params.verbose] - Whether to log verbose output. - * @param {Function} params.cb - Callback function to execute after processing images. - * @returns {void} - */ -async function processImages(input, output, plugins, params = {}) { - const imagemin = await loadPlugin('gulp-imagemin'); - - const rewriteExisting = !!( - params.rewriteExisting && - typeof params.rewriteExisting === 'boolean' && - params.rewriteExisting === true - ); - - if (params.verbose) { - log(`🟑🟑🟑 Start: ${output}`); - } - - gulp - .src(input) - .pipe(plumber()) - .pipe(gulpif(!rewriteExisting, newer(output))) - .pipe(imagemin(plugins)) - .pipe(gulp.dest(output)) - .on('end', () => { - if (params.verbose) { - log(`🟑🟑🟑 End: ${output}`); - } - params.cb(); - }); -} - -const optimizeJpg = async (input, output, params = {}) => { - const mozjpeg = await loadPlugin('imagemin-mozjpeg'); - const plugins = [ - mozjpeg({ - quantTable: 3, - dcScanOpt: 2, - }), - ]; - await processImages(input, output, plugins, params); -}; - -const optimizePng = (input, output, params = {}) => { - const rewriteExisting = !!( - params.rewriteExisting && - typeof params.rewriteExisting === 'boolean' && - params.rewriteExisting === true - ); - - if (params.verbose) { - log(` 🟑🟑 Start: ${output}/*.png`); - } - - gulp - .src(input) - .pipe(plumber()) - .pipe(gulpif(!rewriteExisting, newer(output))) - .pipe(upng({})) - .pipe(gulp.dest(output)) - .on('end', () => { - if (params.verbose) { - log(` 🟑🟑 End: ${output}/*.png`); - } - params.cb(); - }); -}; - -const optimizeSvg = async (input, output, params = {}) => { - const svgo = await loadPlugin('imagemin-svgo'); - const plugins = [ - svgo({ - plugins: [ - { - name: 'removeViewBox', - active: false, - }, - { - name: 'collapseGroups', - active: true, - }, - ], - }), - ]; - await processImages(input, output, plugins, params); -}; - -module.exports = { - optimizeJpg, - optimizePng, - optimizeSvg, -}; diff --git a/gulp-tasks/gulp-todo.js b/gulp-tasks/gulp-todo.js deleted file mode 100644 index 037928c..0000000 --- a/gulp-tasks/gulp-todo.js +++ /dev/null @@ -1,67 +0,0 @@ -const { exec } = require('child_process'); -const fs = require('fs'); -const gulp = require('gulp'); -const log = require('fancy-log'); -const replace = require('gulp-replace'); -const through2 = require('through2'); -const todo = require('gulp-todo'); - -/** - * Builds a TODO.md file by scanning JavaScript, CSS, SCSS, and Markdown files for TODO comments. - * @param {object} params - Optional parameters for the buildTodo function. - * @param {Function} params.cb - Callback function to be executed after the TODO file is created. - * @param {boolean} params.verbose - Flag indicating whether to log verbose output. - * @returns {void} - Gulp stream that generates the TODO.md file. - * @throws {Error} - If the callback parameter is not a function. - */ - -const buildTodo = (params = {}) => { - let todoExist = false; - const filePath = './TODO.md'; - const cb = params.cb || (() => {}); - - if (typeof cb !== 'function') { - throw new Error('Callback in params should be of type function.'); - } - - if (fs.existsSync(filePath)) { - fs.unlinkSync(filePath); - log(' Existing TODO.md file deleted.'); - } - - return gulp - .src(['**/*.{js,css,scss,md}', '!node_modules/**']) - .pipe(todo()) - .pipe(replace('### ', '# ')) - .pipe( - through2.obj(function processFile(file, _, callback) { - if (file.todos?.length) { - todoExist = true; - this.push(file); - } - callback(); - }), - ) - .pipe(gulp.dest('./')) - .on('end', async () => { - if (!todoExist) { - log(' No TODOs found.'); - cb(); - return; - } - - try { - await exec( - `npx remark-cli -q ${filePath} -o -- && git add ${filePath}`, - ); - if (params.verbose) { - log(' ToDos created.'); - } - } catch (error) { - log.error(`exec error: ${error}`); - } - cb(); - }); -}; - -module.exports = buildTodo; diff --git a/gulp-tasks/helpers.js b/gulp-tasks/helpers.js deleted file mode 100644 index ba93c13..0000000 --- a/gulp-tasks/helpers.js +++ /dev/null @@ -1,148 +0,0 @@ -const fs = require('fs'); -const log = require('fancy-log'); -const path = require('path'); - -/** - * Sorts an array of objects by date. - * @param {object} a - The first object to compare. - * @param {object} b - The second object to compare. - * @returns {number} - Returns 1 if `a` is greater than `b`, -1 if `a` is less than `b`, or 0 if they are equal. - */ -const sortByDate = (a, b) => { - const dateA = new Date(a.date).getTime(); - const dateB = new Date(b.date).getTime(); - return dateA > dateB ? 1 : -1; -}; - -/** - * Groups an array of objects by a specified key. - * @param {Array} array - The array of objects to be grouped. - * @param {string} key - The key to group the objects by. - * @returns {object} - An object containing the grouped objects. - */ -const groupBy = (array, key) => { - return array.reduce((result, currentValue) => { - (result[currentValue[key]] = result[currentValue[key]] || []).push( - currentValue, - ); - return result; - }, {}); -}; - -/** - * Reads all files in a directory synchronously and returns an array of file objects. - * @param {string} dir - The directory path to read files from. - * @returns {Array} - An array of file objects containing the file path, name, and stat information. - */ -const readFilesSync = (dir) => { - const files = []; - - fs.readdirSync(dir).forEach((filename) => { - const { name } = path.parse(filename); - const filepath = path.resolve(dir, filename); - const stat = fs.statSync(filepath); - const isFile = stat.isFile(); - - if (isFile) files.push({ filepath, name, stat }); - }); - - files.sort((a, b) => { - // natural sort alphanumeric strings - // https://stackoverflow.com/a/38641281 - return a.name.localeCompare(b.name, undefined, { - numeric: true, - sensitivity: 'base', - }); - }); - - return files; -}; - -/** - * Creates a directory if it doesn't already exist. - * @param {string} dir - The directory path to create. - */ -const mkdirr = (dir) => { - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { - recursive: true, - }); - } -}; - -/** - * Loads a plugin dynamically using the specified plugin path. - * @param {string} plugin - The path to the plugin module. - * @returns {Promise<*>} - A promise that resolves to the loaded plugin module. - * @throws {Error} - If the plugin fails to load. - */ -const loadPlugin = async (plugin) => { - try { - const module = await import(plugin); - return module.default || module; - } catch (error) { - log.error(`Failed to load plugin: ${plugin}`); - throw error; - } -}; - -/** - * Reads and parses a JSON file. - * @param {string} filePath - The path to the JSON file. - * @returns {object} - The parsed JSON object. - * @throws {Error} - If there is an error reading or parsing the JSON file. - */ -const readJson = (filePath) => { - try { - return JSON.parse(fs.readFileSync(filePath, { encoding: 'utf8' })); - } catch (error) { - log.error(`Error loading JSON data from ${filePath}`); - throw error; - } -}; - -/** - * Checks if a file exists at the specified file path. - * @param {string} filePath - The path to the file. - * @returns {boolean} - Returns true if the file exists, false otherwise. - */ -const fileExists = (filePath) => { - try { - fs.accessSync(filePath); - return true; - } catch (error) { - log.error(`File ${filePath} doesn't exist.`); - return false; - } -}; - -/** - * Loads the specified environment variables and returns an object containing their values. - * @param {string[]} requiredVariables - An array of environment variable names that are required. - * @returns {object} - An object containing the values of the required environment variables. - * @throws {Error} - If any of the required environment variables are not set. - */ -const loadEnvVariables = (requiredVariables) => { - const envVariables = {}; - - requiredVariables.forEach((variable) => { - const value = process.env[variable]; - if (!value) { - throw new Error(`Environment variable ${variable} is not set`); - } - envVariables[variable] = value; - }); - - return envVariables; -}; - -module.exports = { - fileExists, - groupBy, - loadEnvVariables, - loadPlugin, - mkdirr, - readFilesSync, - readJson, - sortByDate, -}; diff --git a/gulp/config.js b/gulp/config.js new file mode 100644 index 0000000..b032aa0 --- /dev/null +++ b/gulp/config.js @@ -0,0 +1,165 @@ +import { readFileSync } from 'node:fs' + +import { toPosixPath } from './utils/core.js' + +const pkg = JSON.parse(readFileSync('./package.json', 'utf8')) + +// --- Static Path Constants --- +const srcBase = './src' +const routesBase = `${srcBase}/routes` +const staticBase = './public' +const assetsBase = `${srcBase}/assets` +const componentsPath = `${srcBase}/lib/components` +const sassBase = `${srcBase}/scss` + +const SASS_ENTRYPOINTS = { + bootstrap: `${sassBase}/bootstrap.scss`, + custom: `${sassBase}/custom.scss`, + components: `${sassBase}/components.scss`, +} + +// --- Watch Patterns (Static Manifest) --- +const WATCH_CONFIG = { + bootstrapWatch: [ + SASS_ENTRYPOINTS.bootstrap, + `${sassBase}/globals.scss`, + `${sassBase}/variables.scss`, + `${sassBase}/variables-dark.scss`, + ], + projectSassWatch: [ + SASS_ENTRYPOINTS.custom, + SASS_ENTRYPOINTS.components, + `${componentsPath}/**/*.scss`, + `${sassBase}/globals.scss`, + `${sassBase}/variables.scss`, + `${sassBase}/variables-dark.scss`, + ], + routeSassWatch: [ + `${routesBase}/**/*.scss`, + `${sassBase}/_route-abstracts.scss`, + ], + routeJsWatch: [`${routesBase}/**/*.js`], + templateWatchPaths: [`${srcBase}/**/*.njk`, `${srcBase}/**/*.md`], +} + +// --- Tool Defaults --- +const IMAGE_OPTIMIZATION = { + jpg: { quality: 85, mozjpeg: true, progressive: true, lqs: false }, + webp: { quality: 80 }, + avif: { quality: 50, speed: 5 }, + png: { compressionLevel: 9, palette: true }, +} + +const FAVICON_CONFIG = { + appName: pkg.name, + appShortName: pkg.name, + appDescription: pkg.description, + developerName: pkg.author, + background: '#000000', + path: '/assets/favicons/', + display: 'standalone', + icons: { android: true, appleIcon: true, windows: true, favicons: true }, +} + +// --- Mode Specific Settings --- +const MODES = { + dev: { + version: 'dev', + buildBase: './build-dev', + minifyJs: false, + minifyCss: false, + concatFiles: true, + optimizeImages: false, + sourceMaps: true, + }, + build: { + version: 'prod', + buildBase: './build-prod', + minifyJs: true, + minifyCss: true, + concatFiles: true, + optimizeImages: true, + sourceMaps: false, + }, + export: { + version: 'export', + buildBase: './build-export', + minifyJs: false, + minifyCss: false, + concatFiles: true, + optimizeImages: true, + sourceMaps: false, + formatCode: true, + }, +} + +/** + * Validates and resolves full configuration for a given mode. + * @param {'dev'|'build'|'export'} mode - The build mode to use + * @returns {object} Flat configuration object + */ +export function resolveConfig(mode) { + const m = MODES[mode] + if (!m) { + throw new Error(`[Config] Invalid BUILD_MODE '${mode}'`, { + cause: new Error(`Valid modes are: ${Object.keys(MODES).join(', ')}`), + }) + } + + const buildBase = toPosixPath(process.env.GULP_OUT_DIR || m.buildBase) + const tempBase = toPosixPath(process.env.GULP_TEMP_DIR || '.temp') + const assetsDest = `${buildBase}/assets` + + return { + ...m, + ...WATCH_CONFIG, + buildBase, + tempBase, + srcBase, + routesBase, + staticBase, + assetsBase, + componentsPath, + sassBase, + sassBootstrap: SASS_ENTRYPOINTS.bootstrap, + sassCustom: SASS_ENTRYPOINTS.custom, + sassComponents: SASS_ENTRYPOINTS.components, + jsFiles: `${srcBase}/js/**/*.js`, + imagesJpg: `${assetsBase}/images/**/*.{jpg,jpeg}`, + imagesPng: `${assetsBase}/images/**/*.png`, + imagesSvg: `${assetsBase}/images/**/*.svg`, + imagesBase: `${assetsBase}/images`, + iconsBase: `${assetsBase}/icons`, + datasetPagesSource: `${routesBase}/**/*.md`, + datasetPagesBuild: `${tempBase}/pages`, + fontloadFile: `${srcBase}/config/fonts.list`, + paths: { + build: buildBase, + sass: `${assetsDest}/css`, + js: `${assetsDest}/js`, + images: `${assetsDest}/images`, + favicons: `${assetsDest}/favicons`, + }, + globalInjectAssets: [ + 'assets/css/fonts*.css', + 'assets/css/bootstrap*.css', + 'assets/css/custom*.css', + 'assets/css/components*.css', + 'assets/js/bootstrap*.js', + 'assets/js/custom*.js', + 'assets/js/main*.js', + ], + imageOptimization: { + ...IMAGE_OPTIMIZATION, + jpg: { ...IMAGE_OPTIMIZATION.jpg, lqs: mode !== 'dev' }, + }, + faviconGen: { ...FAVICON_CONFIG, url: process.env.SITE_BASE_URL }, + htmlBeautify: { + indent_size: 2, + max_preserve_newlines: 1, + end_with_newline: true, + }, + fontLoad: { fontsDir: 'fonts/', cssDir: 'css/', cssFilename: 'fonts.css' }, + skipIntegrity: process.env.GULP_SKIP_INTEGRITY === 'true', + } +} diff --git a/gulp/tasks/clean-build.js b/gulp/tasks/clean-build.js new file mode 100644 index 0000000..d2a7012 --- /dev/null +++ b/gulp/tasks/clean-build.js @@ -0,0 +1,35 @@ +import { deleteAsync } from 'del' + +import loggerLib, { getRelativePath, handleEmptyPaths } from '../utils/index.js' + +const logger = loggerLib.createLogger('Clean') + +/** + * Modern async/await wrapper for deleting files and directories. + * Cleans build or temporary artifacts with consistent logging. + * @param {string|string[]} paths - Glob pattern or array of paths to delete + * @returns {Promise} List of successfully deleted paths + * @throws {Error} If the deletion operation fails + */ +export default async function cleanBuild(paths) { + if (handleEmptyPaths(paths, 'No paths provided for cleaning')) { + return [] + } + + logger.list('Cleaning paths', Array.isArray(paths) ? paths : [paths]) + try { + const deletedPaths = await deleteAsync(paths, { force: true }) + + if (deletedPaths.length > 0) { + const relativePaths = deletedPaths.map((p) => getRelativePath(p)) + logger.list('Successfully deleted', relativePaths) + } else { + logger.verbose('Clean operation finished (nothing was deleted).') + } + + return deletedPaths + } catch (error) { + logger.error(`Cleanup failure. Cause: ${error.message}`) + throw new Error(`Deletion failed: ${error.message}`, { cause: error }) + } +} diff --git a/gulp/tasks/copy-static.js b/gulp/tasks/copy-static.js new file mode 100644 index 0000000..e42360b --- /dev/null +++ b/gulp/tasks/copy-static.js @@ -0,0 +1,68 @@ +import { Transform } from 'node:stream' +import pc from 'picocolors' +import gulp from 'gulp' + +import createChangedFilter from '../utils/changed-filter.js' +import loggerLib, { + attachPipelineLogging, + getRelativePath, + isPrivateFile, + streamToPromise, +} from '../utils/index.js' + +const logger = loggerLib.createLogger('CopyStatic') + +/** + * Copies static assets from source to destination using Gulp streams. + * Implements incremental copy using an internal changed-file filter. + * @param {string|string[]} src - Source glob pattern(s) + * @param {string} baseDir - Base directory for resolving relative paths + * @param {string} dest - Destination directory + * @returns {Promise} Gulp stream result + */ +export default function copyStatic(src, baseDir, dest) { + logger.list( + `Starting copy to ${pc.cyan(dest)} (base: ${pc.dim(baseDir)})`, + Array.isArray(src) ? src : [src] + ) + + const processedFiles = [] + + const copyPipeline = gulp + .src(src, { + base: baseDir, + allowEmpty: true, + dot: true, + }) + .pipe(createChangedFilter(dest)) + .pipe( + new Transform({ + objectMode: true, + transform(file, _enc, cb) { + // Skip directories entirely - let file writes create directory structure + if (file.isDirectory()) { + return cb(null) + } + if (isPrivateFile(file.path)) { + return cb(null, null) + } + if (file.path) { + processedFiles.push(getRelativePath(file.path)) + } + cb(null, file) + }, + }) + ) + .pipe(gulp.dest(dest)) + + attachPipelineLogging({ + stream: copyPipeline, + loggerInstance: logger, + trackedFiles: processedFiles, + successLabel: 'Copied assets', + emptyMessage: 'No newer static files found to copy.', + errorMessage: 'Copy task failure:', + }) + + return streamToPromise(copyPipeline) +} diff --git a/gulp/tasks/debug-build.js b/gulp/tasks/debug-build.js new file mode 100644 index 0000000..f1e9537 --- /dev/null +++ b/gulp/tasks/debug-build.js @@ -0,0 +1,133 @@ +import fs from 'node:fs/promises' +import path from 'node:path' +import { glob } from 'glob' +import pc from 'picocolors' + +import loggerLib, { isPrivateFile } from '../utils/index.js' + +const logger = loggerLib.createLogger('DebugBuild') + +async function pathExists(targetPath) { + try { + await fs.access(targetPath) + return true + } catch { + return false + } +} + +async function findRouteFiles(activeRoutesBase) { + const routesGlobPattern = `${activeRoutesBase}/**/*.*`.replace(/\\/g, '/') + const foundRouteFiles = await glob(routesGlobPattern) + return foundRouteFiles.filter((filePath) => !isPrivateFile(filePath)) +} + +async function auditSourceFiles(foundRouteFiles) { + logger.debug( + `Found ${foundRouteFiles.length} source files in ${foundRouteFiles[0] ? path.dirname(foundRouteFiles[0]) : 'routes base'}` + ) + + for (const filePath of foundRouteFiles) { + try { + await fs.access(filePath) + } catch { + logger.warn(`Source file missing: ${pc.red(filePath)}`) + } + } +} + +async function auditIndexTemplate(activeRoutesBase) { + const indexTemplatePath = path.join(activeRoutesBase, 'index.njk') + + try { + if (!(await pathExists(indexTemplatePath))) { + logger.warn(`Critical missing template: ${pc.bold(indexTemplatePath)}`) + return + } + + const templateSnippet = await fs.readFile(indexTemplatePath, 'utf8') + const sanitizedSnippet = templateSnippet + .replace(/\s+/g, ' ') + .substring(0, 100) + logger.verbose( + `Main template (index.njk) prefix: ${pc.dim(sanitizedSnippet)}...` + ) + } catch (error) { + logger.error(`Failed to audit index.njk template. Cause: ${error.message}`) + } +} + +async function auditBuildArtifacts(buildDir) { + const generatedHtmlGlob = path.join(buildDir, '**/*.html').replace(/\\/g, '/') + const foundHtmlFiles = await glob(generatedHtmlGlob) + + if (foundHtmlFiles.length === 0) { + logger.warn( + `No HTML output found in ${pc.yellow(buildDir)}. Run a full build and verify route templates are discoverable.` + ) + } else { + logger.debug(`Build artifact count: ${foundHtmlFiles.length} HTML files.`) + } + + const indexOutputPath = path.join(buildDir, 'index.html') + const indexOutputExists = await pathExists(indexOutputPath) + + if (!indexOutputExists) { + logger.error( + `Critical build failure: ${pc.bold(indexOutputPath)} was NOT generated.` + ) + } + + return { + foundHtmlFiles, + indexOutputExists, + } +} + +function logDebugSummary(foundRouteFiles, foundHtmlFiles, indexOutputExists) { + logger.list('Debug Report Summary', [ + `Patterns Scanned: ${foundRouteFiles.length}`, + `Artifacts Found: ${foundHtmlFiles.length}`, + `Entry Point State: ${indexOutputExists ? pc.green('READY') : pc.red('MISSING')}`, + ]) +} + +/** + * Diagnostic task for verifying the build pipeline state and file existence. + * Scans key directories and reports potential issues with templates or generated output. + * @param {object} config - Configuration object + * @param {string} config.routesBase - Base directory for routes + * @param {object} config.paths - Path mapping object + * @param {string} config.paths.build - Root build directory + * @param {object} [options] - Options for the diagnostic task + * @param {string} [options.routesBaseOverride] - Override for routes base directory + * @param {string} [options.buildBaseOverride] - Override for build base directory path + * @returns {Promise} Resolves when the diagnostic report is complete + */ +export default async function debugBuild(config, options = {}) { + const activeRoutesBase = options.routesBaseOverride || config.routesBase + const buildDir = options.buildBaseOverride || config.paths.build + + logger.info(`${pc.blue('---')} Build Diagnostic Report ${pc.blue('---')}`) + + if (!(await pathExists(activeRoutesBase))) { + logger.warn(`Source directory missing: ${pc.red(activeRoutesBase)}`) + return + } + + const foundRouteFiles = await findRouteFiles(activeRoutesBase) + logger.debug( + `Found ${foundRouteFiles.length} source files in ${activeRoutesBase}` + ) + await auditSourceFiles(foundRouteFiles) + await auditIndexTemplate(activeRoutesBase) + + if (!(await pathExists(buildDir))) { + logger.warn(`Build directory missing: ${pc.red(buildDir)}`) + return + } + + const { foundHtmlFiles, indexOutputExists } = + await auditBuildArtifacts(buildDir) + logDebugSummary(foundRouteFiles, foundHtmlFiles, indexOutputExists) +} diff --git a/gulp/tasks/generate-favicons.js b/gulp/tasks/generate-favicons.js new file mode 100644 index 0000000..bd8b2f2 --- /dev/null +++ b/gulp/tasks/generate-favicons.js @@ -0,0 +1,83 @@ +import fs from 'node:fs/promises' +import path from 'node:path' +import favicons from 'favicons' + +import loggerLib from '../utils/index.js' + +const logger = loggerLib.createLogger('GenerateFavicons') + +/** + * Gulp Task: Generates favicons and related metadata from a source image. + * Uses the 'favicons' package to produce multiple formats (ico, png, webmanifest). + * @param {string} sourcePath - Path to the high-resolution source logo + * @param {string} outputDir - Destination directory for generated assets + * @param {object} faviconConfig - Configuration object for the generator + * @param {string} faviconConfig.appName - Name of the application + * @param {string} faviconConfig.appShortName - Short name of the application + * @param {string} faviconConfig.appDescription - Description of the application + * @param {string} faviconConfig.developerName - Name of the developer + * @param {string} faviconConfig.background - Background color for tiles + * @param {string} faviconConfig.path - Path for assets in HTML and manifest + * @param {string} faviconConfig.display - Preferred display mode + * @param {object} faviconConfig.icons - Icons to generate + * @param {boolean} faviconConfig.icons.android - Generate Android-specific icons + * @param {boolean} faviconConfig.icons.appleIcon - Generate Apple-specific icons + * @param {boolean} faviconConfig.icons.windows - Generate Windows-specific icons + * @param {boolean} faviconConfig.icons.favicons - Generate standard favicons + * @param {string} [faviconConfig.url] - URL to the application root + * @returns {Promise} Resolves when all files are written + * @throws {Error} If the source image is missing or generation fails + */ +export default async function generateFavicons( + sourcePath, + outputDir, + faviconConfig +) { + if (!sourcePath || !outputDir) { + throw new Error('Favicon task skipped: invalid source or destination.', { + cause: new Error(`src: ${sourcePath}, dest: ${outputDir}`), + }) + } + + try { + await fs.access(sourcePath).catch((error) => { + throw new Error(`Favicon source image not found at: ${sourcePath}`, { + cause: error, + }) + }) + logger.debug(`Found favicon source: ${sourcePath}`) + + await fs.mkdir(outputDir, { recursive: true }) + logger.debug('Starting generation with provided configuration...') + + const result = await favicons(sourcePath, faviconConfig) + + const activeWrites = [] + + result.images.forEach((image) => { + const target = path.join(outputDir, image.name) + activeWrites.push(fs.writeFile(target, image.contents)) + }) + + result.files.forEach((file) => { + const target = path.join(outputDir, file.name) + activeWrites.push(fs.writeFile(target, file.contents)) + }) + + if (result.html && result.html.length > 0) { + const snippetPath = path.join(outputDir, 'favicons.html') + activeWrites.push(fs.writeFile(snippetPath, result.html.join('\n'))) + } + + await Promise.all(activeWrites) + + logger.list(`Favicon generation successful`, [ + `${result.images.length} images created`, + `${result.files.length} metadata files created`, + `HTML snippet generated: ${path.join(outputDir, 'favicons.html')}`, + ]) + } catch (error) { + logger.error(`Favicon generation process failed. Cause: ${error.message}`) + throw error + } +} diff --git a/gulp/tasks/generate-revision.js b/gulp/tasks/generate-revision.js new file mode 100644 index 0000000..9833a9f --- /dev/null +++ b/gulp/tasks/generate-revision.js @@ -0,0 +1,155 @@ +import fs from 'node:fs/promises' +import path from 'node:path' +import gulp from 'gulp' + +import { stripTrailingLineWhitespace } from '../utils/html-output.js' +import loggerLib, { + attachPipelineLogging, + getRelativePath, + isPrivateFile, + streamToPromise, +} from '../utils/index.js' +import { createPrivateFileFilter } from '../utils/private-streams.js' + +const logger = loggerLib.createLogger('GenerateRevision') + +function trackPipelineFiles(pipeline, trackedFiles) { + pipeline.on('data', (file) => { + if (file.path) { + trackedFiles.push(getRelativePath(file.path)) + } + }) +} + +async function removeOriginalRevisionSources(buildBase, manifestPath) { + const manifestContent = await fs.readFile(manifestPath, 'utf8') + const manifest = JSON.parse(manifestContent) + + await Promise.all( + Object.keys(manifest).map(async function removeOriginalFile(assetPath) { + const originalAssetPath = path.join(buildBase, assetPath) + + try { + await fs.unlink(originalAssetPath) + } catch (error) { + if (error.code !== 'ENOENT') { + throw new Error(`Failed to remove original asset: ${assetPath}`, { + cause: error, + }) + } + } + }) + ) +} + +async function runAssetRevisionPipeline({ + buildBase, + inputAssets, + manifestPath, + rev, +}) { + const trackedAssets = [] + const assetPipeline = gulp + .src(inputAssets, { base: buildBase }) + .pipe(createPrivateFileFilter(isPrivateFile)) + .pipe(rev()) + .pipe(gulp.dest(buildBase)) + .pipe(rev.manifest(manifestPath)) + .pipe(gulp.dest('.')) + + trackPipelineFiles(assetPipeline, trackedAssets) + attachPipelineLogging({ + stream: assetPipeline, + loggerInstance: logger, + trackedFiles: trackedAssets, + successLabel: 'Revisioned assets', + emptyMessage: 'No assets were revisioned.', + errorMessage: 'Asset revision pipeline failed!', + }) + + await streamToPromise(assetPipeline) + await removeOriginalRevisionSources(buildBase, manifestPath) +} + +async function runHtmlRewritePipeline({ + buildBase, + inputHtml, + manifestPath, + revRewrite, +}) { + const trackedHtml = [] + const { Transform } = await import('node:stream') + logger.debug(`Rewriting HTML references using manifest: ${manifestPath}`) + const manifestBuffer = await fs.readFile(manifestPath) + + const htmlPipeline = gulp + .src(inputHtml, { base: buildBase }) + .pipe(createPrivateFileFilter(isPrivateFile)) + .pipe(revRewrite({ manifest: manifestBuffer })) + .pipe( + new Transform({ + objectMode: true, + transform(file, _enc, cb) { + if (file?.contents) { + file.contents = Buffer.from( + stripTrailingLineWhitespace(file.contents.toString()) + ) + } + cb(null, file) + }, + }) + ) + .pipe(gulp.dest(buildBase)) + + trackPipelineFiles(htmlPipeline, trackedHtml) + attachPipelineLogging({ + stream: htmlPipeline, + loggerInstance: logger, + trackedFiles: trackedHtml, + successLabel: 'HTML references updated', + emptyMessage: 'No HTML files were updated with revision hashes.', + errorMessage: 'HTML revision rewrite failed!', + }) + + await streamToPromise(htmlPipeline) +} + +/** + * Gulp Task: Implements asset revisioning (fingerprinting). + * Appends content hashes to filenames and updates all references in HTML archives. + * @param {object} options - Configuration for the revision process + * @param {string|string[]} options.inputAssets - Glob patterns for assets to be versioned + * @param {string|string[]} options.inputHtml - Glob patterns for HTML files to update references in + * @param {string} options.buildBase - Absolute or relative path to the build root + * @param {string} options.manifestPath - Path where the rev-manifest.json should be stored + * @param {boolean} [options.verbose] - Whether to enable detailed logging + * @returns {Promise} Resolves when all assets are versioned and HTML updated + */ +export default async function generateRevision(options) { + const { inputAssets, inputHtml, buildBase, manifestPath } = options + + try { + const { default: rev } = await import('gulp-rev') + const { default: revRewrite } = await import('gulp-rev-rewrite') + + logger.debug('Generating asset fingerprints and manifest...') + await runAssetRevisionPipeline({ + buildBase, + inputAssets, + manifestPath, + rev, + }) + await runHtmlRewritePipeline({ + buildBase, + inputHtml, + manifestPath, + revRewrite, + }) + + logger.verbose('Asset fingerprinting and HTML reference updates finished.') + } catch (error) { + throw new Error('Critical failure during asset revisioning.', { + cause: error, + }) + } +} diff --git a/gulp/tasks/generate-sri.js b/gulp/tasks/generate-sri.js new file mode 100644 index 0000000..00b713f --- /dev/null +++ b/gulp/tasks/generate-sri.js @@ -0,0 +1,71 @@ +import path from 'node:path' +import { dest, src } from 'gulp' + +import { stripTrailingLineWhitespace } from '../utils/html-output.js' +import loggerLib, { isPrivateFile, streamToPromise } from '../utils/index.js' + +const logger = loggerLib.createLogger('GenerateSri') + +/** + * Gulp Task: Injects Subresource Integrity (SRI) hashes into HTML files. + * Provides security by ensuring that fetched resources have not been tampered with. + * @param {string|string[]} input - Glob pattern(s) for HTML files + * @param {string} outputDir - Destination directory + * @returns {Promise} Gulp stream + */ +export default async function generateSri(input, outputDir) { + if (!input || !outputDir) { + logger.warn('SRI task skipped: invalid input or output parameters.') + const { Readable } = await import('node:stream') + return Readable.from([]) + } + + const { default: sri } = await import('gulp-sri-hash') + const { Transform } = await import('node:stream') + + const sriPipeline = src(input) + .pipe( + new Transform({ + objectMode: true, + transform(file, _enc, cb) { + if (isPrivateFile(file.path)) { + return cb(null, null) + } + cb(null, file) + }, + }) + ) + .pipe( + sri({ + selector: 'script[src], link[rel="stylesheet"]', + root: path.resolve(outputDir), + onError: (err) => { + logger.warn( + `SRI error for a file: ${err.message}. Skipping specific tag.` + ) + }, + }) + ) + .pipe( + new Transform({ + objectMode: true, + transform(file, _enc, cb) { + if (file?.contents) { + file.contents = Buffer.from( + stripTrailingLineWhitespace(file.contents.toString()) + ) + } + cb(null, file) + }, + }) + ) + .pipe(dest(outputDir)) + + try { + await streamToPromise(sriPipeline) + logger.verbose(`Integrity hashes successfully injected into: ${outputDir}`) + } catch (error) { + logger.error(`Failed to generate SRI hashes. Cause: ${error.message}`) + throw error + } +} diff --git a/gulp/tasks/lint-templates.js b/gulp/tasks/lint-templates.js new file mode 100644 index 0000000..99910e1 --- /dev/null +++ b/gulp/tasks/lint-templates.js @@ -0,0 +1,36 @@ +import { exec } from 'node:child_process' +import { promisify } from 'node:util' +import { glob } from 'glob' + +import loggerLib, { isPrivateFile } from '../utils/index.js' + +const execAsync = promisify(exec) +const logger = loggerLib.createLogger('LintTemplates') + +/** + * Task: Lints Nunjucks templates using njklint. + * Filters out private files/directories starting with _ or __. + * @returns {Promise} + */ +export default async function lintTemplates() { + try { + const pattern = 'src/**/*.{njk,md}' + const allFiles = await glob(pattern) + const filesToLint = allFiles.filter((f) => !isPrivateFile(f)) + + if (filesToLint.length === 0) { + logger.verbose('No templates found to lint.') + return + } + + await execAsync(`npx njklint ${filesToLint.join(' ')}`) + } catch (error) { + if (error.stdout) { + console.log(error.stdout) + } + logger.error( + `Nunjucks linting failed. Review output above and run \`npx njklint src/**/*.{njk,md}\` locally to inspect details. Cause: ${error.message}` + ) + // We don't throw here to prevent Gulp watch from crashing + } +} diff --git a/gulp/tasks/process-data.js b/gulp/tasks/process-data.js new file mode 100644 index 0000000..a2c1a8a --- /dev/null +++ b/gulp/tasks/process-data.js @@ -0,0 +1,210 @@ +import path from 'node:path' +import { Transform } from 'node:stream' +import matter from 'gray-matter' +import nunjucks from 'nunjucks' +import gulp from 'gulp' + +import { siteDefaults } from '../../src/config/site.js' +import loggerLib, { + calculateReadingTime, + getRelativePath, + isPrivateFile, +} from '../utils/index.js' +import { + buildPageData, + buildRouteExpressionContext, + extractMenuEntry, + resolvePageLocation, + writeMenuDataArtifact, + writePageDataArtifact, +} from '../utils/route-data.js' + +const logger = loggerLib.createLogger('ProcessData') + +function renderExpression(value, context) { + if (!value.includes('{{') && !value.includes('{%')) { + return value + } + + try { + return nunjucks.renderString(value, context) + } catch (error) { + throw new Error(`[ProcessData] Failed to render expression: "${value}".`, { + cause: error, + }) + } +} + +/** + * Recursively resolves Nunjucks expressions within a data structure. + * @param {unknown} data - The data to process (string, object, or array). + * @param {Record} context - The context for rendering. + * @returns {unknown} Data with resolved expressions. + */ +export function resolveDataExpressions(data, context) { + if (typeof data === 'string') { + return renderExpression(data, context) + } + + if (Array.isArray(data)) { + return data.map((item) => resolveDataExpressions(item, context)) + } + + if (data !== null && typeof data === 'object') { + return Object.fromEntries( + Object.entries(data).map(([key, value]) => [ + key, + resolveDataExpressions(value, context), + ]) + ) + } + + return data +} + +function logDuplicatePageId(usedPageIds, jsonData, filePath) { + if (usedPageIds.has(jsonData.pageId)) { + logger.warn( + `Duplicate pageId '${jsonData.pageId}' in ${filePath}. This may cause routing conflicts.` + ) + } + + usedPageIds.add(jsonData.pageId) +} + +function buildMenuEntry(frontmatter, fileName, pagePath, pageId) { + const menuEntry = extractMenuEntry(frontmatter, fileName) + if (!menuEntry.show) { + return null + } + + return { + ...menuEntry, + path: pagePath, + url: pagePath, + pageId, + } +} + +function createExpressionContext(frontmatter) { + return buildRouteExpressionContext({ + frontmatter, + siteConfig: siteDefaults, + }) +} + +async function processContentFile(file, routesRoot, dest, usedPageIds) { + const rawContent = file.contents.toString().trim() + const fileName = path.basename(file.path, path.extname(file.path)) + + if (!rawContent) { + logger.warn(`Skipping empty data file: ${path.basename(file.path)}`) + return null + } + + const { data: frontmatter, content } = matter(rawContent) + const { pagePath } = resolvePageLocation(file.path, fileName, routesRoot) + const renderedFrontmatter = resolveDataExpressions( + frontmatter, + createExpressionContext(frontmatter) + ) + + const jsonData = buildPageData({ + frontmatter: renderedFrontmatter, + content, + fileName, + pagePath, + options: { homePageId: 'home' }, + siteConfig: siteDefaults, + }) + + jsonData.readingTime = calculateReadingTime(content) + + logDuplicatePageId(usedPageIds, jsonData, file.path) + + return { + jsonData, + menuEntry: buildMenuEntry(frontmatter, fileName, pagePath, jsonData.pageId), + outputFilePath: await writePageDataArtifact({ + pageData: jsonData, + filePath: file.path, + artifactsBase: dest, + routesBase: routesRoot, + }), + } +} + +/** + * Gulp Task: Processes Markdown/Frontmatter files into a unified JSON dataset. + * Generates individual JSON files and a consolidated menu.json. + * @param {string|string[]} src - Source glob pattern(s) + * @param {string} dest - Destination directory for JSON output + * @param {object} [options] - Additional build options + * @param {string} [options.routesRoot] - Root directory for routes + * @returns {import('node:stream').Stream} Gulp stream + */ +export default function processData( + src, + dest, + { routesRoot = './src/routes' } = {} +) { + logger.debug( + `Processing dataset from ${src} to ${dest} (routesRoot: ${routesRoot})` + ) + + let processedCount = 0 + const globalMenuItems = [] + const generatedFiles = [] + const usedPageIds = new Set() + + const dataTransform = new Transform({ + objectMode: true, + async transform(file, _enc, cb) { + if (isPrivateFile(file.path)) { + logger.verbose(`Skipping private content: ${path.basename(file.path)}`) + return cb() + } + + try { + const result = await processContentFile( + file, + routesRoot, + dest, + usedPageIds + ) + if (!result) { + cb() + return + } + + const { jsonData, menuEntry, outputFilePath } = result + if (menuEntry) { + globalMenuItems.push(menuEntry) + } + processedCount += 1 + generatedFiles.push(getRelativePath(outputFilePath)) + file.contents = Buffer.from(JSON.stringify(jsonData)) + this.push(file) + cb() + } catch (error) { + logger.error(`Failed to process ${file.path}. Cause: ${error.message}`) + cb(error) + } + }, + async flush(cb) { + try { + const menuFile = await writeMenuDataArtifact(dest, globalMenuItems) + generatedFiles.push(getRelativePath(menuFile)) + + logger.info(`Dataset complete. ${processedCount} entries created.`) + logger.list('Generated artifacts', generatedFiles) + cb() + } catch (error) { + logger.error(`Failed to write menu.json. Cause: ${error.message}`) + cb(error) + } + }, + }) + + return gulp.src(src).pipe(dataTransform) +} diff --git a/gulp/tasks/process-fonts.js b/gulp/tasks/process-fonts.js new file mode 100644 index 0000000..e69bd7b --- /dev/null +++ b/gulp/tasks/process-fonts.js @@ -0,0 +1,134 @@ +import fs from 'node:fs/promises' +import path from 'node:path' + +import loggerLib, { getRelativePath } from '../utils/index.js' + +const logger = loggerLib.createLogger('ProcessFonts') + +function resolveFontTargets(outputDir, pluginConfig, minify) { + const fontsDir = path.join( + outputDir, + pluginConfig.fontsDir || 'assets/fonts/' + ) + let cssTargetName = pluginConfig.cssFilename || 'fonts.css' + if (minify && !cssTargetName.includes('.min.')) { + cssTargetName = cssTargetName.replace('.css', '.min.css') + } + + return { + fontsDir, + cssFile: path.join( + outputDir, + pluginConfig.cssDir || 'assets/css/', + cssTargetName + ), + } +} + +async function hasAnyFontAsset(fontsDir) { + try { + const entries = await fs.readdir(fontsDir, { withFileTypes: true }) + return entries.some(function hasFontAsset(entry) { + return entry.isFile() + }) + } catch { + return false + } +} + +async function shouldSkipCachedFonts(input, cssFile, fontsDir) { + try { + await fs.access(cssFile) + await fs.access(fontsDir) + + const inputStats = await fs.stat(input) + const cssStats = await fs.stat(cssFile) + const hasFontFiles = await hasAnyFontAsset(fontsDir) + const isCssFromFuture = cssStats.mtime > new Date(Date.now() + 5000) + + if (isCssFromFuture) { + logger.warn( + `Font cache file ${getRelativePath(cssFile)} has a future timestamp. Forcing rebuild.` + ) + return false + } + + if (inputStats.mtime <= cssStats.mtime && hasFontFiles) { + logger.debug( + `Fonts are up to date, skipping local font asset verification for ${getRelativePath(cssFile)}.` + ) + return true + } + } catch { + return false + } + + return false +} + +async function ensureFontDefinitionIsNotEmpty(input) { + const stats = await fs.stat(input) + if (stats.size === 0) { + logger.warn( + `Font definition file ${getRelativePath(input)} is empty. Skipping font task.` + ) + return false + } + + return true +} + +/** + * Gulp Task: Verifies locally managed font assets. + * Legacy remote download flow via gulp-google-webfonts has been removed. + * @param {string} input - Path to font definition file + * @param {string} outputDir - Destination directory for fonts and styles + * @param {object} [options] - Task options + * @param {object} [options.config] - Local font target configuration + * @param {boolean} [options.minify] - Whether minified CSS target name should be used + * @returns {Promise} Resolves when verification completes + */ +export default async function processFonts(input, outputDir, options = {}) { + if (!input || !outputDir) { + logger.warn('Font task skipped: invalid input or output parameters.') + return + } + + const fontDefinitionPath = path.resolve(input) + + try { + await fs.access(fontDefinitionPath) + if (!(await ensureFontDefinitionIsNotEmpty(fontDefinitionPath))) { + return + } + + const { config: pluginConfig = {}, minify = false } = options + const { fontsDir, cssFile } = resolveFontTargets( + outputDir, + pluginConfig, + minify + ) + + if (await shouldSkipCachedFonts(fontDefinitionPath, cssFile, fontsDir)) { + return + } + + await fs.access(cssFile) + + const hasFontFiles = await hasAnyFontAsset(fontsDir) + if (!hasFontFiles) { + logger.warn( + `No local font binaries found in ${getRelativePath(fontsDir)}.` + ) + return + } + + logger.verbose( + `Using local font assets from ${getRelativePath(fontsDir)} and ${getRelativePath(cssFile)}.` + ) + } catch (error) { + throw new Error('Local font assets are missing or inaccessible.', { + cause: error, + }) + } +} diff --git a/gulp/tasks/process-html.js b/gulp/tasks/process-html.js new file mode 100644 index 0000000..10871eb --- /dev/null +++ b/gulp/tasks/process-html.js @@ -0,0 +1,175 @@ +import path from 'node:path' +import { globSync } from 'glob' +import gulp from 'gulp' + +import { sortGlobalAssetPaths } from '../utils/html-output.js' +import htmlRendering from '../utils/html-rendering.js' +import loggerLib, { + attachPipelineLogging, + ensureFileIntegrity, + getRelativePath, + isPrivateFile, + streamToPromise, +} from '../utils/index.js' +import { + clearRouteAssetCache, + discoverRouteScripts, + discoverRouteStyles, +} from '../utils/navigation-assets.js' +import { + getRouteDataArtifactsDir, + loadPageDataArtifact, + loadRouteArtifactsContext, +} from '../utils/route-data.js' + +const logger = loggerLib.createLogger('ProcessHtml') + +function createRoutesPattern(config) { + return [ + path.join(config.routesBase, '**/*.njk').replace(/\\/g, '/'), + `!${path.join(config.routesBase, '**/layout-*.njk').replace(/\\/g, '/')}`, + ] +} + +function createTemplatesPath(config) { + return [ + config.routesBase, + path.join(config.srcBase, 'lib'), + config.imagesBase, + config.iconsBase, + ] +} + +function collectGlobalAssetPaths(config) { + const discoveredAssetPaths = config.globalInjectAssets.flatMap( + function collectPaths(pattern) { + return globSync( + path.join(config.paths.build, pattern).replace(/\\/g, '/'), + { posix: true } + ) + } + ) + + return sortGlobalAssetPaths(discoveredAssetPaths) +} + +function createGlobalAssetsStream(config, assetPaths) { + const pathsToRead = + !assetPaths || assetPaths.length === 0 + ? ['__dummy_nonexistent__'] + : assetPaths + + return gulp.src(pathsToRead, { + read: false, + base: config.paths.build, + allowEmpty: true, + }) +} + +async function loadTemplateData(file, config, globalContext) { + const relativePath = path.relative(config.routesBase, file.path) + const pageRelativeDir = path.dirname(relativePath) + const pageBasename = path.basename(relativePath, '.njk') + const artifactsBase = getRouteDataArtifactsDir(config.tempBase) + + const [pageData, styles, scripts] = await Promise.all([ + loadPageDataArtifact({ + artifactsBase, + routesBase: config.routesBase, + filePath: file.path, + }), + discoverRouteStyles(pageRelativeDir, pageBasename, config.paths.build), + discoverRouteScripts(pageRelativeDir, pageBasename, config.paths.build), + ]) + + return htmlRendering.buildTemplateContext({ + pageData, + globalContext, + config, + pageStyles: styles, + pageScripts: scripts, + isPrivate: (targetPath) => isPrivateFile(targetPath), + }) +} + +async function createHtmlPipeline(config, globalContext) { + const { default: data } = await import('gulp-data') + const { default: inject } = await import('gulp-inject') + const { default: beautify } = await import('gulp-jsbeautifier') + const { default: nunjucksRender } = await import('gulp-nunjucks-render') + const { default: markdown } = await import('markdown-it') + const { Transform } = await import('node:stream') + + const routesPattern = createRoutesPattern(config) + const templatesPath = createTemplatesPath(config) + const assetPaths = collectGlobalAssetPaths(config) + const globalAssets = createGlobalAssetsStream(config, assetPaths) + const processedFiles = [] + + let pipeline = gulp + .src(routesPattern, { allowEmpty: true }) + .pipe(data((file) => loadTemplateData(file, config, globalContext))) + .pipe( + nunjucksRender( + htmlRendering.createNunjucksOptions(config, templatesPath, markdown) + ) + ) + .pipe( + inject(globalAssets, { + transform: (filepath) => + htmlRendering.transformInjectedAsset(filepath, config.paths.build), + addRootSlash: false, + quiet: true, + }) + ) + .pipe(ensureFileIntegrity({ taskName: 'Html', minSize: 50 })) + + if (config.formatCode) { + pipeline = pipeline.pipe(beautify(config.htmlBeautify)) + } + + pipeline = pipeline + .pipe(htmlRendering.createHtmlNormalizationTransform(Transform)) + .pipe( + htmlRendering.createProcessedFilesTracker( + Transform, + processedFiles, + getRelativePath + ) + ) + .pipe(gulp.dest(config.paths.build)) + + return { htmlPipeline: pipeline, processedFiles } +} + +/** + * Gulp Task: Renders Nunjucks templates into HTML with injected assets. + * @param {object} config - Project configuration provider. + * @returns {Promise} Resolves when HTML generation is complete. + */ +export default async function processHtml(config) { + clearRouteAssetCache() + const { siteData, menuData } = await loadRouteArtifactsContext( + config.tempBase + ) + const globalContext = htmlRendering.buildGlobalContext({ siteData, menuData }) + const { htmlPipeline, processedFiles } = await createHtmlPipeline( + config, + globalContext + ) + + attachPipelineLogging({ + stream: htmlPipeline, + loggerInstance: logger, + trackedFiles: processedFiles, + successLabel: 'HTML pages generated', + emptyMessage: 'No HTML pages were generated.', + errorMessage: 'HTML processing failed!', + }) + + try { + await streamToPromise(htmlPipeline) + } catch (error) { + throw new Error('HTML generation failed.', { cause: error }) + } +} diff --git a/gulp/tasks/process-images.js b/gulp/tasks/process-images.js new file mode 100644 index 0000000..3389e08 --- /dev/null +++ b/gulp/tasks/process-images.js @@ -0,0 +1,126 @@ +import { Transform } from 'node:stream' +import gulp from 'gulp' + +import imagePipeline from '../utils/image-pipeline.js' +import loggerLib, { + attachPipelineLogging, + getRelativePath, + isPrivateFile, + streamToPromise, +} from '../utils/index.js' +import { createPrivateFileFilter } from '../utils/private-streams.js' + +const logger = loggerLib.createLogger('ProcessImages') + +/** + * Validation stream to prevent corruption and mismatched processing. + * @returns {Transform} A Gulp transform stream + */ +export function validateImage() { + return imagePipeline.createImageValidationTransform(logger) +} + +async function executeRasterTask(src, dest, targetType, options = {}) { + return imagePipeline.executeRasterTask({ + src, + dest, + targetType, + logger, + ...options, + }) +} + +async function optimizeJpg(src, dest, options = {}) { + return executeRasterTask(src, dest, 'jpg', { + logPrefix: 'Images:JPG', + ...options, + }) +} + +async function optimizePng(src, dest, options = {}) { + return executeRasterTask(src, dest, 'png', { + logPrefix: 'Images:PNG', + ...options, + }) +} + +async function optimizeSvg(src, dest) { + const processedFiles = [] + + const { optimize } = await import('svgo') + + const pipeline = gulp + .src(src, { encoding: false }) + .pipe(createPrivateFileFilter(isPrivateFile)) + .pipe(validateImage()) + .pipe( + new Transform({ + objectMode: true, + transform(file, _enc, cb) { + if (file._isInvalid || file.isNull()) { + return cb(null, file) + } + if (file.isStream()) { + return cb(new Error('Streaming not supported in SVGO transform')) + } + try { + const svgStr = file.contents.toString('utf8') + const result = optimize(svgStr, { + path: file.path, + plugins: [ + { + name: 'preset-default', + params: { overrides: { cleanupIds: false } }, + }, + ], + }) + if (result.error) { + return cb(new Error(result.error)) + } + file.contents = Buffer.from(result.data) + cb(null, file) + } catch (error) { + cb(error) + } + }, + }) + ) + .pipe(gulp.dest(dest)) + + pipeline.on('data', (file) => { + processedFiles.push(getRelativePath(file.path)) + }) + + attachPipelineLogging({ + stream: pipeline, + loggerInstance: logger, + trackedFiles: processedFiles, + successLabel: '[Images:SVG] Processed assets', + emptyMessage: '[Images:SVG] No new SVG images needed.', + errorMessage: '[Images:SVG] Error:', + }) + + try { + await streamToPromise(pipeline) + } catch (error) { + throw new Error('[Images:SVG] Optimization pipeline failed.', { + cause: error, + }) + } +} + +async function convertToWebp(src, dest) { + return executeRasterTask(src, dest, 'webp', { logPrefix: 'Images:WebP' }) +} + +async function convertToAvif(src, dest) { + return executeRasterTask(src, dest, 'avif', { logPrefix: 'Images:AVIF' }) +} + +export default { + jpg: optimizeJpg, + png: optimizePng, + svg: optimizeSvg, + webp: convertToWebp, + avif: convertToAvif, +} diff --git a/gulp/tasks/process-js.js b/gulp/tasks/process-js.js new file mode 100644 index 0000000..271e59a --- /dev/null +++ b/gulp/tasks/process-js.js @@ -0,0 +1,197 @@ +import path from 'node:path' +import { Transform } from 'node:stream' +import { glob } from 'glob' +import pc from 'picocolors' +import gulp from 'gulp' + +import createChangedFilter from '../utils/changed-filter.js' +import loggerLib, { + attachPipelineLogging, + getRelativePath, + isPrivateFile, + streamToPromise, +} from '../utils/index.js' + +const logger = loggerLib.createLogger('ProcessJs') + +/** + * Generates esbuild configuration object based on options and environment. + * @param {object} options - Task options + * @param {boolean} [options.bundle] - Whether to bundle all dependencies + * @param {string} [options.outputFormat] - Output module format (esm, iife, cjs) + * @param {boolean} [options.minify] - Whether to minify the output + * @param {boolean} [options.sourceMaps] - Explicitly enable/disable sourcemaps + * @param {object} [buildConfig] - Configuration provider + * @returns {object} Esbuild configuration object + */ +export function getEsbuildConfig(options = {}, buildConfig) { + const { + bundle = false, + outputFormat = 'esm', + minify, + sourceMaps, + entryPoints, + } = options + + const shouldMinify = minify ?? buildConfig.minifyJs + const shouldGenerateSourceMaps = sourceMaps ?? buildConfig.sourceMaps + + const result = { + bundle, + format: outputFormat, + minify: shouldMinify, + sourcemap: shouldGenerateSourceMaps ? 'external' : false, + loader: { '.js': 'js' }, + target: ['es2022'], + logLevel: loggerLib.isDebugEnabled() ? 'info' : 'warning', + } + + if (entryPoints) { + result.entryPoints = entryPoints + } + + return result +} + +/** + * Gulp Task: Processes JavaScript source files using esbuild. + * @param {object} config - Configuration object + * @param {boolean} config.minifyJs - Global minify flag + * @param {boolean} config.sourceMaps - Global sourcemaps flag + * @param {string|string[]} filePaths - Input glob pattern(s) for JS files + * @param {string} outputDir - Destination directory + * @param {object} [options] - Task options + * @param {boolean} [options.bundle] - Whether to bundle all dependencies + * @param {string} [options.outputFormat] - Output module format (esm, iife, cjs) + * @param {boolean} [options.minify] - Whether to minify the output + * @param {boolean} [options.sourceMaps] - Explicitly enable/disable sourcemaps + * @param {string} [options.base] - Base directory used to preserve route structure + * @param {string} [options.cwd] - Working directory for resolving relative globs + * @returns {Promise} Resolves when processing is complete + */ +export default async function processJs( + config, + filePaths, + outputDir, + options = {} +) { + if (!filePaths || (Array.isArray(filePaths) && filePaths.length === 0)) { + logger.warn( + 'Skipping JS processing: no valid input files provided. Check task globs or route-level script entries.' + ) + return + } + + const srcOptions = { + ...(options.base && { base: options.base }), + ...(options.cwd && { cwd: options.cwd }), + } + + const resolvedEntryPoints = await glob(filePaths, srcOptions) + + if (resolvedEntryPoints.length === 0) { + logger.debug('No files matched for JS processing, skipping esbuild.') + return + } + + const gulpEsbuild = (await import('gulp-esbuild')).createGulpEsbuild() + const esbuildConfig = getEsbuildConfig( + { ...options, entryPoints: resolvedEntryPoints }, + config + ) + logger.debug( + `Processing JS with esbuild to ${pc.dim(outputDir)} (bundle: ${esbuildConfig.bundle}, minify: ${esbuildConfig.minify})` + ) + + const processedFiles = [] + const jsPipeline = gulp + .src(filePaths, srcOptions) + .pipe( + createChangedFilter(outputDir, { + extension: esbuildConfig.minify ? '.min.js' : '.js', + }) + ) + .pipe( + new Transform({ + objectMode: true, + transform(file, _enc, cb) { + if (isPrivateFile(file.path)) { + return cb(null, null) + } + cb(null, file) + }, + }) + ) + .pipe(gulpEsbuild(esbuildConfig)) + .pipe(createMinRenameTransform(esbuildConfig.minify)) + .pipe(gulp.dest(outputDir)) + + jsPipeline.on('data', (file) => { + if (file && file.path) { + processedFiles.push(getRelativePath(file.path)) + } + }) + + attachPipelineLogging({ + stream: jsPipeline, + loggerInstance: logger, + trackedFiles: processedFiles, + successLabel: 'JS assets generated', + emptyMessage: 'No JS assets were generated.', + errorMessage: 'esbuild processing failed!', + }) + + await streamToPromise(jsPipeline) +} + +/** + * Processes both global and route-level JavaScript sources. + * @param {object} config - Configuration object + * @param {string} config.jsFiles - Glob for global JS entrypoints + * @param {string} config.routesBase - Base directory for route-local sources + * @param {string} config.paths.js - Destination directory for compiled JS + * @param {boolean} config.concatFiles - Whether to bundle entrypoints + * @param {boolean} config.minifyJs - Whether to minify JS + * @param {boolean} config.sourceMaps - Whether to emit sourcemaps + * @returns {Promise} Resolves when all JS assets are processed + */ +export async function processAllJs(config) { + const sharedOptions = { + bundle: config.concatFiles, + minify: config.minifyJs, + sourceMaps: config.sourceMaps, + } + const routeScriptFiles = await glob( + path.join(config.routesBase, '**/*.js').replace(/\\/g, '/') + ) + const routeTasks = routeScriptFiles.map(async (routeFilePath) => { + const routeRelativeDirectory = path.dirname( + path.relative(config.routesBase, routeFilePath) + ) + const destinationDirectory = + routeRelativeDirectory === '.' + ? config.paths.js + : path.join(config.paths.js, routeRelativeDirectory) + + return processJs(config, routeFilePath, destinationDirectory, sharedOptions) + }) + + await Promise.all([ + processJs(config, config.jsFiles, config.paths.js, sharedOptions), + ...routeTasks, + ]) +} + +function createMinRenameTransform(shouldMinify) { + return new Transform({ + objectMode: true, + transform(file, _enc, cb) { + const isSourceMap = file.basename.endsWith('.js.map') + + if (shouldMinify && !isSourceMap && !file.basename.includes('.min.')) { + file.extname = `.min${file.extname}` + } + cb(null, file) + }, + }) +} diff --git a/gulp/tasks/process-sass.js b/gulp/tasks/process-sass.js new file mode 100644 index 0000000..42f92d4 --- /dev/null +++ b/gulp/tasks/process-sass.js @@ -0,0 +1,327 @@ +import path from 'node:path' +import { glob } from 'glob' + +import loggerLib, { suppressOutdatedBootstrapWarnings } from '../utils/index.js' +import sassPipeline from '../utils/sass-pipeline.js' + +const logger = loggerLib.createLogger('Sass') +const scssDiscoveryCache = new Map() +const SCSS_DISCOVERY_CACHE_TTL_MS = 1000 +const SHOULD_FAIL_ON_SASS_ERROR = process.env.GULP_FAIL_ON_SASS_ERROR === 'true' +let hasSassCompilationErrors = false + +function flattenWrittenFiles(results) { + return results.flat().filter(Boolean) +} + +function hasGlobPattern(filePath) { + return /[*?[\]{}()!]/u.test(filePath) +} + +async function resolveSourceEntries(src) { + if (Array.isArray(src)) { + return src + } + + if (hasGlobPattern(src)) { + return glob(src) + } + + return [src] +} + +/** + * Builds standard SASS include paths. + * @param {string|null} [extraPath] - Optional additional path to include + * @param {object} config - Configuration object containing sassBase + * @returns {string[]} Resolved include paths + */ +export function buildSassIncludePaths(extraPath, config) { + return [ + path.resolve('./src'), + path.resolve(config.sassBase), + path.resolve('./'), + path.resolve('./node_modules'), + ...(extraPath ? [path.resolve(extraPath)] : []), + ] +} + +/** + * Generates options for the SASS compiler. + * @param {object} [customSassOptions] - Overrides for sass options + * @param {boolean} [minify] - Whether to use compressed output + * @param {object} config - Configuration object + * @returns {object} Sass compiler options + */ +export function getSassCompilerOptions( + customSassOptions = {}, + minify = false, + config +) { + return { + quietDeps: true, + silenceDeprecations: [ + 'import', + 'slash-div', + 'color-functions', + 'global-variable-shadowing', + ], + outputStyle: minify ? 'compressed' : 'expanded', + ...customSassOptions, + includePaths: buildSassIncludePaths( + customSassOptions.includePaths?.[0], + config + ), + logger: { + warn: (message, options) => { + if (!suppressOutdatedBootstrapWarnings(message)) { + logger.warn(message, options) + } + }, + debug: () => {}, + }, + } +} + +/** + * Clears the in-memory SCSS discovery cache. + * @returns {void} + */ +export function clearScssDiscoveryCache() { + scssDiscoveryCache.clear() +} + +/** + * Discovers SCSS source files with caching. + * @param {string} sourceDir - Directory to scan + * @param {object} [options] - Discovery options + * @returns {Promise} List of found files + */ +export async function discoverScssSources(sourceDir, options = {}) { + const pattern = path.join(sourceDir, '**/*.scss').replace(/\\/g, '/') + const ttlMs = options.ttlMs ?? SCSS_DISCOVERY_CACHE_TTL_MS + const now = options.now ? options.now() : Date.now() + const globFn = options.globFn || glob + + const cached = scssDiscoveryCache.get(pattern) + if (cached && cached.expiresAt > now) { + return cached.files + } + + const files = await globFn(pattern) + scssDiscoveryCache.set(pattern, { files, expiresAt: now + ttlMs }) + return files +} + +async function buildSassPipeline( + config, + { + src, + dest, + base, + outputFilename, + postcssPlugins = [], + sassOptions: customSassOptions = {}, + sourceMaps = false, + minify = false, + beautify = false, + skipNewer = false, + skipIntegrity = false, + } +) { + const { default: autoprefixer } = await import('autoprefixer') + const { default: cssnano } = await import('cssnano') + const postcss = (await import('postcss')).default + const sass = await import('sass') + const sassCompilerOptions = getSassCompilerOptions( + customSassOptions, + minify, + config + ) + return sassPipeline.createSassPipeline({ + config, + src, + dest, + base, + outputFilename, + postcssPlugins, + sourceMaps, + minify, + beautify, + skipNewer, + skipIntegrity, + sassCompilerOptions, + logger, + markCompilationError() { + hasSassCompilationErrors = true + }, + autoprefixer, + cssnano, + postcss, + sass, + }) +} + +/** + * Promisified SASS processing. + * @param {object} config - Configuration object + * @param {string|string[]} src - Source files + * @param {string} dest - Destination directory + * @param {object} [options] - Additional options + * @param {string|null} [options.outputFilename] - Optional output name + * @param {import('postcss').AcceptedPlugin[]} [options.postcssPlugins] - PostCSS plugins + * @returns {Promise} + */ +export default async function processSass(config, src, dest, options = {}) { + const { outputFilename = null, postcssPlugins = [] } = options + const sourceEntries = await resolveSourceEntries(src) + return buildSassPipeline(config, { + src: sourceEntries, + dest, + base: options.base, + outputFilename, + postcssPlugins, + sassOptions: options.sassOptions || {}, + sourceMaps: options.sourceMaps ?? config.sourceMaps, + minify: options.minify ?? config.minifyCss, + beautify: options.beautify ?? config.formatCode, + skipNewer: options.skipNewer || false, + skipIntegrity: options.skipIntegrity || false, + }) +} + +async function compileScssGroup( + config, + { + sourceDir, + dest, + outputFilename = null, + loggerContext = 'SCSS Group', + postcssPlugins = [], + options = {}, + } +) { + try { + const sourceEntries = await discoverScssSources(sourceDir) + if (sourceEntries.length === 0) { + return + } + + return processSass(config, sourceEntries, dest, { + ...options, + outputFilename, + postcssPlugins, + base: sourceDir, + sassOptions: { + includePaths: buildSassIncludePaths(sourceDir, config), + ...(options.sassOptions || {}), + }, + }) + } catch (error) { + logger.error( + `Failed to compile SCSS group (${loggerContext}): ${error.message}` + ) + throw error + } +} + +/** + * Compiles route-specific styles. + * @param {object} config - Configuration object + * @param {import('postcss').AcceptedPlugin[]} [postcssPlugins] - PostCSS plugins + * @param {object} [options] - Additional options + * @returns {Promise} + */ +export function compileRouteStyles(config, postcssPlugins = [], options = {}) { + return compileScssGroup(config, { + sourceDir: config.routesBase, + dest: config.paths.sass, + loggerContext: 'Routes', + postcssPlugins, + options, + }) +} + +function buildModeStyleOptions(config, mode, overrides = {}) { + return { + sourceMaps: mode === 'dev' ? config.sourceMaps : false, + minify: mode === 'build' ? config.minifyCss : false, + skipNewer: mode === 'dev', + ...overrides, + } +} + +/** + * Compiles the project Bootstrap bundle from local SCSS variables. + * @param {object} config - Configuration object + * @param {'dev'|'build'|'export'} mode - Build mode + * @returns {Promise} + */ +export function compileBootstrapStyles(config, mode) { + return processSass(config, config.sassBootstrap, config.paths.sass, { + ...buildModeStyleOptions(config, mode), + outputFilename: 'bootstrap.css', + }) +} + +/** + * Compiles global project style bundles. + * @param {object} config - Configuration object + * @param {'dev'|'build'|'export'} mode - Build mode + * @returns {Promise} + */ +export async function compileProjectStyles(config, mode) { + const options = buildModeStyleOptions(config, mode) + + const results = await Promise.all([ + processSass(config, config.sassCustom, config.paths.sass, { + ...options, + outputFilename: 'custom.css', + }), + processSass(config, config.sassComponents, config.paths.sass, { + ...options, + outputFilename: 'components.css', + skipIntegrity: true, + }), + ]) + return flattenWrittenFiles(results) +} + +/** + * Orchestrates SASS processing based on build mode. + * @param {object} config - Configuration object + * @param {string} config.sassBootstrap - Path to project Bootstrap SASS file + * @param {string} config.sassCustom - Path to custom SASS file + * @param {string} config.sassComponents - Path to component SASS file + * @param {string} config.routesBase - Path to routes + * @param {boolean} config.minifyCss - Global minify flag + * @param {boolean} config.sourceMaps - Global sourcemaps flag + * @param {object} config.paths - Path mapping + * @param {string} config.paths.sass - Destination for compiled CSS + * @param {'dev'|'build'|'export'} mode - Build mode + * @returns {Promise} + */ +export async function processAllSass(config, mode) { + hasSassCompilationErrors = false + + try { + const results = await Promise.all([ + compileBootstrapStyles(config, mode), + compileProjectStyles(config, mode), + compileRouteStyles(config, [], { + skipNewer: mode === 'dev', + }), + ]) + + if (SHOULD_FAIL_ON_SASS_ERROR && hasSassCompilationErrors) { + throw new Error( + 'Sass compilation failed. Enable logs to inspect root causes.' + ) + } + + return flattenWrittenFiles(results) + } catch (error) { + logger.error(`Failed to process Sass in ${mode} mode: ${error.message}`) + throw error + } +} diff --git a/gulp/tasks/purge-css.js b/gulp/tasks/purge-css.js new file mode 100644 index 0000000..ed8a1c3 --- /dev/null +++ b/gulp/tasks/purge-css.js @@ -0,0 +1,117 @@ +import { Readable, Transform } from 'node:stream' +import gulp from 'gulp' + +import loggerLib, { + attachPipelineLogging, + getRelativePath, + isPrivateFile, + streamToPromise, +} from '../utils/index.js' + +const logger = loggerLib.createLogger('PurgeCss') + +const PURGECSS_SAFELIST = { + standard: [ + 'active', + 'collapsing', + 'collapse', + 'collapsed', + 'fade', + 'offcanvas-backdrop', + 'open', + 'scroll', + 'show', + 'showing', + 'hiding', + 'alert-dismissible', + 'modal-backdrop', + 'modal-open', + 'modal-static', + 'header-search__result', + ], + greedy: [ + /tooltip/, + /popover/, + /^bs-/, + /^modal-/, + /^dropdown-/, + /^navbar-/, + /^offcanvas-/, + /^accordion-/, + /^collapse/, + /^carousel-/, + /^active/, + /^show/, + /^is-/, + /^was-/, + /^sticky-/, + /^fixed-/, + ], + deep: [/^data-bs-popper/, /^tns/, /^sl/], +} + +/** + * Gulp Task: Optimizes CSS files by removing unused selectors. + * Analyzes linked HTML files to determine which CSS rules are actually needed. + * @param {string|string[]} inputCss - Path(s) to CSS files to purge + * @param {string|string[]} inputHtml - Path(s) to HTML files for selector analysis + * @param {string} outputDir - Destination directory + * @returns {Promise} Resolves when purging is complete + */ +export default async function purgeCss(inputCss, inputHtml, outputDir) { + if (!inputCss || !inputHtml || !outputDir) { + logger.warn( + 'PurgeCSS task skipped: invalid input/output parameters. Provide CSS input, HTML content sources, and an output directory.' + ) + return Readable.from([]) + } + + const { default: purgecss } = await import('gulp-purgecss') + + const contentSources = ( + Array.isArray(inputHtml) ? inputHtml : [inputHtml] + ).filter((f) => !isPrivateFile(f)) + + const processedFiles = [] + + const purgePipeline = gulp + .src(inputCss) + .pipe( + new Transform({ + objectMode: true, + transform(file, _enc, cb) { + if (isPrivateFile(file.path)) { + return cb(null, null) + } + cb(null, file) + }, + }) + ) + .pipe( + purgecss({ + content: contentSources, + safelist: PURGECSS_SAFELIST, + }) + ) + .pipe(gulp.dest(outputDir)) + + purgePipeline.on('data', (file) => { + processedFiles.push(getRelativePath(file.path)) + }) + + attachPipelineLogging({ + stream: purgePipeline, + loggerInstance: logger, + trackedFiles: processedFiles, + successLabel: 'PurgeCSS optimized', + emptyMessage: 'No CSS files were optimized by PurgeCSS.', + errorMessage: 'PurgeCSS processing failed!', + }) + + try { + await streamToPromise(purgePipeline) + logger.verbose('PurgeCSS operation completed successfully.') + } catch (error) { + throw new Error('PurgeCSS operation failed.', { cause: error }) + } +} diff --git a/gulp/tasks/serve-site.js b/gulp/tasks/serve-site.js new file mode 100644 index 0000000..9338eea --- /dev/null +++ b/gulp/tasks/serve-site.js @@ -0,0 +1,42 @@ +import browserSync from 'browser-sync' + +import { getEnv } from '../utils/index.js' + +const serverInstance = browserSync.create() + +async function initializeServer(config) { + const SERVER_PORT = getEnv('BROWSERSYNC_PORT', 3000) + const AUTO_OPEN_BROWSER = getEnv('BROWSERSYNC_OPEN', false) + const SHOW_NOTIFICATIONS = getEnv('BROWSERSYNC_NOTIFY', false) + + const buildRoot = config.paths.build + + return new Promise((resolve, reject) => { + serverInstance.init( + { + server: { + baseDir: buildRoot, + }, + port: SERVER_PORT, + open: AUTO_OPEN_BROWSER, + notify: SHOW_NOTIFICATIONS, + watch: false, + }, + (error) => { + if (error) { + return reject(error) + } + resolve() + } + ) + }) +} + +function reloadBrowser(changedFiles) { + serverInstance.reload(changedFiles) +} + +export default { + init: initializeServer, + reload: reloadBrowser, +} diff --git a/gulp/tasks/validate-html.js b/gulp/tasks/validate-html.js new file mode 100644 index 0000000..653b85f --- /dev/null +++ b/gulp/tasks/validate-html.js @@ -0,0 +1,101 @@ +import { Transform } from 'node:stream' +import { HtmlValidate } from 'html-validate' +import { src } from 'gulp' + +import loggerLib, { getRelativePath, isPrivateFile } from '../utils/index.js' + +const logger = loggerLib.createLogger('ValidateHtml') + +/** + * Gulp Task: Validates HTML files against WCAG and HTML standards using html-validate. + * Reports accessibility issues, broken structures, and invalid attributes. + * @param {string|string[]} input - Glob pattern(s) for HTML files to validate + * @returns {import('node:stream').Stream} Gulp stream + */ +export default function validateHtml(input) { + const validator = new HtmlValidate({ + extends: ['html-validate:recommended'], + rules: { + 'no-raw-characters': ['warn', { relaxed: true }], + 'no-inline-style': 'warn', + 'wcag/h30': 'warn', + 'empty-title': 'warn', + }, + }) + const validationResults = [] + + const validationPipeline = src(input).pipe( + new Transform({ + objectMode: true, + transform: function (file, _enc, cb) { + if (isPrivateFile(file.path)) { + return cb(null, null) + } + if (file.isNull()) { + return cb(null, file) + } + if (file.isStream()) { + return cb(new Error('Streaming is not supported for validation.')) + } + ;(async () => { + try { + const report = await validator.validateString( + file.contents.toString(), + file.path + ) + if (report.results[0]) { + validationResults.push(report.results[0]) + } + cb(null, file) + } catch (error) { + logger.error( + `Failed to validate file: ${file.path}. Cause: ${error.message}` + ) + cb(error) + } + })() + }, + flush(cb) { + let errorCount = 0 + let warningCount = 0 + + validationResults.forEach((result) => { + result.messages.forEach((msg) => { + const isError = msg.severity === 2 + const logMethod = isError ? 'error' : 'warn' + + if (isError) { + errorCount += 1 + } else { + warningCount += 1 + } + + logger[logMethod]( + `${getRelativePath(result.filePath)}:${msg.line}:${msg.column} - ${msg.message} (${msg.ruleId})` + ) + }) + }) + + if (errorCount > 0 || warningCount > 0) { + const summaryMessage = `HTML validation finished: ${errorCount} errors, ${warningCount} warnings.` + if (errorCount > 0) { + logger.error(summaryMessage) + cb( + new Error(summaryMessage, { + cause: new Error('HTML validation reported blocking errors.'), + }) + ) + return + } + + logger.warn(summaryMessage) + } else { + logger.verbose('HTML validation passed successfully (0 issues).') + } + cb() + }, + }) + ) + + return validationPipeline +} diff --git a/gulp/templates/component/component.md.hbs b/gulp/templates/component/component.md.hbs new file mode 100644 index 0000000..684696c --- /dev/null +++ b/gulp/templates/component/component.md.hbs @@ -0,0 +1,5 @@ +# Component +{{dashCase name}} + +Usage: {% include "components/{{dashCase name}}/{{dashCase name}}.njk" with { +content: "Hello" } %} \ No newline at end of file diff --git a/gulp/templates/component/component.njk.hbs b/gulp/templates/component/component.njk.hbs new file mode 100644 index 0000000..330d73b --- /dev/null +++ b/gulp/templates/component/component.njk.hbs @@ -0,0 +1,6 @@ +{# Component: +{{dashCase name}} +#} +
+ {{content}} +
\ No newline at end of file diff --git a/gulp/templates/component/component.scss.hbs b/gulp/templates/component/component.scss.hbs new file mode 100644 index 0000000..8a0c58b --- /dev/null +++ b/gulp/templates/component/component.scss.hbs @@ -0,0 +1 @@ +.c-{{dashCase name}} { } \ No newline at end of file diff --git a/gulp/utils/changed-filter.js b/gulp/utils/changed-filter.js new file mode 100644 index 0000000..608302b --- /dev/null +++ b/gulp/utils/changed-filter.js @@ -0,0 +1,82 @@ +import fs from 'node:fs/promises' +import path from 'node:path' +import { Transform } from 'node:stream' + +function hasGlobPattern(filePath) { + return /[*?[\]{}()!]/u.test(filePath) +} + +function buildDestinationPath(file, options) { + const { destination, extension, transformPath } = options + const filePath = file.path + + if (transformPath) { + return transformPath(filePath) + } + + let relativePath = file.relative + + if (!relativePath && file.base) { + relativePath = path.relative(file.base, filePath) + } + + if (!relativePath) { + throw new Error( + `file.relative is required to build a destination path for ${filePath}` + ) + } + + if (extension) { + const dir = path.dirname(relativePath) + const name = path.basename(relativePath, path.extname(relativePath)) + return path.join(destination, dir, name + extension) + } + + return path.join(destination, relativePath) +} + +async function hasChanged(sourcePath, destinationPath) { + try { + const [sourceStats, destinationStats] = await Promise.all([ + fs.stat(sourcePath), + fs.stat(destinationPath), + ]) + + return sourceStats.mtime > destinationStats.mtime + } catch { + return true + } +} + +/** + * Creates a Gulp-compatible transform that only passes through changed files. + * @param {string} destination - Destination directory + * @param {object} [options] - Change-detection options + * @param {string} [options.extension] - Destination extension override + * @param {(filePath: string) => string} [options.transformPath] - Absolute destination path resolver + * @returns {Transform} Object-mode transform + */ +export default function createChangedFilter(destination, options = {}) { + return new Transform({ + objectMode: true, + async transform(file, _enc, cb) { + if (!file || !file.path || hasGlobPattern(file.path)) { + cb(null, file) + return + } + + try { + const destinationPath = buildDestinationPath(file, { + destination, + extension: options.extension, + transformPath: options.transformPath, + }) + const shouldProcess = await hasChanged(file.path, destinationPath) + + cb(null, shouldProcess ? file : null) + } catch (error) { + cb(error) + } + }, + }) +} diff --git a/gulp/utils/content-metrics.js b/gulp/utils/content-metrics.js new file mode 100644 index 0000000..3cbbf45 --- /dev/null +++ b/gulp/utils/content-metrics.js @@ -0,0 +1,29 @@ +/** + * Calculates the estimated reading time for a given content string. + * @param {string} content - The content to analyze. + * @param {object} [options] - Configuration options. + * @param {number} [options.wordsPerMinute] - Words read per minute. + * @returns {{minutes: number, words: number}} An object containing minutes and word count. + */ +export function calculateReadingTime(content, { wordsPerMinute = 200 } = {}) { + if (wordsPerMinute <= 0) { + throw new Error('wordsPerMinute must be positive.') + } + + if (!content || typeof content !== 'string') { + return { minutes: 0, words: 0 } + } + + // Simple Markdown stripping + const cleanContent = content + .replace(/^#+\s+/gm, '') // Headers + .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') // Links + .replace(/[*_]{1,3}([^*_]+)[*_]{1,3}/g, '$1') // Bold/Italic + .replace(/`{1,3}[^`]+`{1,3}/g, '') // Code blocks/inline code (usually not read aloud or at same speed) + .trim() + + const words = cleanContent.split(/\s+/).filter(Boolean).length + const minutes = Math.ceil(words / wordsPerMinute) + + return { minutes, words } +} diff --git a/gulp/utils/core.js b/gulp/utils/core.js new file mode 100644 index 0000000..59ccb63 --- /dev/null +++ b/gulp/utils/core.js @@ -0,0 +1,334 @@ +import fs from 'node:fs' +import path from 'node:path' +import process from 'node:process' +import { Transform } from 'node:stream' +import { finished } from 'node:stream/promises' + +import logger from './logger.js' + +const MAX_TRACKED_LOGS = 100 + +/** + * Gulp Transform: Validates file integrity during the pipeline. + * Throws an error if a file is empty or corrupted, preventing silent build failures. + * @param {object} [options] - Integrity options + * @param {number} [options.minSize] - Minimum allowed file size in bytes + * @param {string} [options.taskName] - Name of the task for logging + * @param {boolean} [options.skipIntegrity] - Whether to bypass the check + * @returns {import('node:stream').Transform} A Gulp-compatible transform stream + */ +export function ensureFileIntegrity({ + minSize = 1, + taskName = 'Unknown', + skipIntegrity = false, +} = {}) { + return new Transform({ + objectMode: true, + transform(file, _enc, cb) { + if (skipIntegrity || file.isNull()) { + return cb(null, file) + } + if (file.isStream()) { + return cb( + new Error(`[${taskName}] Streaming is not supported. Use buffers.`) + ) + } + + const size = file.contents.length + if (size < minSize) { + const fileName = file.path ? path.basename(file.path) : 'unnamed file' + return cb( + new Error( + `[${taskName}] Integrity check failed: ${fileName} is empty (${size} bytes).` + ) + ) + } + + cb(null, file) + }, + }) +} + +/** + * Environment Variable Utility. + * Retrieves a value from an environment object with type-safe conversion. + * @param {string} key - The environment variable name + * @param {string|number|boolean|null|undefined} [fallback] - Value to return if the key is undefined + * @param {Record} [env] - The environment object to read from + * @returns {string|boolean|number|string|number|boolean|null|undefined} The processed value + */ +export function getEnv(key, fallback, env = process.env) { + const rawValue = env[key] + if (rawValue === undefined) { + return fallback + } + const value = String(rawValue) + const lower = value.toLowerCase() + if (lower === 'true') { + return true + } + if (lower === 'false') { + return false + } + if (!isNaN(Number(value)) && value.trim() !== '') { + return Number(value) + } + return rawValue +} + +/** + * Converts common environment flag values to boolean. + * @param {unknown} value - Raw environment variable value + * @returns {boolean} True for enabled-like values + */ +export function toBooleanFlag(value) { + if (typeof value === 'boolean') { + return value + } + const normalized = String(value || '') + .trim() + .toLowerCase() + return ['1', 'true', 'yes', 'on', 'enabled'].includes(normalized) +} + +/** + * Normalizes a path string to POSIX format (forward slashes). + * Gulp and globbing libraries require forward slashes for cross-platform consistency. + * @param {string} pathString - Source path string. + * @returns {string} Normalized POSIX path. + */ +export function toPosixPath(pathString) { + if (typeof pathString !== 'string') { + return pathString + } + return pathString.replace(/\\/g, '/') +} + +/** + * Returns the relative path of a file or directory from the current execution context. + * @param {string} absolutePath - The full path to resolve + * @returns {string} The relative path + */ +export function getRelativePath(absolutePath) { + return path.relative(process.cwd(), absolutePath) +} + +/** + * Ensures that directories exist by creating them recursively if necessary. + * @param {string|string[]} targetPath - Target directory path or array of paths + * @param {object} [loggerInstance] - Optional logger for reporting creation + * @param {function(string): void} loggerInstance.debug - Debug logging function + * @returns {Promise} + */ +export async function ensureDirectoryExists(targetPath, loggerInstance) { + if (Array.isArray(targetPath)) { + await Promise.all( + targetPath.map((p) => ensureDirectoryExists(p, loggerInstance)) + ) + return + } + + await fs.promises.mkdir(targetPath, { recursive: true }) + if (loggerInstance) { + loggerInstance.debug(`Ensured directory: ${getRelativePath(targetPath)}`) + } +} + +/** + * Determines if a file path points to a "private" file or directory. + * @param {string} filePath - Path to evaluate + * @returns {boolean} True if the file or any parent directory in its path is private + */ +export function isPrivateFile(filePath) { + if (!filePath) { + return false + } + const segments = filePath.split(/[/\\]/) + return segments.some((segment) => segment.startsWith('_')) +} + +/** + * Normalizes a string into kebab-case (lowercase, dash-separated). + * @param {string} input - Source string + * @returns {string} kebab-case result + */ +export function toKebabCase(input) { + return String(input) + .trim() + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, '') +} + +/** + * Extracts a clean directory path from a glob pattern. + * @param {string|string[]} pattern - The glob pattern + * @returns {string} The base directory + */ +export function getDirFromGlob(pattern) { + if (!pattern || pattern.length === 0) { + return '' + } + + const base = Array.isArray(pattern) ? pattern[0] : pattern + const firstStarIndex = base.indexOf('*') + + if (firstStarIndex === -1) { + return path.dirname(base) + } + + const sub = base.substring(0, firstStarIndex) + const lastSlash = Math.max(sub.lastIndexOf('/'), sub.lastIndexOf('\\')) + return sub.substring(0, lastSlash + 1) +} + +/** + * Checks if the provided inputs are empty and logs a warning if they are. + * @param {string|string[]|null|undefined} target - Path(s), string or array to validate + * @param {string} logMessage - Message to display if the target is considered empty + * @returns {boolean} True if empty + */ +export function handleEmptyPaths(target, logMessage) { + const isEmpty = + !target || + (Array.isArray(target) && target.length === 0) || + (typeof target === 'string' && target.trim() === '') + if (isEmpty) { + logger.verbose(logMessage) + return true + } + return false +} + +/** + * Wraps a Gulp/Node stream into a modern Promise using native Node.js finished(). + * Ensures that if a stream hangs or fails, it is properly closed. + * @param {import('node:stream').Stream} stream - Node.js stream to promisify + * @returns {Promise} Promise resolving with the stream upon completion + */ +export async function streamToPromise(stream) { + if (!stream || typeof stream.on !== 'function') { + return stream + } + + if (typeof stream.resume === 'function') { + stream.resume() + } + + try { + await finished(stream) + } catch (err) { + if (typeof stream.destroy === 'function') { + stream.destroy() + } + throw err + } + + return stream +} + +/** + * Attaches consistent end/error logging to a Gulp pipeline. + * Forces stream destruction on error to prevent hangs. + * @param {object} options - Logging options + * @param {import('node:stream').Stream} options.stream - Target stream + * @param {{info: function(string, ...unknown): void, list: function(string, string[]): void, debug: function(string): void, error: function(string, ...unknown): void}} options.loggerInstance - Logger object + * @param {string[]} [options.trackedFiles] - List of processed files + * @param {function(string): string} [options.formatFilePath] - Optional formatter for file output + * @param {string} options.successLabel - Label prefix for generated assets + * @param {string} options.emptyMessage - Message used when no files were processed + * @param {string} options.errorMessage - Message used when stream emits error + * @returns {import('node:stream').Stream} The same stream for chaining + */ +export function attachPipelineLogging({ + stream, + loggerInstance, + trackedFiles = [], + formatFilePath = (p) => p, + successLabel, + emptyMessage, + errorMessage, +}) { + function onStreamEnd() { + if (trackedFiles.length > 0) { + const displayCount = Math.min(trackedFiles.length, MAX_TRACKED_LOGS) + const list = trackedFiles.slice(0, displayCount).map(formatFilePath) + + if (trackedFiles.length > MAX_TRACKED_LOGS) { + list.push(`... and ${trackedFiles.length - MAX_TRACKED_LOGS} more`) + } + + loggerInstance.info(`${successLabel} [${trackedFiles.length} files]`) + loggerInstance.list(successLabel, list) + } else { + loggerInstance.debug(emptyMessage) + } + cleanup() + } + + function onStreamError(err) { + loggerInstance.error(`${errorMessage} Cause: ${err.message}`) + if (typeof stream.destroy === 'function') { + stream.destroy() + } + cleanup() + } + + function cleanup() { + stream.removeListener('end', onStreamEnd) + stream.removeListener('error', onStreamError) + } + + stream.on('end', onStreamEnd) + stream.on('error', onStreamError) + + return stream +} + +/** + * Predicate to suppress specific console warnings commonly emitted by legacy Bootstrap. + * @param {string} message - Warning message string + * @returns {boolean} True if the message matches suppression criteria + */ +export function suppressOutdatedBootstrapWarnings(message) { + const SUPPRESSED_PATTERNS = [ + 'Deprecation', + 'deprecated', + 'legacy', + 'slash as division', + ] + + return ( + typeof message === 'string' && + SUPPRESSED_PATTERNS.some((p) => + message.toLowerCase().includes(p.toLowerCase()) + ) + ) +} + +/** + * Removes files from a directory that do NOT match a specific pattern. + * Used for production cleanup of non-fingerprinted assets. + * @param {string} dir - Target directory + * @param {RegExp} regex - Pattern of files to PRESERVE + * @param {string} label - Label for logging + * @param {object} loggerInstance - Logger for reporting + * @returns {Promise} + */ +export async function cleanupDir(dir, regex, label, loggerInstance) { + try { + const entries = await fs.promises.readdir(dir, { withFileTypes: true }) + for (const entry of entries) { + if (entry.isDirectory()) { + continue + } + if (regex.test(entry.name)) { + continue + } + await fs.promises.unlink(path.join(dir, entry.name)) + loggerInstance.info(`Removed ${label}: ${entry.name}`) + } + } catch (err) { + loggerInstance.warn(`Failed to clean up ${label} in ${dir}:`, err) + } +} diff --git a/gulp/utils/html-output.js b/gulp/utils/html-output.js new file mode 100644 index 0000000..605b1e7 --- /dev/null +++ b/gulp/utils/html-output.js @@ -0,0 +1,125 @@ +import path from 'node:path' + +const GLOBAL_ASSET_PRIORITY = { + fonts: 5, + bootstrap: 10, + components: 20, + custom: 30, + main: 40, + utils: 50, + 'u-devstack': 100, +} + +/** + * Builds URL path used for injected CSS/JS tags. + * @param {string} filepath - Asset file path. + * @param {string} buildOutputPath - Build output directory path. + * @returns {string} Public URL path. + */ +export function resolveInjectionUrl(filepath, buildOutputPath) { + const buildRoot = path.resolve(buildOutputPath) + const absoluteAssetPath = path.resolve(filepath) + const relativeToBuild = path.relative(buildRoot, absoluteAssetPath) + const urlPath = `/${relativeToBuild.replace(/\\/g, '/')}` + return urlPath.replace(/\/+/g, '/') +} + +/** + * Strips XHTML-style self-closing slashes from HTML5 void elements only. + * @param {string} html - Input HTML string. + * @returns {string} Cleaned HTML string. + */ +export function stripXhtmlSlashes(html) { + const voids = + 'area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr' + const pattern = new RegExp(`<(${voids})\\b([^>]*)/>`, 'gi') + const closingPattern = new RegExp(``, 'gi') + return html + .replace(pattern, function replaceVoidTags(_, tag, attrs) { + return `<${tag}${attrs.trimEnd()}>` + }) + .replace(closingPattern, '') +} + +function findProtectedCommentRanges(html) { + const ranges = [] + const tagPattern = /<\/?(script|style)\b[^>]*>/gi + const stack = [] + let match + + while ((match = tagPattern.exec(html)) !== null) { + const [tagText, tagName] = match + const isClosingTag = tagText.startsWith(' range.start && offset < range.end + }) +} + +/** + * Clears HTML comments except IE conditionals and script/style content. + * @param {string} html - Input HTML string. + * @returns {string} Cleaned HTML string. + */ +export function cleanHtmlComments(html) { + const protectedRanges = findProtectedCommentRanges(html) + + return html.replace( + //g, + function preserveProtectedComments(match, offset) { + return isInsideRange(offset, protectedRanges) ? match : '' + } + ) +} + +/** + * Removes trailing whitespace from every HTML line while preserving line order. + * @param {string} html - Input HTML string. + * @returns {string} HTML without trailing line whitespace. + */ +export function stripTrailingLineWhitespace(html) { + return html + .split('\n') + .map(function trimLineEnd(line) { + return line.replace(/[ \t]+$/u, '') + }) + .join('\n') +} + +function getGlobalAssetPriority(filepath) { + const name = path.basename(filepath).toLowerCase() + + for (const [key, priority] of Object.entries(GLOBAL_ASSET_PRIORITY)) { + if (name.includes(key)) { + return priority + } + } + + return 100 +} + +/** + * Sorts discovered global asset paths by explicit build priority. + * @param {string[]} assetPaths - Asset file paths discovered in the build output. + * @returns {string[]} Sorted asset paths. + */ +export function sortGlobalAssetPaths(assetPaths) { + return [...assetPaths].sort(function compareAssetPriority(left, right) { + return getGlobalAssetPriority(left) - getGlobalAssetPriority(right) + }) +} diff --git a/gulp/utils/html-rendering.js b/gulp/utils/html-rendering.js new file mode 100644 index 0000000..c32a1a9 --- /dev/null +++ b/gulp/utils/html-rendering.js @@ -0,0 +1,147 @@ +import { + cleanHtmlComments, + resolveInjectionUrl, + stripTrailingLineWhitespace, + stripXhtmlSlashes, +} from './html-output.js' + +const DEFAULT_DATE_LOCALE = 'en' +const DEFAULT_DATE_TIMEZONE = 'UTC' + +function buildGlobalContext({ siteData = {}, menuData = {} } = {}) { + return { + ...siteData, + ...menuData, + } +} + +function buildTemplateContext({ + pageData = {}, + globalContext = {}, + config, + pageStyles = [], + pageScripts = [], + isPrivate, +}) { + const context = { + ...pageData, + page: pageData, + site: globalContext, + config, + pageStyles, + pageScripts, + } + + if (typeof isPrivate === 'function') { + context.isPrivate = isPrivate + } + + return context +} + +function formatTemplateDate(input, format) { + const date = input === 'now' || !input ? new Date() : new Date(input) + + if (isNaN(date.getTime())) { + return new Date().getFullYear() + } + + if (format === 'YYYY') { + return date.getUTCFullYear() + } + + if (format && typeof format === 'object') { + return new Intl.DateTimeFormat(DEFAULT_DATE_LOCALE, { + timeZone: DEFAULT_DATE_TIMEZONE, + ...format, + }).format(date) + } + + return date.toISOString() +} + +function createNunjucksOptions(config, templatesPath, markdown) { + return { + path: templatesPath, + inheritExtension: false, + envOptions: { + autoescape: false, + trimBlocks: true, + lstripBlocks: true, + noCache: config.version === 'dev', + }, + manageEnv: (env) => { + const md = markdown({ html: true }) + + env.addFilter('md', (str, inline = false) => { + if (!str) { + return '' + } + return inline ? md.renderInline(str) : md.render(str) + }) + + env.addFilter('mdInline', (str) => { + if (!str) { + return '' + } + return md.renderInline(str) + }) + + env.addFilter('date', formatTemplateDate) + }, + } +} + +function transformInjectedAsset(filepath, buildPath) { + const cleanUrl = resolveInjectionUrl(filepath, buildPath) + if (filepath.endsWith('.css')) { + return `` + } + if (filepath.endsWith('.js')) { + return `` + } + return filepath +} + +function createHtmlNormalizationTransform(Transform) { + return new Transform({ + objectMode: true, + transform(file, _enc, cb) { + const content = file.contents.toString() + file.contents = Buffer.from( + stripTrailingLineWhitespace( + cleanHtmlComments(stripXhtmlSlashes(content)) + ) + ) + cb(null, file) + }, + }) +} + +function createProcessedFilesTracker( + Transform, + processedFiles, + getRelativePath +) { + return new Transform({ + objectMode: true, + transform(file, _enc, cb) { + if (file?.path) { + processedFiles.push(getRelativePath(file.path)) + } + cb(null, file) + }, + }) +} + +const htmlRenderingApi = { + buildGlobalContext, + buildTemplateContext, + createHtmlNormalizationTransform, + createNunjucksOptions, + createProcessedFilesTracker, + formatTemplateDate, + transformInjectedAsset, +} + +export default htmlRenderingApi diff --git a/gulp/utils/image-helpers.js b/gulp/utils/image-helpers.js new file mode 100644 index 0000000..9f7fb7e --- /dev/null +++ b/gulp/utils/image-helpers.js @@ -0,0 +1,107 @@ +import sharp from 'sharp' + +const PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47] +const JPG_SIGNATURE = [0xff, 0xd8, 0xff] +const WEBP_SIGNATURE = { + riff: [0x52, 0x49, 0x46, 0x46], + webp: [0x57, 0x45, 0x42, 0x50], +} + +function matchesSignature(buffer, startIndex, signature) { + return signature.every((byte, index) => buffer[startIndex + index] === byte) +} + +function isPngBuffer(buffer) { + return buffer.length >= 4 && matchesSignature(buffer, 0, PNG_SIGNATURE) +} + +function isJpgBuffer(buffer) { + return buffer.length >= 3 && matchesSignature(buffer, 0, JPG_SIGNATURE) +} + +function isWebpBuffer(buffer) { + return ( + buffer.length >= 12 && + matchesSignature(buffer, 0, WEBP_SIGNATURE.riff) && + matchesSignature(buffer, 8, WEBP_SIGNATURE.webp) + ) +} + +function isSvgBuffer(buffer) { + const start = buffer.slice(0, 100).toString() + return start.includes('} Data URI string + */ +export async function getLqsPlaceholder(buffer) { + const lqsBuffer = await sharp(buffer) + .resize(20) + .blur(1) + .webp({ quality: 10 }) + .toBuffer() + return `data:image/webp;base64,${lqsBuffer.toString('base64')}` +} + +/** + * Sharp-based optimization logic including AVIF. + * @param {Buffer} buffer - The source image buffer + * @param {'jpg'|'png'|'webp'|'avif'} targetType - Target format + * @param {number} quality - Target quality (0-100) + * @returns {Promise} The optimized image buffer + */ +export async function optimizeWithSharp(buffer, targetType, quality) { + const instance = sharp(buffer).rotate() + + switch (targetType) { + case 'jpg': + return instance + .jpeg({ quality, mozjpeg: true, progressive: true }) + .toBuffer() + case 'webp': + return instance + .webp({ quality, effort: 6, smartSubsample: true }) + .toBuffer() + case 'avif': + return instance + .avif({ quality: Math.max(quality - 20, 40), effort: 9 }) + .toBuffer() + case 'png': + return instance.png({ compressionLevel: 9, effort: 10 }).toBuffer() + default: + return buffer + } +} diff --git a/gulp/utils/image-pipeline.js b/gulp/utils/image-pipeline.js new file mode 100644 index 0000000..1b7c8a4 --- /dev/null +++ b/gulp/utils/image-pipeline.js @@ -0,0 +1,187 @@ +import path from 'node:path' +import { Transform } from 'node:stream' +import gulp from 'gulp' + +import createChangedFilter from './changed-filter.js' +import { + detectType, + getLqsPlaceholder, + optimizeWithSharp, +} from './image-helpers.js' +import { + attachPipelineLogging, + getRelativePath, + streamToPromise, +} from './index.js' + +function getOutputAssetPath(filePath, dest) { + return getRelativePath(path.join(dest, path.basename(filePath))) +} + +function markProcessedFile(processedFiles, filePath, dest) { + processedFiles.push(getOutputAssetPath(filePath, dest)) +} + +function isCorruptedUtf8Replacement(buffer) { + return buffer[0] === 0xef && buffer[1] === 0xbf && buffer[2] === 0xbd +} + +function createImageValidationTransform(logger) { + return new Transform({ + objectMode: true, + transform(file, _enc, cb) { + if (!file.isBuffer()) { + return cb(null, file) + } + + const fileName = path.basename(file.path) + if (file.contents.length === 0) { + logger.warn(`Skipping empty file: ${fileName}`) + file._isInvalid = true + return cb(null, file) + } + + if (isCorruptedUtf8Replacement(file.contents)) { + logger.error(`${fileName} is BINARY CORRUPTED. Dropping.`) + file._isInvalid = true + return cb(null, file) + } + + const actualType = detectType(file.contents) + if (!actualType) { + logger.warn(`Skipping ${fileName}: Unknown signature.`) + file._isInvalid = true + } + + cb(null, file) + }, + }) +} + +async function optimizeRasterFile(file, options) { + const { targetType, quality, lqs, logger, logPrefix } = options + const original = file.contents + + if (lqs) { + const placeholder = await getLqsPlaceholder(original) + logger.info( + `[LQS] ${path.basename(file.path)}: ${placeholder.slice(0, 50)}...` + ) + } + + const optimized = await optimizeWithSharp(original, targetType, quality) + const savedBytes = original.length - optimized.length + const percentSaved = Math.round((savedBytes / original.length) * 100) + const shouldKeepOptimized = + targetType === 'webp' || + targetType === 'avif' || + optimized.length < original.length + + if (!shouldKeepOptimized) { + logger.verbose( + `[${logPrefix}] Keeping original ${path.basename(file.path)} (optimized was larger)` + ) + return file + } + + file.contents = optimized + file.path = file.path.replace(path.extname(file.path), `.${targetType}`) + if (percentSaved > 10) { + logger.verbose( + `[${logPrefix}] ${path.basename(file.path)} optimized: -${percentSaved}% (${(savedBytes / 1024).toFixed(1)} KB saved)` + ) + } + + return file +} + +function createRasterOptimizationTransform(options) { + const { targetType, quality, lqs, logger, logPrefix, processedFiles, dest } = + options + + return new Transform({ + objectMode: true, + async transform(file, _enc, cb) { + if (file._isInvalid) { + return cb(null, null) + } + + try { + const optimizedFile = await optimizeRasterFile(file, { + targetType, + quality, + lqs, + logger, + logPrefix, + }) + markProcessedFile(processedFiles, optimizedFile.path, dest) + cb(null, optimizedFile) + } catch (error) { + logger.error( + `Image optimization failed for ${path.basename(file.path)}. Cause: ${error.message}. Falling back to original.` + ) + markProcessedFile(processedFiles, file.path, dest) + cb(null, file) + } + }, + }) +} + +async function executeRasterTask(options) { + const { + src, + dest, + targetType, + logger, + logPrefix = 'Images', + quality = 85, + lqs = false, + } = options + const processedFiles = [] + + const pipeline = gulp + .src(src, { encoding: false }) + .pipe( + createChangedFilter(dest, { + extension: `.${targetType}`, + }) + ) + .pipe(createImageValidationTransform(logger)) + .pipe( + createRasterOptimizationTransform({ + targetType, + quality, + lqs, + logger, + logPrefix, + processedFiles, + dest, + }) + ) + .pipe(gulp.dest(dest)) + + attachPipelineLogging({ + stream: pipeline, + loggerInstance: logger, + trackedFiles: processedFiles, + successLabel: `[${logPrefix}] Processed assets`, + emptyMessage: `[${logPrefix}] No new ${targetType.toUpperCase()} needed.`, + errorMessage: `[${logPrefix}] Error:`, + }) + + try { + await streamToPromise(pipeline) + } catch (error) { + logger.error( + `[${logPrefix}] Optimization pipeline failed. Cause: ${error.message}` + ) + throw error + } +} + +const imagePipelineApi = { + createImageValidationTransform, + executeRasterTask, +} + +export default imagePipelineApi diff --git a/gulp/utils/index.js b/gulp/utils/index.js new file mode 100644 index 0000000..87e8e8b --- /dev/null +++ b/gulp/utils/index.js @@ -0,0 +1,36 @@ +import loggerLib from './logger.js' + +export { + attachPipelineLogging, + cleanupDir, + ensureDirectoryExists, + ensureFileIntegrity, + getDirFromGlob, + getEnv, + getRelativePath, + handleEmptyPaths, + isPrivateFile, + streamToPromise, + suppressOutdatedBootstrapWarnings, + toKebabCase, +} from './core.js' +export { + cleanHtmlComments, + resolveInjectionUrl, + stripXhtmlSlashes, +} from './html-output.js' +export { + clearRouteAssetCache, + discoverRouteScripts, + discoverRouteStyles, +} from './navigation-assets.js' +export { + detectType, + getLqsPlaceholder, + optimizeWithSharp, +} from './image-helpers.js' +export { calculateReadingTime } from './content-metrics.js' +export { createLogger } from './logger.js' +export { loggerLib as logger } + +export default loggerLib diff --git a/gulp/utils/logger.js b/gulp/utils/logger.js new file mode 100644 index 0000000..cb63305 --- /dev/null +++ b/gulp/utils/logger.js @@ -0,0 +1,120 @@ +import pc from 'picocolors' + +const LOG_CONFIG = { + error: { char: 'β–ˆ', color: pc.red }, + warn: { char: 'β–ˆ', color: pc.yellow }, + info: { char: 'β–’', color: pc.cyan }, + debug: { char: 'β–‘', color: pc.gray }, + verbose: { char: 'β–‘', color: pc.gray }, +} + +function formatList(header, items) { + if (!items || items.length === 0) { + return header + } + return `${header}:\n${items + .map((item) => ` ${pc.dim('-')} ${pc.gray(item)}`) + .join('\n')}` +} + +function composePrefix(level, subLabel = '') { + const levelConfig = LOG_CONFIG[level] || LOG_CONFIG.info + const uppercaseLabel = level.toUpperCase() + + const levelTag = `[${uppercaseLabel}]` + // Create consistent padding for tags + const barLength = Math.max(0, 9 - levelTag.length) + const separatorBars = levelConfig.char.repeat(barLength) + + const basePrefix = levelConfig.color( + `${levelConfig.char} ${levelTag} ${separatorBars}` + ) + const categoryIndicator = subLabel ? ` ${pc.bold(`[${subLabel}]`)}` : '' + + return `${basePrefix}${categoryIndicator}` +} + +function dispatch(level, subLabel, ...data) { + const prefix = composePrefix(level, subLabel) + if (level === 'error') { + console.error(prefix, ...data) + return + } + if (level === 'warn') { + console.warn(prefix, ...data) + return + } + console.log(prefix, ...data) +} + +function isDebugEnabled() { + const envLevel = String(process.env.LOG_LEVEL || '').toLowerCase() + return Boolean( + process.env.DEBUG || + process.env.VERBOSE || + ['debug', 'verbose', 'silly'].includes(envLevel) + ) +} + +function isVerboseEnabled() { + const envLevel = String(process.env.LOG_LEVEL || '').toLowerCase() + return Boolean(process.env.VERBOSE || ['verbose', 'silly'].includes(envLevel)) +} + +function error(...args) { + dispatch('error', '', ...args) +} + +function warn(...args) { + dispatch('warn', '', ...args) +} + +function info(...args) { + dispatch('info', '', ...args) +} + +function debug(...args) { + if (!isDebugEnabled()) { + return + } + dispatch('debug', '', ...args) +} + +function verbose(...args) { + if (!isVerboseEnabled()) { + return + } + dispatch('verbose', '', ...args) +} + +/** + * Creates a category-scoped logger. + * @param {string} categoryName - Category shown in log prefixes. + * @returns {object} Logger API. + */ +export function createLogger(categoryName) { + return { + error: (...args) => dispatch('error', categoryName, ...args), + warn: (...args) => dispatch('warn', categoryName, ...args), + info: (...args) => dispatch('info', categoryName, ...args), + debug: (...args) => + isDebugEnabled() && dispatch('debug', categoryName, ...args), + verbose: (...args) => + isVerboseEnabled() && dispatch('verbose', categoryName, ...args), + list: (header, items) => + isDebugEnabled() && + dispatch('debug', categoryName, formatList(header, items)), + } +} + +export default { + error, + warn, + info, + debug, + verbose, + formatList, + createLogger, + isDebugEnabled, + isVerboseEnabled, +} diff --git a/gulp/utils/navigation-assets.js b/gulp/utils/navigation-assets.js new file mode 100644 index 0000000..a86da8a --- /dev/null +++ b/gulp/utils/navigation-assets.js @@ -0,0 +1,130 @@ +import fs from 'node:fs' +import path from 'node:path' + +import { resolveInjectionUrl } from './html-output.js' + +const ASSET_MANIFEST_CACHE = new Map() + +function normalizeAssetEntry(entry) { + return entry.replace(/\\/g, '/') +} + +function getAssetCandidateNames(routeRelDir, routeBaseName, extensions) { + let pageAssetName = routeRelDir !== '.' ? routeRelDir : routeBaseName + if (pageAssetName === 'index') { + pageAssetName = 'home' + } + + if (routeRelDir !== '.') { + return [ + ...extensions.map((ext) => `${routeRelDir}/${routeBaseName}${ext}`), + ...extensions.map((ext) => `${pageAssetName}${ext}`), + ...extensions.map((ext) => `${pageAssetName}/index${ext}`), + ] + } + + return [ + ...extensions.map((ext) => `${routeBaseName}${ext}`), + ...extensions.map((ext) => `${pageAssetName}/index${ext}`), + ] +} + +async function getAssetManifest(assetDir) { + if (ASSET_MANIFEST_CACHE.has(assetDir)) { + return ASSET_MANIFEST_CACHE.get(assetDir) + } + + try { + const entries = await fs.promises.readdir(assetDir, { recursive: true }) + const manifest = new Set(entries.map(normalizeAssetEntry)) + ASSET_MANIFEST_CACHE.set(assetDir, manifest) + return manifest + } catch { + return null + } +} + +async function discoverRouteAssets( + routeRelDir, + routeBaseName, + outputBase, + { subDir = 'css', extensions = ['.css'] } = {} +) { + const assetDir = path.resolve(outputBase, 'assets', subDir) + const manifest = await getAssetManifest(assetDir) + if (!manifest) { + return [] + } + + const discovered = [] + for (const name of getAssetCandidateNames( + routeRelDir, + routeBaseName, + extensions + )) { + const normalizedName = normalizeAssetEntry(name) + if (!manifest.has(normalizedName)) { + continue + } + + const fullPath = path.resolve(assetDir, normalizedName) + const url = resolveInjectionUrl(fullPath, outputBase) + if (!discovered.includes(url)) { + discovered.push(url) + } + } + + return discovered +} + +/** + * Clears cached route asset manifests before HTML rerendering. + * @returns {void} + */ +export function clearRouteAssetCache() { + ASSET_MANIFEST_CACHE.clear() +} + +/** + * Discovers and returns URL paths for route-specific CSS assets. + * @param {string} routeRelDir - Relative directory of the route. + * @param {string} routeBaseName - Base name of the route file. + * @param {string} outputBase - Build output directory. + * @returns {Promise} Discovered style URLs. + */ +export async function discoverRouteStyles( + routeRelDir, + routeBaseName, + outputBase +) { + return discoverRouteAssets(routeRelDir, routeBaseName, outputBase, { + subDir: 'css', + extensions: ['.css', '.min.css'], + }) +} + +/** + * Discovers and returns URL paths for route-specific JS assets. + * @param {string} routeRelDir - Relative directory of the route. + * @param {string} routeBaseName - Base name of the route file. + * @param {string} outputBase - Build output directory. + * @returns {Promise} Discovered script URLs. + */ +export async function discoverRouteScripts( + routeRelDir, + routeBaseName, + outputBase +) { + return discoverRouteAssets(routeRelDir, routeBaseName, outputBase, { + subDir: 'js', + extensions: ['.js'], + }) +} + +const navigationAssetsApi = { + clearRouteAssetCache, + discoverRouteScripts, + discoverRouteStyles, +} + +export default navigationAssetsApi diff --git a/gulp/utils/private-streams.js b/gulp/utils/private-streams.js new file mode 100644 index 0000000..35ad187 --- /dev/null +++ b/gulp/utils/private-streams.js @@ -0,0 +1,41 @@ +import { Transform } from 'node:stream' + +/** + * @param {(filePath: string) => boolean} isPrivateFile - Predicate for ignoring private files. + * @returns {Transform} Object-mode filter that removes private files from a stream. + */ +export function createPrivateFileFilter(isPrivateFile) { + return new Transform({ + objectMode: true, + transform(file, _enc, cb) { + if (isPrivateFile(file.path)) { + return cb(null, null) + } + cb(null, file) + }, + }) +} + +/** + * @param {string[]} trackedFiles - Mutable array used for logging output files. + * @param {(targetPath: string) => string} getRelativePath - Relative path formatter. + * @returns {Transform} Object-mode tracker that records emitted file paths. + */ +export function createTrackedFileCollector(trackedFiles, getRelativePath) { + return new Transform({ + objectMode: true, + transform(file, _enc, cb) { + if (file?.path) { + trackedFiles.push(getRelativePath(file.path)) + } + cb(null, file) + }, + }) +} + +const privateStreamsApi = { + createPrivateFileFilter, + createTrackedFileCollector, +} + +export default privateStreamsApi diff --git a/gulp/utils/route-data.js b/gulp/utils/route-data.js new file mode 100644 index 0000000..43969b3 --- /dev/null +++ b/gulp/utils/route-data.js @@ -0,0 +1,367 @@ +import fs from 'node:fs/promises' +import path from 'node:path' + +import { siteDefaults } from '../../src/config/site.js' +import { toPosixPath } from './core.js' + +const ROUTE_DATA_ARTIFACTS_DIRNAME = 'pages' +const SITE_DATA_ARTIFACT_FILENAME = 'site.json' +const MENU_DATA_ARTIFACT_FILENAME = 'menu.json' + +/** + * Returns the directory that stores route data artifacts. + * @param {string} tempBase - Temporary build directory. + * @returns {string} Route data artifacts directory. + */ +export function getRouteDataArtifactsDir(tempBase) { + return path.join(tempBase, ROUTE_DATA_ARTIFACTS_DIRNAME) +} + +/** + * Returns the path to the site metadata artifact. + * @param {string} tempBase - Temporary build directory. + * @returns {string} Site data artifact path. + */ +export function getSiteDataArtifactPath(tempBase) { + return path.join(tempBase, SITE_DATA_ARTIFACT_FILENAME) +} + +/** + * Returns the path to the route menu artifact. + * @param {string} artifactsBase - Route data artifacts directory. + * @returns {string} Menu artifact path. + */ +export function getMenuDataArtifactPath(artifactsBase) { + return path.join(artifactsBase, MENU_DATA_ARTIFACT_FILENAME) +} + +/** + * Returns the path to a route page data artifact. + * @param {object} options - Artifact parameters. + * @param {string} options.artifactsBase - Route data artifacts directory. + * @param {string} options.routesBase - Routes source directory. + * @param {string} options.filePath - Route file path. + * @returns {string} Page data artifact path. + */ +export function getPageDataArtifactPath({ + artifactsBase, + routesBase, + filePath, +}) { + const relativeFilePath = path.relative(routesBase, filePath) + const outputFileName = relativeFilePath.replace( + path.extname(filePath), + '.json' + ) + return path.join(artifactsBase, outputFileName) +} + +async function readJsonArtifact(targetPath, fallbackValue) { + try { + const content = await fs.readFile(targetPath, 'utf8') + return JSON.parse(content) + } catch (error) { + if (error.code === 'ENOENT') { + return fallbackValue + } + + throw new Error(`Failed to read route artifact: ${targetPath}`, { + cause: error, + }) + } +} + +/** + * Loads the page-data artifact for a route file. + * @param {object} options - Artifact parameters. + * @param {string} options.artifactsBase - Route data artifacts directory. + * @param {string} options.routesBase - Routes source directory. + * @param {string} options.filePath - Route file path. + * @returns {Promise>} Parsed page data or an empty object. + */ +export async function loadPageDataArtifact({ + artifactsBase, + routesBase, + filePath, +}) { + const artifactPath = getPageDataArtifactPath({ + artifactsBase, + routesBase, + filePath, + }) + + return readJsonArtifact(artifactPath, {}) +} + +/** + * Loads the global site and menu artifacts used by HTML rendering. + * @param {string} tempBase - Temporary build directory. + * @returns {Promise<{siteData: Record, menuData: Record}>} Parsed site and menu artifacts for template rendering. + */ +export async function loadRouteArtifactsContext(tempBase) { + const artifactsBase = getRouteDataArtifactsDir(tempBase) + const [siteData, menuData] = await Promise.all([ + readJsonArtifact(getSiteDataArtifactPath(tempBase), {}), + readJsonArtifact(getMenuDataArtifactPath(artifactsBase), {}), + ]) + + return { siteData, menuData } +} + +/** + * Writes a page-data artifact for a route file. + * @param {object} options - Artifact parameters. + * @param {string} options.artifactsBase - Route data artifacts directory. + * @param {string} options.routesBase - Routes source directory. + * @param {string} options.filePath - Route file path. + * @param {Record} options.pageData - Normalized page payload. + * @returns {Promise} Written artifact path. + */ +export async function writePageDataArtifact({ + artifactsBase, + routesBase, + filePath, + pageData, +}) { + const artifactPath = getPageDataArtifactPath({ + artifactsBase, + routesBase, + filePath, + pageData, + }) + + await fs.mkdir(path.dirname(artifactPath), { recursive: true }) + await fs.writeFile(artifactPath, JSON.stringify(pageData, null, 2)) + + return artifactPath +} + +/** + * Writes the shared menu artifact. + * @param {string} artifactsBase - Route data artifacts directory. + * @param {object[]} menuEntries - Raw route menu entries. + * @returns {Promise} Written artifact path. + */ +export async function writeMenuDataArtifact(artifactsBase, menuEntries) { + const menuFile = getMenuDataArtifactPath(artifactsBase) + const menuData = buildMenuData(menuEntries) + + await fs.mkdir(path.dirname(menuFile), { recursive: true }) + await fs.writeFile(menuFile, JSON.stringify(menuData, null, 2)) + + return menuFile +} + +/** + * Resolves route-relative folder and final page path for a content file. + * @param {string} filePath - Absolute path to the source file. + * @param {string} fileName - Source file name without extension. + * @param {string} [routesRoot] - Routes root directory. + * @returns {{ relativeDir: string, pagePath: string }} Route location metadata. + */ +export function resolvePageLocation( + filePath, + fileName, + routesRoot = './src/routes' +) { + const absoluteRoutesRoot = toPosixPath(path.resolve(routesRoot)) + const absoluteFilePath = toPosixPath(path.resolve(filePath)) + + const isRouteFile = absoluteFilePath.startsWith(absoluteRoutesRoot) + const relativeDir = isRouteFile + ? toPosixPath( + path.relative(absoluteRoutesRoot, path.dirname(absoluteFilePath)) + ) + : '' + + let pagePath = relativeDir !== '' ? `/${relativeDir}/` : '/' + if (fileName !== 'index') { + pagePath = toPosixPath(path.join(pagePath, fileName)) + if (!pagePath.startsWith('/')) { + pagePath = `/${pagePath}` + } + } + + return { relativeDir, pagePath } +} + +function deepTrimStrings(input) { + if (typeof input === 'string') { + return input.trim() + } + if (Array.isArray(input)) { + return input.map(deepTrimStrings) + } + if (input instanceof Date) { + return input + } + if (input && typeof input === 'object') { + return Object.fromEntries( + Object.entries(input).map(([key, value]) => [key, deepTrimStrings(value)]) + ) + } + return input +} + +/** + * Builds the context used to resolve frontmatter expressions. + * @param {object} options - Context parameters. + * @param {Record} [options.frontmatter] - Page frontmatter. + * @param {Record} [options.siteConfig] - Site metadata. + * @returns {{ site: Record, page: Record }} Expression context. + */ +export function buildRouteExpressionContext({ + frontmatter = {}, + siteConfig = siteDefaults, +}) { + return { + site: { ...siteConfig }, + page: { ...frontmatter }, + } +} + +function normalizeToAbsoluteUrl(url, baseUrl) { + if (!url || /^https?:\/\//.test(url) || !baseUrl) { + return url + } + return `${baseUrl.replace(/\/$/, '')}/${url.replace(/^\//, '')}` +} + +function resolveMetadataUrls(data, baseUrl) { + const IMAGE_KEYS = new Set(['image', 'images', 'thumbnail', 'url']) + if (typeof data === 'string') { + return normalizeToAbsoluteUrl(data, baseUrl) + } + if (Array.isArray(data)) { + return data.map((item) => resolveMetadataUrls(item, baseUrl)) + } + if (data && typeof data === 'object') { + return Object.fromEntries( + Object.entries(data).map(([key, value]) => [ + key, + IMAGE_KEYS.has(key) || (value && typeof value === 'object') + ? resolveMetadataUrls(value, baseUrl) + : value, + ]) + ) + } + return data +} + +/** + * Applies canonical and social metadata defaults to page data. + * @param {Record} jsonData - Existing normalized page data. + * @param {string} pagePath - Calculated page path. + * @param {object} [siteConfig] - Site configuration. + * @param {string} siteConfig.baseUrl - Base URL. + * @returns {Record} Enriched page data. + */ +export function applySeoDefaults( + jsonData, + pagePath, + siteConfig = siteDefaults +) { + const baseNoSlash = (siteConfig.baseUrl || '').replace(/\/$/, '') + const pageCanonicalUrl = `${baseNoSlash}${pagePath}` + + return { + ...jsonData, + seo: { + canonicalSelf: pageCanonicalUrl, + ...(typeof jsonData.seo === 'object' ? jsonData.seo : {}), + }, + openGraph: { + url: pageCanonicalUrl, + ...resolveMetadataUrls( + typeof jsonData.openGraph === 'object' ? jsonData.openGraph : {}, + siteConfig.baseUrl + ), + }, + twitterCards: { + url: pageCanonicalUrl, + ...resolveMetadataUrls( + typeof jsonData.twitterCards === 'object' ? jsonData.twitterCards : {}, + siteConfig.baseUrl + ), + }, + } +} + +/** + * Builds the menu artifact payload from route menu entries. + * @param {object[]} menuEntries - Raw menu entries. + * @returns {{ menu: object[] }} Menu artifact payload. + */ +export function buildMenuData(menuEntries) { + return { + menu: [...menuEntries].sort(function compareMenuOrder(left, right) { + return left.order - right.order + }), + } +} + +/** + * Builds normalized page payload from parsed markdown frontmatter and content. + * @param {object} options - Processing parameters. + * @param {Record} options.frontmatter - Parsed frontmatter fields. + * @param {string} options.content - Markdown content. + * @param {string} options.fileName - Source file name without extension. + * @param {string} options.pagePath - Calculated route path. + * @param {object} [options.options] - Custom options. + * @param {object} [options.siteConfig] - Site configuration. + * @returns {Record} Final page data. + */ +export function buildPageData({ + frontmatter, + content, + fileName, + pagePath, + options = {}, + siteConfig = siteDefaults, +}) { + if (!frontmatter || typeof frontmatter !== 'object') { + throw new Error('Frontmatter must be a valid object.', { + cause: new Error(`Received type: ${typeof frontmatter}`), + }) + } + + const autoPageId = + pagePath === '/' + ? options.homePageId || 'home' + : path.basename(pagePath) || fileName + + const jsonData = { + ...deepTrimStrings(frontmatter), + content: deepTrimStrings(content), + path: pagePath, + fileName, + pageId: frontmatter.pageId || autoPageId, + } + + return applySeoDefaults(jsonData, pagePath, siteConfig) +} + +/** + * Extracts and normalizes menu data for a specific page. + * @param {Record} frontmatter - Parsed frontmatter data. + * @param {string} fileName - Current file name. + * @returns {{ name: string, order: number, show: boolean }} Menu entry. + */ +export function extractMenuEntry(frontmatter, fileName) { + const DEFAULT_ORDER = 999 + const menuMain = frontmatter.menuMain + + if (menuMain && typeof menuMain === 'object') { + return { + name: menuMain.name || frontmatter.title || fileName, + order: menuMain.order ?? DEFAULT_ORDER, + show: menuMain.show !== false, + } + } + + return { + name: frontmatter.menuName || frontmatter.title || fileName, + order: frontmatter.menuOrder ?? DEFAULT_ORDER, + show: frontmatter.showInMenu !== false, + } +} diff --git a/gulp/utils/sass-dependency-cache.js b/gulp/utils/sass-dependency-cache.js new file mode 100644 index 0000000..d12107a --- /dev/null +++ b/gulp/utils/sass-dependency-cache.js @@ -0,0 +1,76 @@ +import fs from 'node:fs/promises' +import { fileURLToPath } from 'node:url' + +function getDependencyManifestPath(cssPath) { + return `${cssPath}.deps.json` +} + +async function readDependencyManifest(dependencyManifestPath, sourceFile) { + try { + const manifest = JSON.parse( + await fs.readFile(dependencyManifestPath, 'utf8') + ) + if (Array.isArray(manifest.dependencies)) { + return manifest.dependencies + } + } catch {} + + return [sourceFile] +} + +async function getNewestDependencyMtime(dependencyPaths) { + const stats = await Promise.all( + dependencyPaths.map(async function statDependency(dependencyPath) { + return fs.stat(dependencyPath) + }) + ) + + return Math.max(...stats.map((stat) => stat.mtimeMs)) +} + +async function shouldSkipUnchangedFile({ + sourceFile, + cssPath, + mapPath, + sourceMaps, +}) { + try { + const cssStats = await fs.stat(cssPath) + const dependencyPaths = await readDependencyManifest( + getDependencyManifestPath(cssPath), + sourceFile + ) + const newestDependencyMtime = + await getNewestDependencyMtime(dependencyPaths) + + if (sourceMaps) { + await fs.access(mapPath) + } + + return cssStats.mtimeMs >= newestDependencyMtime + } catch { + return false + } +} + +async function writeDependencyManifest(cssPath, sassResult, skipNewer) { + if (!skipNewer) { + return + } + + const dependencies = sassResult.loadedUrls + .filter((url) => url.protocol === 'file:') + .map((url) => fileURLToPath(url)) + + await fs.writeFile( + getDependencyManifestPath(cssPath), + JSON.stringify({ dependencies }, null, 2) + ) +} + +const sassDependencyCacheApi = { + shouldSkipUnchangedFile, + writeDependencyManifest, +} + +export default sassDependencyCacheApi diff --git a/gulp/utils/sass-pipeline.js b/gulp/utils/sass-pipeline.js new file mode 100644 index 0000000..daed66f --- /dev/null +++ b/gulp/utils/sass-pipeline.js @@ -0,0 +1,233 @@ +import fs from 'node:fs/promises' +import path from 'node:path' +import { pathToFileURL } from 'node:url' +import pc from 'picocolors' + +import { ensureDirectoryExists, isPrivateFile } from './index.js' +import sassDependencyCache from './sass-dependency-cache.js' + +function buildPostcssPlugins(autoprefixer, cssnano, postcssPlugins, minify) { + const finalPostcssPlugins = [autoprefixer(), ...postcssPlugins] + if (minify) { + finalPostcssPlugins.push(cssnano()) + } + return finalPostcssPlugins +} + +function createMinifiedCssPath(cssPath) { + if (cssPath.includes('.min.css')) { + return cssPath + } + + return cssPath.replace(/\.css$/u, '.min.css') +} + +function resolveOutputCssPath({ + sourceFile, + dest, + base, + outputFilename, + minify, +}) { + const rawCssPath = outputFilename + ? path.join(dest, outputFilename) + : path + .join(dest, path.relative(base || path.dirname(sourceFile), sourceFile)) + .replace(/\.scss$/u, '.css') + + return minify ? createMinifiedCssPath(rawCssPath) : rawCssPath +} + +function shouldSkipSourceFile(sourceFile) { + return isPrivateFile(sourceFile) || path.basename(sourceFile).startsWith('_') +} + +function normalizeSassOptions(sassCompilerOptions, sourceMaps, cssPath) { + const { includePaths, outputStyle, ...rest } = sassCompilerOptions + + return { + ...rest, + loadPaths: includePaths, + style: outputStyle, + sourceMap: sourceMaps, + sourceMapIncludeSources: sourceMaps, + url: pathToFileURL(cssPath), + } +} + +function buildSourceMapComment(mapPath) { + return `/*# sourceMappingURL=${path.basename(mapPath)} */` +} + +async function writeCompiledCssArtifact({ + cssPath, + cssContent, + sourceMap, + sourceMaps, +}) { + const mapPath = `${cssPath}.map` + const finalCss = sourceMaps + ? `${cssContent}\n${buildSourceMapComment(mapPath)}\n` + : cssContent + + await ensureDirectoryExists(path.dirname(cssPath)) + await fs.writeFile(cssPath, finalCss) + + if (sourceMaps && sourceMap) { + await fs.writeFile(mapPath, JSON.stringify(sourceMap, null, 2)) + } +} + +async function renderCssOutput(options) { + const { + sourceFile, + cssPath, + postcssPlugins, + sourceMaps, + minify, + skipNewer, + sassCompilerOptions, + autoprefixer, + cssnano, + postcss, + sass, + } = options + const sassResult = await sass.compileAsync( + sourceFile, + normalizeSassOptions(sassCompilerOptions, sourceMaps, cssPath) + ) + const processor = postcss( + buildPostcssPlugins(autoprefixer, cssnano, postcssPlugins, minify) + ) + const postcssResult = await processor.process(sassResult.css, { + from: cssPath, + to: cssPath, + map: sourceMaps + ? { + prev: sassResult.sourceMap, + inline: false, + annotation: false, + sourcesContent: true, + } + : false, + }) + + await writeCompiledCssArtifact({ + cssPath, + cssContent: postcssResult.css, + sourceMap: postcssResult.map ? postcssResult.map.toJSON() : null, + sourceMaps, + }) + await sassDependencyCache.writeDependencyManifest( + cssPath, + sassResult, + skipNewer + ) +} + +async function verifyCssIntegrity(cssPath, skipIntegrity) { + if (skipIntegrity) { + return + } + + const buffer = await fs.readFile(cssPath) + if (buffer.length < 10) { + throw new Error( + `[Sass] Integrity check failed: ${path.basename(cssPath)} is empty (${buffer.length} bytes).` + ) + } +} + +async function compileSourceFile(options) { + const { + sourceFile, + dest, + base, + outputFilename, + postcssPlugins, + sourceMaps, + minify, + skipNewer, + skipIntegrity, + sassCompilerOptions, + logger, + markCompilationError, + autoprefixer, + cssnano, + postcss, + sass, + } = options + + if (shouldSkipSourceFile(sourceFile)) { + return null + } + + const cssPath = resolveOutputCssPath({ + sourceFile, + dest, + base, + outputFilename, + minify, + }) + const mapPath = `${cssPath}.map` + + if ( + skipNewer && + (await sassDependencyCache.shouldSkipUnchangedFile({ + sourceFile, + cssPath, + mapPath, + sourceMaps, + })) + ) { + return null + } + + try { + await renderCssOutput({ + sourceFile, + cssPath, + postcssPlugins, + sourceMaps, + minify, + skipNewer, + sassCompilerOptions, + autoprefixer, + cssnano, + postcss, + sass, + }) + await verifyCssIntegrity(cssPath, skipIntegrity) + + logger.info( + `Saved: ${pc.yellow(path.basename(cssPath))} to ${pc.dim(dest)}` + ) + return cssPath + } catch (error) { + logger.error( + `Sass compilation failed in ${sourceFile}. Cause: ${error.message}` + ) + markCompilationError() + return null + } +} + +async function createSassPipeline(options) { + const sourceFiles = Array.isArray(options.src) ? options.src : [options.src] + const writtenFiles = await Promise.all( + sourceFiles.map(function compileCurrentSourceFile(sourceFile) { + return compileSourceFile({ + ...options, + sourceFile, + }) + }) + ) + + return writtenFiles.filter(Boolean) +} + +const sassPipelineApi = { + createSassPipeline, +} + +export default sassPipelineApi diff --git a/gulpconfig.build.js b/gulpconfig.build.js deleted file mode 100644 index 04fedd4..0000000 --- a/gulpconfig.build.js +++ /dev/null @@ -1,158 +0,0 @@ -const autoprefixer = require('autoprefixer'); -const cssnano = require('cssnano'); -require('dotenv').config(); - -// Paths -// -------------- - -const devBase = './src'; -const buildBase = './build'; -const tempBase = './temp'; -const contentBase = './content'; -const staticBase = './static'; - -// SASS -// -------------- - -const sassBase = `${devBase}/scss`; -const sassBuild = `${buildBase}/assets/css`; -const sassAll = [ - `${sassBase}/*.scss`, - `!${sassBase}/_*.scss`, - `!${sassBase}/u-*.scss`, -]; -const injectCss = `${sassBuild}/*.css`; - -// JavaScript -// -------------- - -const jsBase = `${devBase}/js`; -const jsFiles = `${jsBase}/*.js`; -const jsBuild = `${buildBase}/assets/js`; -const injectJs = `${jsBuild}/*.js`; - -const injectCdnJs = [ - '', -]; - -// Templates -// -------------- - -const tplBase = `${devBase}/templates`; -const tplBuild = buildBase; - -const tplPagesBase = `${tplBase}/pages`; -const tplTemplatesBase = `${tplBase}`; - -// Datasets from Markdown to JSON -// ---------------- - -const datasetPagesSource = `${contentBase}/pages/**/*.md`; -const datasetPagesBuild = `${tempBase}/_dataset-pages`; - -// GFX -// -------------- - -const gfxBase = `${devBase}/gfx`; -const gfxBuild = `${buildBase}/assets/images`; - -const jpgBase = `${gfxBase}/**`; -const imagesJpg = [`${jpgBase}/*.jpg`, `!${devBase}/favicon/**/*.*`]; - -const pngBase = `${gfxBase}/**`; -const imagesPng = [`${pngBase}/*.png`, `!${pngBase}/favicon/**/*.*`]; - -const svgBase = `${gfxBase}/**`; -const imagesSvg = [`${svgBase}/*.svg`, `!${devBase}/favicon/**/*.*`]; - -// Modules & Plugins -// -------------- - -const postcssPluginsBase = [ - autoprefixer({ - grid: true, - }), - cssnano(), -]; - -const fontloadFile = `${devBase}/fonts.list`; -const fontLoadConfig = { - fontsDir: 'assets/font/', - cssDir: 'assets/css/', - cssFilename: 'fonts.scss', - relativePaths: true, - fontDisplayType: 'swap', -}; - -const faviconSourceFile = `${gfxBase}/favicon/favicons-source.png`; -const faviconBuild = `${buildBase}/assets/favicons`; -const faviconGenConfig = { - appName: 'My App', - appShortName: 'App', - appDescription: 'This is my application', - developerName: 'Developer name', - developerURL: 'https://developerwebsite.com/', - background: '#000000', - path: '/assets/favicons/', - url: 'https://urlofwebsite.com/', - display: 'standalone', - orientation: 'portrait', - scope: '/', - start_url: '/index.html', - version: '4.5.0', - logging: false, - html: 'favicons.njk', - pipeHTML: true, - replace: false, - icons: { - android: false, - appleIcon: false, - appleStartup: false, - coast: false, - favicons: true, - firefox: false, - windows: false, - yandex: false, - }, -}; - -// Files that need to be removed -// -------------- - -const buildRevManifest = `${tempBase}/rev-manifest.json`; -// Exports -// -------------- - -module.exports = { - buildBase, - buildRevManifest, - contentBase, - datasetPagesBuild, - datasetPagesSource, - devBase, - faviconBuild, - faviconGenConfig, - faviconSourceFile, - fontLoadConfig, - fontloadFile, - gfxBase, - gfxBuild, - imagesJpg, - imagesPng, - imagesSvg, - injectCdnJs, - injectCss, - injectJs, - jsBuild, - jsFiles, - postcssPluginsBase, - sassAll, - sassBase, - sassBuild, - staticBase, - tempBase, - tplBase, - tplBuild, - tplPagesBase, - tplTemplatesBase, -}; diff --git a/gulpconfig.export.js b/gulpconfig.export.js deleted file mode 100644 index fdcec54..0000000 --- a/gulpconfig.export.js +++ /dev/null @@ -1,150 +0,0 @@ -const autoprefixer = require('autoprefixer'); -require('dotenv').config(); - -// Paths -// -------------- - -const devBase = './src'; -const buildBase = './export'; -const tempBase = './temp'; -const contentBase = './content'; -const staticBase = './static'; - -// SASS -// -------------- - -const sassBase = `${devBase}/scss`; -const sassBuild = `${buildBase}/assets/css`; -const sassAll = [ - `${sassBase}/*.scss`, - `!${sassBase}/_*.scss`, - `!${sassBase}/u-*.scss`, -]; -const injectCss = `${sassBuild}/*.css`; - -// JavaScript -// -------------- - -const jsBase = `${devBase}/js`; -const jsFiles = `${jsBase}/*.js`; -const jsBuild = `${buildBase}/assets/js`; -const injectJs = `${jsBuild}/*.js`; - -const injectCdnJs = [ - '', -]; - -// Templates -// -------------- - -const tplBase = `${devBase}/templates`; -const tplBuild = buildBase; - -const tplPagesBase = `${tplBase}/pages`; -const tplTemplatesBase = `${tplBase}`; - -// Datasets from Markdown to JSON -// ---------------- - -const datasetPagesSource = `${contentBase}/pages/**/*.md`; -const datasetPagesBuild = `${tempBase}/_dataset-pages`; - -// GFX -// -------------- - -const gfxBase = `${devBase}/gfx`; -const gfxBuild = `${buildBase}/assets/images`; - -const jpgBase = `${gfxBase}/**`; -const imagesJpg = [`${jpgBase}/*.jpg`, `!${devBase}/favicon/**/*.*`]; - -const pngBase = `${gfxBase}/**`; -const imagesPng = [`${pngBase}/*.png`, `!${pngBase}/favicon/**/*.*`]; - -const svgBase = `${gfxBase}/**`; -const imagesSvg = [`${svgBase}/*.svg`, `!${devBase}/favicon/**/*.*`]; - -// Modules & Plugins -// -------------- - -const postcssPluginsBase = [ - autoprefixer({ - grid: true, - }), -]; -const fontloadFile = `${devBase}/fonts.list`; -const fontLoadConfig = { - fontsDir: 'assets/font/', - cssDir: 'assets/css/', - cssFilename: 'fonts.scss', - relativePaths: true, - fontDisplayType: 'swap', -}; - -const faviconSourceFile = `${gfxBase}/favicon/favicons-source.png`; -const faviconBuild = `${buildBase}/assets/favicons`; -const faviconGenConfig = { - appName: 'My App', - appShortName: 'App', - appDescription: 'This is my application', - developerName: 'Developer name', - developerURL: 'https://developerwebsite.com/', - background: '#000000', - path: '/assets/favicons/', - url: 'https://urlofwebsite.com/', - display: 'standalone', - orientation: 'portrait', - scope: '/', - start_url: '/index.html', - version: 1.0, - logging: false, - html: 'favicons.njk', - pipeHTML: true, - replace: false, - icons: { - android: false, - appleIcon: false, - appleStartup: false, - coast: false, - favicons: true, - firefox: false, - windows: false, - yandex: false, - }, -}; - -// Exports -// -------------- - -module.exports = { - buildBase, - contentBase, - datasetPagesBuild, - datasetPagesSource, - devBase, - faviconBuild, - faviconGenConfig, - faviconSourceFile, - fontLoadConfig, - fontloadFile, - gfxBase, - gfxBuild, - imagesJpg, - imagesPng, - imagesSvg, - injectCdnJs, - injectCss, - injectJs, - jsBuild, - jsFiles, - postcssPluginsBase, - sassAll, - sassBase, - sassBuild, - staticBase, - tempBase, - tplBase, - tplBuild, - tplPagesBase, - tplTemplatesBase, -}; diff --git a/gulpconfig.js b/gulpconfig.js deleted file mode 100644 index 628c75a..0000000 --- a/gulpconfig.js +++ /dev/null @@ -1,121 +0,0 @@ -const autoprefixer = require('autoprefixer'); - -// Paths -// -------------- - -const devBase = './src'; -const buildBase = './temp'; -const tempBase = './temp'; -const contentBase = './content'; -const staticBase = './static'; - -// SASS -// -------------- - -const sassBase = `${devBase}/scss`; -const sassBuild = `${buildBase}/assets/css`; -const sassAll = [`${sassBase}/*.scss`, `!${sassBase}/_*.scss`]; -const sassCustom = [ - `${sassBase}/*.scss`, - `!${sassBase}/u-*.scss`, - `!${sassBase}/bootstrap.scss`, -]; -const sassCore = [`${sassBase}/bootstrap.scss`]; -const sassUtils = [`${sassBase}/u-*.scss`]; -const injectCss = `${sassBuild}/*.css`; - -// JavaScript -// -------------- - -const jsBase = `${devBase}/js`; -const jsFiles = `${jsBase}/*.js`; -const jsBuild = `${buildBase}/assets/js`; -const injectJs = `${jsBuild}/*.js`; - -const injectCdnJs = [ - '', -]; - -// Templates -// -------------- - -const tplBase = `${devBase}/templates`; -const tplBuild = buildBase; - -const tplPagesBase = `${tplBase}/pages`; -const tplTemplatesBase = `${tplBase}`; - -// Datasets from Markdown to JSON -// ---------------- - -const datasetPagesSource = `${contentBase}/pages/**/*.md`; -const datasetPagesBuild = `${tempBase}/_dataset-pages`; - -// GFX -// -------------- - -const gfxBase = `${devBase}/gfx`; -const gfxBuild = `${buildBase}/assets/images`; - -const jpgBase = `${gfxBase}/**`; -const imagesJpg = [`${jpgBase}/*.jpg`, `!${devBase}/favicon/**/*.*`]; - -const pngBase = `${gfxBase}/**`; -const imagesPng = [`${pngBase}/*.png`, `!${pngBase}/favicon/**/*.*`]; - -const svgBase = `${gfxBase}/**`; -const imagesSvg = [`${svgBase}/*.svg`, `!${devBase}/favicon/**/*.*`]; - -// Modules & Plugins -// -------------- - -const postcssPluginsBase = [ - autoprefixer({ - grid: true, - }), -]; - -const fontloadFile = `${devBase}/fonts.list`; -const fontLoadConfig = { - fontsDir: 'assets/font/', - cssDir: 'assets/css/', - cssFilename: 'fonts.scss', - relativePaths: true, - fontDisplayType: 'swap', -}; - -// Exports -// -------------- - -module.exports = { - buildBase, - contentBase, - datasetPagesBuild, - datasetPagesSource, - devBase, - fontLoadConfig, - fontloadFile, - gfxBase, - gfxBuild, - imagesJpg, - imagesPng, - imagesSvg, - injectCdnJs, - injectCss, - injectJs, - jsBuild, - jsFiles, - postcssPluginsBase, - sassAll, - sassBase, - sassBuild, - sassCore, - sassCustom, - sassUtils, - staticBase, - tempBase, - tplBase, - tplBuild, - tplPagesBase, - tplTemplatesBase, -}; diff --git a/gulpfile.build.js b/gulpfile.build.js deleted file mode 100644 index 5faf09e..0000000 --- a/gulpfile.build.js +++ /dev/null @@ -1,408 +0,0 @@ -const fs = require('fs'); -const gulp = require('gulp'); -const log = require('fancy-log'); -const cleanFnc = require('./gulp-tasks/gulp-clean'); -const config = require('./gulpconfig.build'); -const copyStaticFnc = require('./gulp-tasks/gulp-copy-static'); -const cssCompileFnc = require('./gulp-tasks-build/gulp-compile-sass'); -const cssPurgeFnc = require('./gulp-tasks-build/gulp-purgecss'); -const datasetPrepareFnc = require('./gulp-tasks/gulp-dataset-prepare'); -const deployFtpFnc = require('./gulp-tasks/gulp-deploy-ftp'); -const faviconsFnc = require('./gulp-tasks/gulp-favicons'); -const fontLoadFnc = require('./gulp-tasks/gulp-font-load'); -const htmlBuildFnc = require('./gulp-tasks-build/gulp-html-build'); -const htmlValidateFnc = require('./gulp-tasks/gulp-html-validate'); -const imagesOptimizeFnc = require('./gulp-tasks/gulp-optimize-images'); -const jsProcessFnc = require('./gulp-tasks-build/gulp-process-js'); -const replaceHashFnc = require('./gulp-tasks-build/gulp-sri-hash'); -const revisionFnc = require('./gulp-tasks-build/gulp-revision'); -require('dotenv').config(); - -// Variables -// -------------- - -const showLogs = false; - -// Gulp functions -// -------------- - -/** - * Cleans the folders specified in the `config.buildBase` variable. - * @returns {Promise} A promise that resolves when the folders are cleaned. - */ -function cleanFolders() { - return cleanFnc([config.tempBase, config.buildBase]); -} - -/** - * Copies static files from the source directory to the build directory. - * @param {Function} done - Callback function to be called when the copying is complete. - * @returns {Promise} - A promise that resolves when the copying is complete. - */ -function copyStatic(done) { - return copyStaticFnc( - [ - `${config.staticBase}/*`, - `${config.staticBase}/**/*`, - `${config.staticBase}/.*/*`, - ], - config.staticBase, - config.buildBase, - { - verbose: showLogs, - cb: () => { - done(); - }, - }, - ); -} - -/** - * Validates HTML files. - * @param {Function} done - Callback function to be called when the validation is complete. - * @returns {Promise} A promise that resolves when the HTML files are validated. - */ -function htmlValidate(done) { - return htmlValidateFnc(`${config.buildBase}/**/*.html`, { - verbose: showLogs, - cb: () => { - done(); - }, - }); -} - -/** - * Deploys files to FTP server. - * @param {Function} done - Callback function to be called when deployment is complete. - * @returns {Promise} - A promise that resolves when the deployment is complete. - */ -function deployFtp(done) { - return deployFtpFnc(`${config.buildBase}/**`, `${config.buildBase}/`, '.', { - verbose: showLogs, - cb: () => { - done(); - }, - }); -} - -// SASS - -/** - * Compiles Sass core files. - * @param {Function} done - Callback function to be called when the compilation is done. - * @returns {object} - The result of the cssCompileFnc function. - */ -function compileSassAll(done) { - return cssCompileFnc( - config.sassAll, - config.sassBuild, - 'index.min.css', - config.postcssPluginsBase, - { - verbose: showLogs, - cb: () => { - done(); - }, - }, - ); -} - -/** - * Purges unused CSS from the specified files and directories. - * @param {Function} done - The callback function to be called when the purge is complete. - * @returns {object} - The result of the purge operation. - */ -function purgecss(done) { - return cssPurgeFnc( - [`${config.buildBase}/**/*index*.css`], - [`${config.buildBase}/**/*.html`], - config.buildBase, - { - cb: () => { - done(); - }, - }, - ); -} - -// JS - -/** - * Processes JavaScript files. - * @param {Function} done - Callback function to be called when processing is complete. - * @returns {void} - */ -function processJs(done) { - const params = { - concatFiles: true, - outputConcatPrefixFileName: 'app', - cb: () => { - done(); - }, - }; - - return jsProcessFnc(config.jsFiles, config.jsBuild, params); -} - -// Dataset - -/** - * Prepares the dataset for the site. - * @param {Function} done - The callback function to be called when the dataset preparation is complete. - * @returns {Promise} A promise that resolves when the dataset preparation is complete. - */ -function datasetPrepareSite(done) { - return datasetPrepareFnc(`${config.contentBase}/site.md`, config.tempBase, { - verbose: showLogs, - cb: () => { - done(); - }, - }); -} - -/** - * Prepares dataset pages. - * @param {Function} done - The callback function to be called when the dataset pages are prepared. - * @returns {void} - */ -function datasetPreparePages(done) { - return datasetPrepareFnc( - config.datasetPagesSource, - config.datasetPagesBuild, - { - verbose: showLogs, - cb: () => { - done(); - }, - }, - ); -} - -// Templates - -/** - * Builds the pages using the specified parameters. - * @param {Function} done - The callback function to be called when the build is complete. - * @returns {object} - The result of the htmlBuildFnc function. - */ -function buildPages(done) { - const params = { - input: `${config.tplPagesBase}/**/*.html`, - output: config.tplBuild, - templates: config.tplTemplatesBase, - processPaths: [config.tplPagesBase, config.tplTemplatesBase], - siteConfig: `${config.tempBase}/site.json`, - dataSource: config.datasetPagesBuild, - injectCdnJs: config.injectCdnJs, - injectJs: config.injectJs, - injectCss: config.injectCss, - injectIgnorePath: config.buildBase.replace('./', ''), - cb: () => { - done(); - }, - }; - - return htmlBuildFnc(params); -} - -// GFX - -/** - * Optimizes images in different formats (jpg, png, svg). - * @param {Function} done - Callback function to be called when the task is complete. - * @returns {Function} - The callback function passed as a parameter. - */ -function images(done) { - const params = { - verbose: showLogs, - cb: () => { - done(); - }, - }; - - imagesOptimizeFnc.optimizeJpg(config.imagesJpg, config.gfxBuild, params); - imagesOptimizeFnc.optimizePng(config.imagesPng, config.gfxBuild, params); - imagesOptimizeFnc.optimizeSvg(config.imagesSvg, config.gfxBuild, params); - return done(); -} - -// Favicons - -/** - * Generate favicons and perform necessary file operations. - * @param {Function} done - Callback function to be called when the task is done. - * @returns {void} - */ -function favicons(done) { - return faviconsFnc(config.faviconSourceFile, config.faviconBuild, { - config: config.faviconGenConfig, - verbose: showLogs, - cb: () => { - done(); - - // Move `favicon.ico` to project root - fs.rename( - `${config.faviconBuild}/favicon.ico`, - `${config.buildBase}/favicon.ico`, - (err) => { - if (err) throw err; - }, - ); - - // Move `favicons.njk` and edit file content - fs.readFileSync( - `${config.faviconBuild}/favicons.njk`, - 'utf8', - (err, data) => { - if (err) throw err; - - // Remove link to moved `favicon.ico` - const newValue = data.replace(/]*>/g, ''); - - fs.writeFileSync( - `${config.tplTemplatesBase}/partials/favicons.njk`, - newValue, - 'utf8', - (err2) => { - if (err2) { - throw err; - } else { - // log('Done!'); - - try { - fs.unlinkSync(`${config.faviconBuild}/favicons.njk`); - // log('Removed!'); - } catch (err3) { - log.error(err3); - } - } - }, - ); - }, - ); - }, - }); -} - -// Fonts - -/** - * Loads fonts using the specified configuration. - * @param {Function} done - The callback function to be called when the font loading is complete. - * @returns {void} - */ -function fontLoad(done) { - return fontLoadFnc(config.fontloadFile, config.tempBase, { - config: config.fontLoadConfig, - verbose: showLogs, - cb: () => { - copyStaticFnc( - `${config.tempBase}/assets/font/*`, - `${config.tempBase}/assets/font`, - `${config.buildBase}/assets/font`, - { - cb: () => { - done(); - }, - }, - ); - }, - }); -} - -/** - * Performs post-build tasks. - * @param {Function} done - Callback function to be called when post-build tasks are completed. - */ -function postbuild(done) { - fs.unlink(`${config.buildBase}/assets/favicons/favicons.njk`, (err) => { - if (err) { - log.error(err); - } - }); - // htmlValidate(); - done(); -} - -// Gulp tasks -// -------------- - -gulp.task('css', compileSassAll); - -gulp.task('js', processJs); - -gulp.task('dataset', gulp.parallel(datasetPrepareSite, datasetPreparePages)); - -gulp.task( - 'html', - gulp.series(datasetPrepareSite, datasetPreparePages, buildPages), -); - -gulp.task('images', images); - -gulp.task('fonts', fontLoad); - -gulp.task('validate', htmlValidate); - -gulp.task( - 'export', - gulp.series( - cleanFolders, - images, - copyStatic, - datasetPrepareSite, - datasetPreparePages, - favicons, - fontLoad, - compileSassAll, - processJs, - buildPages, - purgecss, - htmlValidate, - postbuild, - ), -); - -gulp.task('deployFtp', gulp.series('export', deployFtp)); - -// Aliases - -gulp.task('default', gulp.series('export')); diff --git a/gulpfile.js b/gulpfile.js index c1ec0fc..7f40ac0 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,322 +1,502 @@ -const gulp = require('gulp'); -const cleanFnc = require('./gulp-tasks/gulp-clean'); -const config = require('./gulpconfig'); -const copyStaticFnc = require('./gulp-tasks/gulp-copy-static'); -const cssCompileFnc = require('./gulp-tasks/gulp-compile-sass'); -const datasetPrepareFnc = require('./gulp-tasks/gulp-dataset-prepare'); -const fontLoadFnc = require('./gulp-tasks/gulp-font-load'); -const hotReload = require('./gulp-tasks/gulp-hotreload'); -const htmlBuildFnc = require('./gulp-tasks/gulp-html-build'); -const imagesOptimizeFnc = require('./gulp-tasks/gulp-optimize-images'); -const jsProcessFnc = require('./gulp-tasks-build/gulp-process-js'); -const todoFnc = require('./gulp-tasks/gulp-todo'); +/* eslint-disable max-lines -- This file is the top-level orchestrator for the three pipelines and their public gulp task exports. */ +import { existsSync } from 'node:fs' +import fs from 'node:fs/promises' +import path from 'node:path' +import gulp from 'gulp' + +import { resolveConfig } from './gulp/config.js' +import cleanTask from './gulp/tasks/clean-build.js' +import copyStatic from './gulp/tasks/copy-static.js' +import debugFiles from './gulp/tasks/debug-build.js' +import faviconsTask from './gulp/tasks/generate-favicons.js' +import revisionTask from './gulp/tasks/generate-revision.js' +import sriTask from './gulp/tasks/generate-sri.js' +import lintTemplates from './gulp/tasks/lint-templates.js' +import processDataTask from './gulp/tasks/process-data.js' +import fontLoad from './gulp/tasks/process-fonts.js' +import processHtml from './gulp/tasks/process-html.js' +import imageTasks from './gulp/tasks/process-images.js' +import { processAllJs } from './gulp/tasks/process-js.js' +import { + compileBootstrapStyles, + compileProjectStyles, + compileRouteStyles, + processAllSass, +} from './gulp/tasks/process-sass.js' +import purgeCss from './gulp/tasks/purge-css.js' +import serveSite from './gulp/tasks/serve-site.js' +import validateHtml from './gulp/tasks/validate-html.js' +import loggerLib, { cleanupDir } from './gulp/utils/index.js' +import { getSiteDataArtifactPath } from './gulp/utils/route-data.js' +import { siteDefaults } from './src/config/site.js' + +const logger = loggerLib.createLogger('Gulpfile') +const BUILD_MODE = process.env.BUILD_MODE + +if (!BUILD_MODE) { + throw new Error('BUILD_MODE must be set.', { + cause: new Error('Pass BUILD_MODE=dev|build|export environment variable.'), + }) +} -require('dotenv').config(); +// Initialize environment variables from .env files +const envFiles = [`.env.${BUILD_MODE}`, '.env.local', '.env'] -// Variables -// -------------- +envFiles + .filter((file) => existsSync(file)) + .forEach((file) => process.loadEnvFile(file)) -const showLogs = 'brief'; +const config = resolveConfig(BUILD_MODE) +let pendingCssReloadPaths = [] -// Gulp functions -// -------------- +function normalizeWrittenFiles(writtenFiles) { + if (!Array.isArray(writtenFiles)) { + return [] + } -/** - * Cleans the folders specified in the `config.buildBase` variable. - * @returns {Promise} A promise that resolves when the folders are cleaned. - */ -function cleanFolders() { - return cleanFnc(config.buildBase); + return writtenFiles.flat().filter(Boolean) +} + +function rememberCssReloadPaths(writtenFiles) { + pendingCssReloadPaths = resolveCssReloadPaths( + config.paths.build, + normalizeWrittenFiles(writtenFiles) + ) + return writtenFiles } /** - * Copies static files from the source directory to the build directory. - * @param {Function} done - Callback function to be called when the copying is complete. - * @returns {Promise} - A promise that resolves when the copying is complete. + * Resolves written CSS files to BrowserSync reload paths relative to build root. + * @param {string} buildRoot - BrowserSync server root. + * @param {string[]} writtenFiles - Written asset file paths. + * @returns {string[]} BrowserSync reload paths. */ -function copyStatic(done) { - return copyStaticFnc( - [ - `${config.staticBase}/*`, - `${config.staticBase}/**/*`, - `${config.staticBase}/.*/*`, - ], - config.staticBase, - config.buildBase, - { - verbose: showLogs, - cb: () => { - done(); - }, - }, - ); +export function resolveCssReloadPaths(buildRoot, writtenFiles) { + const absoluteBuildRoot = path.resolve(buildRoot) + + return normalizeWrittenFiles(writtenFiles) + .filter(function isCssAsset(filePath) { + return filePath.endsWith('.css') + }) + .map(function toReloadPath(filePath) { + return path + .relative(absoluteBuildRoot, path.resolve(filePath)) + .replace(/\\/g, '/') + }) + .filter(function isWithinBuildRoot(reloadPath) { + return reloadPath && !reloadPath.startsWith('..') + }) } -// SASS +async function generateSiteMetadata(tempBase) { + const siteDataPath = getSiteDataArtifactPath(tempBase) + await fs.mkdir(path.dirname(siteDataPath), { recursive: true }) + await fs.writeFile(siteDataPath, JSON.stringify(siteDefaults, null, 2)) +} + +function createPipelines(tasks) { + const { + clean, + images, + dataset, + favicons, + fonts, + copy, + js, + css, + html, + purge, + revision, + sri, + finalCleanup, + validate, + debug, + watchFiles, + } = tasks + + return { + buildPipeline: gulp.series( + clean, + gulp.parallel(images, dataset, favicons, fonts), + gulp.parallel(copy, js, css), + html, + purge, + revision, + sri, + finalCleanup, + gulp.parallel(validate, debug) + ), + exportPipeline: gulp.series( + clean, + gulp.parallel(images, dataset, favicons, fonts), + gulp.parallel(copy, js, css), + html, + purge, + gulp.parallel(validate, debug) + ), + servePipeline: gulp.series( + clean, + gulp.parallel(images, dataset, fonts), + gulp.parallel(copy, js, css), + html, + debug, + watchFiles + ), + } +} + +function selectDefaultPipeline(buildMode, taskPipelines) { + if (buildMode === 'build') { + return taskPipelines.buildPipeline + } + + if (buildMode === 'export') { + return taskPipelines.exportPipeline + } + + return taskPipelines.servePipeline +} /** - * Compiles Sass core files. - * @param {Function} done - Callback function to be called when the compilation is done. - * @returns {object} - The result of the cssCompileFnc function. + * Task: Clean build and temp folders + * @returns {Promise} List of deleted paths */ -function compileSassCore(done) { - return cssCompileFnc( - config.sassCore, - config.sassBuild, - 'bootstrap.css', - config.postcssPluginsBase, - { - cb: () => { - done(); - }, - }, - ); +export function clean() { + return cleanTask([`${config.tempBase}/**/*`, config.paths.build]) } /** - * Compiles Sass custom files. - * @param {Function} done - Callback function to be called when the compilation is done. - * @returns {object} - The result of the cssCompileFnc function. + * Task: Copy static files + * @returns {Promise} Resolves when copy is complete */ -function compileSassCustom(done) { - return cssCompileFnc( - config.sassCustom, - config.sassBuild, - 'custom.css', - config.postcssPluginsBase, - { - cb: () => { - done(); +export async function copy() { + try { + await gulp.parallel( + function copyPublicAssetsTask() { + return copyStatic( + [`${config.staticBase}/**/*`], + config.staticBase, + config.paths.build + ) }, - }, - ); + function copyFontsTask() { + return copyStatic( + [ + `${config.assetsBase}/fonts/**/*`, + `${config.assetsBase}/css/fonts*.css`, + ], + config.assetsBase, + `${config.paths.build}/assets` + ) + } + )() + } catch (error) { + logger.error(`Copy task failed: ${error.message}`) + throw error + } } /** - * Compiles Sass utilities. - * @param {Function} done - Callback function to be called when the compilation is done. - * @returns {object} - The result of the cssCompileFnc function. + * Task: Compile all Sass + * @returns {Promise} Resolves when Sass is compiled */ -function compileSassUtils(done) { - return cssCompileFnc( - config.sassUtils, - config.sassBuild, - 'utils.css', - config.postcssPluginsBase, - { - cb: () => { - done(); - }, - }, - ); +export function css() { + return processAllSass(config, BUILD_MODE).then(rememberCssReloadPaths) } -// JS - /** - * Processes JavaScript files. - * @param {Function} done - Callback function to be called when processing is complete. - * @returns {void} + * Task: Compile Bootstrap Sass from project variables + * @returns {Promise} Resolves when Bootstrap CSS is compiled */ -function processJs(done) { - const params = { - concatFiles: false, - outputConcatPrefixFileName: 'app', - cb: () => { - done(); - }, - }; - - return jsProcessFnc(config.jsFiles, config.jsBuild, params); +export function cssBootstrap() { + return compileBootstrapStyles(config, BUILD_MODE).then(rememberCssReloadPaths) } -// Dataset +/** + * Task: Compile shared project Sass + * @returns {Promise} Resolves when project CSS is compiled + */ +export function cssProject() { + return compileProjectStyles(config, BUILD_MODE).then(rememberCssReloadPaths) +} /** - * Prepares the dataset for the site. - * @param {Function} done - The callback function to be called when the dataset preparation is complete. - * @returns {Promise} A promise that resolves when the dataset preparation is complete. + * Task: Compile route Sass + * @returns {Promise} Resolves when route CSS is compiled */ -function datasetPrepareSite(done) { - return datasetPrepareFnc(`${config.contentBase}/site.md`, config.tempBase, { - verbose: showLogs, - cb: () => { - done(); - }, - }); +export function cssRoutes() { + return compileRouteStyles(config, [], { + skipNewer: BUILD_MODE === 'dev', + }).then(rememberCssReloadPaths) } /** - * Prepares dataset pages. - * @param {Function} done - The callback function to be called when the dataset pages are prepared. - * @returns {void} + * Task: Process JavaScript + * @returns {Promise} Resolves when JS is processed */ -function datasetPreparePages(done) { - return datasetPrepareFnc( - config.datasetPagesSource, - config.datasetPagesBuild, - { - verbose: showLogs, - cb: () => { - done(); - }, - }, - ); +export function js() { + return processAllJs(config) } -// Templates +/** + * Task: Prepare dataset + * @type {import('gulp').TaskFunction} + */ +export const dataset = gulp.parallel( + function generateSiteMetadataTask() { + return generateSiteMetadata(config.tempBase) + }, + function processPageDataTask() { + return processDataTask(config.datasetPagesSource, config.datasetPagesBuild) + } +) /** - * Builds the pages using the specified parameters. - * @param {Function} done - The callback function to be called when the build is complete. - * @returns {object} - The result of the htmlBuildFnc function. + * Task: Build HTML pages + * @returns {Promise} Resolves when HTML is generated */ -function buildPages(done) { - const params = { - input: `${config.tplPagesBase}/**/*.html`, - output: config.tplBuild, - templates: config.tplTemplatesBase, - processPaths: [config.tplPagesBase, config.tplTemplatesBase], - siteConfig: `${config.tempBase}/site.json`, - dataSource: config.datasetPagesBuild, - injectCdnJs: config.injectCdnJs, - injectJs: config.injectJs, - injectCss: config.injectCss, - injectIgnorePath: config.buildBase.replace('./', ''), - cb: () => { - done(); - }, - }; - - return htmlBuildFnc(params); +export function html() { + return processHtml(config) } -// GFX - /** - * Optimizes images in different formats (jpg, png, svg). - * @param {Function} done - Callback function to be called when the task is complete. - * @returns {Function} - The callback function passed as a parameter. + * Task: Optimize images + * @returns {Promise} Resolves when images are optimized */ -function images(done) { - const params = { - verbose: showLogs, - cb: () => { - done(); - }, - }; - - imagesOptimizeFnc.optimizeJpg(config.imagesJpg, config.gfxBuild, params); - imagesOptimizeFnc.optimizePng(config.imagesPng, config.gfxBuild, params); - imagesOptimizeFnc.optimizeSvg(config.imagesSvg, config.gfxBuild, params); - - return done(); +export async function images() { + const imgConfig = config.imageOptimization + + const tasks = [ + imageTasks.jpg(config.imagesJpg, config.paths.images, imgConfig.jpg), + imageTasks.png(config.imagesPng, config.paths.images), + imageTasks.svg(config.imagesSvg, config.paths.images), + config.optimizeImages && + imageTasks.webp( + [config.imagesJpg, config.imagesPng], + config.paths.images, + imgConfig.webp + ), + config.optimizeImages && + imageTasks.avif( + [config.imagesJpg, config.imagesPng], + config.paths.images, + imgConfig.avif + ), + ].filter(Boolean) + + await Promise.all(tasks) } -// Fonts +/** + * Task: Generate favicons + * @returns {import('node:stream').Readable} Gulp stream for favicons + */ +export function favicons() { + return faviconsTask( + `${config.srcBase}/assets/icons/favicons-source.png`, + config.paths.favicons, + config.faviconGen + ) +} /** - * Loads fonts using the specified configuration. - * @param {Function} done - The callback function to be called when the font loading is complete. - * @returns {void} + * Task: Load fonts + * @returns {Promise} Resolves when fonts are loaded */ -function fontLoad(done) { - fontLoadFnc(config.fontloadFile, config.tempBase, { - config: config.fontLoadConfig, - verbose: showLogs, - cb: () => { - done(); - }, - }); +export function fonts() { + return fontLoad(config.fontloadFile, config.assetsBase, { + config: config.fontLoad, + minify: config.minifyCss, + }) } -// Watch -// -------------- +/** + * Task: Purge unused CSS + * @returns {Promise} Resolves when CSS is purged + */ +export async function purge() { + const buildBase = config.paths.build + return await purgeCss( + [`${config.paths.sass}/**/*.css`, `!${config.paths.sass}/**/*.min.css`], + [ + `${config.srcBase}/**/*.njk`, + `${config.srcBase}/**/*.md`, + `${config.srcBase}/**/*.js`, + `${buildBase}/**/*.html`, + ], + config.paths.sass + ) +} /** - * Watches files for changes and triggers corresponding tasks. + * Task: Asset Revisioning + * @returns {import('node:stream').Readable} Gulp stream with revved files */ -function watchFiles() { - // Watch SASS - gulp.watch( - config.sassCustom, - gulp.series(compileSassCustom, hotReload.browserSyncRefresh), - ); - gulp.watch( - config.sassCore, - gulp.series(compileSassCore, hotReload.browserSyncRefresh), - ); - gulp.watch( - config.sassUtils, - gulp.series(compileSassUtils, hotReload.browserSyncRefresh), - ); - - // Watch JS - gulp.watch( - config.jsFiles, - gulp.series(processJs, hotReload.browserSyncRefresh), - ); - - // Watch Templates - gulp - .watch(['./src/templates/**/*.*', './src/pages/**/*.*'], buildPages) - .on('change', hotReload.browserSyncReload); - - // Watch Datasets - gulp - .watch( - './content/**/*.md', - gulp.series(datasetPrepareSite, datasetPreparePages, buildPages), - ) - .on('change', hotReload.browserSyncReload); +export function revision() { + return revisionTask({ + inputAssets: [ + `${config.paths.sass}/**/*.css`, + `${config.paths.js}/**/*.js`, + ], + inputHtml: `${config.paths.build}/**/*.html`, + buildBase: config.paths.build, + manifestPath: `${config.tempBase}/rev-manifest.json`, + }) +} - // Watch GFX - gulp.watch(config.gfxBase, gulp.series(images, hotReload.browserSyncRefresh)); +/** + * Task: SRI Hashing + * @returns {Promise} Resolves when hashes are injected + */ +export async function sri() { + return await sriTask(`${config.paths.build}/**/*.html`, config.paths.build) } -// Gulp tasks -// -------------- +/** + * Task: HTML Validation + * @returns {import('node:stream').Stream} Gulp validation stream + */ +export function validate() { + return validateHtml(`${config.paths.build}/**/*.html`) +} -gulp.task( - 'css', - gulp.parallel(compileSassCore, compileSassCustom, compileSassUtils), -); +/** + * Task: Debug files list + * @returns {Promise} Resolves when diagnostic is finished + */ +export function debug() { + return debugFiles(config) +} -gulp.task('js', processJs); +/** + * Explicit browser reload task for Gulp series + * @param {function(Error=): void} done - Gulp completion callback. + * @returns {void} + */ +export function reload(done) { + serveSite.reload() + done() +} -gulp.task('dataset', gulp.parallel(datasetPrepareSite, datasetPreparePages)); +/** + * Explicit CSS refresh task for Gulp series + * @param {function(Error=): void} done - Gulp completion callback. + * @returns {void} + */ +export function refreshCss(done) { + if (pendingCssReloadPaths.length > 0) { + serveSite.reload(pendingCssReloadPaths) + pendingCssReloadPaths = [] + } + done() +} -gulp.task( - 'html', - gulp.series(datasetPrepareSite, datasetPreparePages, buildPages), -); +/** + * Registers template and markdown rebuild watchers. + * @param {object} options - Watcher registration options. + * @param {object} options.config - Resolved project configuration. + * @param {object} options.tasks - Task functions to run after template changes. + * @param {object} [options.gulpApi] - Gulp API adapter. + * @returns {import('chokidar').FSWatcher} Template file watcher. + */ +export function registerTemplateWatcher({ config, tasks, gulpApi = gulp }) { + const rebuildTemplates = gulpApi.series( + tasks.lintTemplates, + tasks.dataset, + tasks.html, + tasks.reload + ) + const templateWatcher = gulpApi.watch(config.templateWatchPaths) + + templateWatcher.on('change', rebuildTemplates) + templateWatcher.on('add', rebuildTemplates) + templateWatcher.on('unlink', rebuildTemplates) + + return templateWatcher +} -gulp.task('images', images); +async function watchFiles() { + try { + await serveSite.init(config) + + // Templates & Data: Rebuild JSON and HTML, then FULL RELOAD + registerTemplateWatcher({ + config, + tasks: { lintTemplates, dataset, html, reload }, + }) + + // Styles: Rebuild only the affected CSS layer, then inject CSS. + gulp.watch(config.bootstrapWatch, gulp.series(cssBootstrap, refreshCss)) + gulp.watch(config.projectSassWatch, gulp.series(cssProject, refreshCss)) + const routeStyleWatcher = gulp.watch(config.routeSassWatch) + routeStyleWatcher.on('change', gulp.series(cssRoutes, refreshCss)) + routeStyleWatcher.on('add', gulp.series(cssRoutes, html, reload)) + routeStyleWatcher.on('unlink', gulp.series(cssRoutes, html, reload)) + + // Scripts: Rebuild JS and FULL RELOAD (JS usually requires fresh state) + gulp.watch(config.jsFiles, gulp.series(js, reload)) + const routeJsWatcher = gulp.watch(config.routeJsWatch) + routeJsWatcher.on('change', gulp.series(js, reload)) + routeJsWatcher.on('add', gulp.series(js, html, reload)) + routeJsWatcher.on('unlink', gulp.series(js, html, reload)) + + // Assets: Just process and reload browser + gulp.watch(`${config.imagesBase}/**/*`, gulp.series(images, reload)) + gulp.watch( + `${config.iconsBase}/**/*.svg`, + gulp.series(dataset, html, reload) + ) + } catch (error) { + logger.error('Failed to start development server or watchers:', error) + throw error + } +} -gulp.task('fonts', fontLoad); +async function finalCleanup() { + await cleanupDir( + config.paths.sass, + /-[a-f0-9]{6,}\.(?:min\.)?css$|\.min\.css$|^fonts(?:-[a-f0-9]{6,})?\.min\.css$|^fonts\.css$/, + 'non-fingerprint CSS', + logger + ) + await cleanupDir( + config.paths.js, + /-[a-f0-9]{6,}\.(?:min\.)?js$|\.min\.js$|^vendor\.js$|^manifest\.js$/, + 'non-fingerprint JS', + logger + ) +} -gulp.task('todo', todoFnc); +const { buildPipeline, exportPipeline, servePipeline } = createPipelines({ + clean, + images, + dataset, + favicons, + fonts, + copy, + js, + css, + html, + purge, + revision, + sri, + finalCleanup, + validate, + debug, + watchFiles, +}) + +const defaultTask = selectDefaultPipeline(BUILD_MODE, { + buildPipeline, + exportPipeline, + servePipeline, +}) + +export { + servePipeline as dev, + buildPipeline as build, + exportPipeline as export, + validate as htmlValidate, +} -gulp.task( - 'serve', - gulp.series( - cleanFolders, - images, - copyStatic, - datasetPrepareSite, - datasetPreparePages, - fontLoad, - compileSassCore, - compileSassCustom, - compileSassUtils, - processJs, - buildPages, - todoFnc, - gulp.parallel(watchFiles, hotReload.browserSync), - ), -); - -// Aliases - -gulp.task('watch', gulp.series('serve')); -gulp.task('default', gulp.series('serve')); +export default defaultTask diff --git a/lefthook.yml b/lefthook.yml new file mode 100644 index 0000000..9f37e0d --- /dev/null +++ b/lefthook.yml @@ -0,0 +1,26 @@ +# Lefthook configuration +# https://github.com/evilmartians/lefthook + +pre-commit: + commands: + lint-staged: + run: npx lint-staged + +commit-msg: + commands: + fix-blank-line: + run: node scripts/hooks/fix-blank-line.js "{1}" + remark: + run: npx remark "{1}" --output --silent + commitlint: + run: npx commitlint --edit "{1}" + +pre-push: + commands: + checks: + run: pnpm lint && pnpm test + +prepare-commit-msg: + commands: + fold-lines: + run: node scripts/hooks/fold-lines.js "{1}" diff --git a/lint-staged.config.js b/lint-staged.config.js new file mode 100644 index 0000000..6dda1c9 --- /dev/null +++ b/lint-staged.config.js @@ -0,0 +1,7 @@ +export default { + '*.js': ['eslint --fix'], + '*.scss': ['stylelint --fix --allow-empty-input'], + '*.md': ['remark --output --quiet --frail'], + '*.njk': ['njklint --fix'], + '*.{css,scss,js,json,njk}': ['prettier --write'], +} diff --git a/memories/architectural-gotchas.md b/memories/architectural-gotchas.md new file mode 100644 index 0000000..1fc0b2a --- /dev/null +++ b/memories/architectural-gotchas.md @@ -0,0 +1,27 @@ +## Route Styles Cannot Depend On Global Sass Imports + +- **Date Discovered:** 2026-05-25 UNKNOWN +- **Category:** Architectural +- **Context/Manifestation:** Route SCSS copy mixins/tokens. Global Sass import unsafe after bundle split. +- **Rule:** Route-local SCSS must import `src/scss/_route-abstracts.scss`, not global Bootstrap/`globals.scss`. + +## Navigation Asset Helpers Must Keep The Legacy Export Seam + +- **Date Discovered:** 2026-05-26 UNKNOWN +- **Category:** Architectural +- **Context/Manifestation:** Route asset logic move to `navigation-assets.js`. Tests fail if `navigation.js` drop exports. +- **Rule:** `navigation.js` must re-export `clearRouteAssetCache`/`discoverRouteStyles`/`discoverRouteScripts` as public seam. + +## Navigation Must Stay Split By Domain Responsibility + +- **Date Discovered:** 2026-05-26 UNKNOWN +- **Category:** Architectural +- **Context/Manifestation:** `navigation.js` bloat with mixed concerns. Force API churn. +- **Rule:** No catch-all navigation module. Split to `route-data.js`, `html-output.js`, `navigation-assets.js`. + +## Dev Build Export Pipelines Must Stay Separate + +- **Date Discovered:** 2026-06-08 UNKNOWN +- **Category:** Architectural +- **Context/Manifestation:** `dev`, `build`, `export` are separate pipelines. Merging into one generic abstraction rejected. +- **Rule:** Keep `dev`, `build`, `export` pipelines separate. No generic orchestration abstraction. diff --git a/memories/dependency-gotchas.md b/memories/dependency-gotchas.md new file mode 100644 index 0000000..031a783 --- /dev/null +++ b/memories/dependency-gotchas.md @@ -0,0 +1,34 @@ +## Native Postinstall Dependencies Require pnpm allowBuilds Entries + +- **Date Discovered:** 2026-05-26 UNKNOWN +- **Category:** Dependency +- **Context/Manifestation:** Repo use native packages (`sharp`, `esbuild`, `@parcel/watcher`, `gifsicle`, `mozjpeg`, `optipng-bin`). Install fail without `allowBuilds` in `pnpm-workspace.yaml`. +- **Rule:** Keep `allowBuilds` entries in `pnpm-workspace.yaml`. Install need them. + +## Duplicate sharp libvips Builds Trigger Runtime Warning Noise + +- **Date Discovered:** 2026-05-26 UNKNOWN +- **Category:** Dependency +- **Context/Manifestation:** `pnpm test` emit Objective-C warning `GNotificationCenterDelegate` implemented twice. macOS load duplicate `sharp-libvips` dylibs. +- **Rule:** Check duplicate `@img/sharp-libvips-darwin-arm64` in lockfile. Warning = dedupe problem, not logic bug. + +## pnpm Overrides Must Live In pnpm-workspace.yaml + +- **Date Discovered:** 2026-05-26 UNKNOWN +- **Category:** Dependency +- **Context/Manifestation:** The package manager ignores `pnpm.overrides` in `package.json`. Overrides only work in `pnpm-workspace.yaml`. +- **Rule:** Put dependency overrides in `pnpm-workspace.yaml`, not `package.json`. + +## Nunjucklinter Banner Output Must Be Filtered Through The Wrapper + +- **Date Discovered:** 2026-06-08 UNKNOWN +- **Category:** Dependency +- **Context/Manifestation:** `nunjucklinter` CLI print noisy banner lines. `scripts/run-njklint.js` wrapper strip noise, keep real output/status. +- **Rule:** Use `scripts/run-njklint.js` for lint/format, not raw `njklint`. + +## Playwright Binary Provisioning + +- **Date Discovered:** 2026-06-11 +- **Category:** Dependency +- **Context/Manifestation:** Playwright binaries not auto-install with `pnpm install`. E2E tests fail. +- **Rule:** Run `playwright install chromium` in `package.json` `postinstall`. diff --git a/memories/logic-correctness-gotchas.md b/memories/logic-correctness-gotchas.md new file mode 100644 index 0000000..60aac56 --- /dev/null +++ b/memories/logic-correctness-gotchas.md @@ -0,0 +1,48 @@ +## Minimal Layouts Need The Shared CSS Injection Contract + +- **Date Discovered:** 2026-05-25 UNKNOWN +- **Category:** Logic/Correctness +- **Context/Manifestation:** `layout-minimal.njk` skip `inject:css` and `pageStyles`. Pages miss Bootstrap/component CSS. +- **Rule:** Route layout using Bootstrap/components must include global `inject:css` block and `pageStyles` loop. + +## Template Date Filters Must Handle Intl Option Objects + +- **Date Discovered:** 2026-05-25 UNKNOWN +- **Category:** Logic/Correctness +- **Context/Manifestation:** Nunjucks `date` filter fail object formats, fallback to `toISOString()`. Break `build-prod` vs `build-export` parity. +- **Rule:** Route template `date` filter via shared UTC formatter supporting `'YYYY'` and `Intl.DateTimeFormat` objects. + +## Passing Tests Must Not Leak Expected Logger Failures + +- **Date Discovered:** 2026-05-26 UNKNOWN +- **Category:** Logic/Correctness +- **Context/Manifestation:** Negative-path tests trigger `logger.warn()`/`logger.error()`. Create false-positive pipeline failure noise. +- **Rule:** Use `silenceConsole` for `console.log`. Mock `console.warn`/`console.error` in tests exercising logger branches. + +## Validate Html Tests Must Mock Console Not createLogger + +- **Date Discovered:** 2026-06-08 UNKNOWN +- **Category:** Logic/Correctness +- **Context/Manifestation:** `validate-html.js` create logger at module import. Mocking `createLogger()` fail intercept. Noise leak into test output. +- **Rule:** Intercept `console.*` directly when testing `validate-html.js`. Logger already captured at import. + +## POSIX Glob Path Normalization + +- **Date Discovered:** 2026-06-11 +- **Category:** Logic/Correctness +- **Context/Manifestation:** `globSync` with `{ posix: true }` fail match Windows `\` paths from `path.join`. +- **Rule:** Centralize path normalization in `gulp/config.js` via `toPosixPath()`. Base paths must be POSIX-compliant. + +## Cross-Platform Directory Resolution from Globs + +- **Date Discovered:** 2026-06-11 +- **Category:** Logic/Correctness +- **Context/Manifestation:** Base dir extraction from glob fail on Windows if only check `/`. +- **Rule:** Use `Math.max(sub.lastIndexOf('/'), sub.lastIndexOf('\\'))` to find last directory separator. + +## Windows-Safe Script Entrypoint Detection + +- **Date Discovered:** 2026-06-11 +- **Category:** Logic/Correctness +- **Context/Manifestation:** Direct entrypoint detection fail on Windows due to drive letter case/slashes. +- **Rule:** Normalize paths and use case-insensitive compare on Windows for `isDirectRun`. diff --git a/package.json b/package.json index dfc611d..f8f2065 100644 --- a/package.json +++ b/package.json @@ -1,152 +1,132 @@ { - "name": "gulp-devstack", - "version": "4.5.0", - "description": "Basic Gulp DevStack for basic front-end development with customized Bootstrap.", - "scripts": { - "start": "npm run dev", - "build": "node ./node_modules/gulp/bin/gulp.js -f gulpfile.build.js default", - "build:validate:html": "node ./node_modules/gulp/bin/gulp.js -f gulpfile.build.js validate", - "dev": "node ./node_modules/gulp/bin/gulp.js -f gulpfile.js default", - "deploy-ftp": "node ./node_modules/gulp/bin/gulp.js -f gulpfile.build.js deployFtp", - "export": "node ./node_modules/gulp/bin/gulp.js -f gulpfile.export.js default", - "export:validate:html": "gulp -f gulpfile.export.js validate", - "commit": "npx git-cz", - "format": "pnpm js:fix && npx prettier --write **/*.{css,scss,md,js,json} --list-different && pnpm css:fix && pnpm text:fix", - "css:lint": "npx stylelint **/*.scss", - "css:fix": "npx stylelint --fix **/*.scss", - "js:lint": "npx eslint '**/*.js'", - "js:fix": "npx eslint --fix '**/*.js'", - "text:lint": "npx remark-cli -q .", - "text:fix": "npx remark-cli -q . -o --", - "release": "npx release-it", - "todo": "node ./node_modules/gulp/bin/gulp.js -f gulpfile.js todo", - "todo:show": "npx leasot -x -r markdown -A '.txt,coffeeParser' './**/*.{js,html,njk,scss,txt,md,yml}' -i './node_modules/**/*'", - "pre-commit": "npx lint-staged", - "husky-init": "rm -rf .husky && husky init && echo \"pnpm pre-commit\" > .husky/pre-commit && echo \"npx commitlint --edit\" > .husky/commit-msg", - "prepare": "if [ \"$CI\" != \"true\" ]; then pnpm snyk-protect && husky; fi", - "snyk-protect": "npx snyk-protect" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/cebreus/gulp-devstack.git" - }, - "homepage": "https://github.com/cebreus/gulp-devstack#readme", - "author": "Jaroslav Vrana ", - "private": false, - "license": "MIT", - "bugs": { - "url": "https://github.com/cebreus/gulp-devstack/issues", - "email": "cebreus@live.com" - }, - "keywords": [ - "devstack", - "gulp", - "bootstrap" - ], - "engines": { - "node": ">=18" - }, - "lint-staged": { - "*.{css,scss,md,js,json}": [ - "npx prettier --write --list-different" - ], - "*.js": [ - "npx eslint --fix" - ], - "*.md": [ - "pnpm text:fix" - ], - "*.scss": [ - "npx stylelint --fix --allow-empty-input" - ] - }, - "snyk": true, - "dependencies": { - "autoprefixer": "^10.4.19", - "bootstrap": "5.3.2", - "browser-sync": "^3.0.2", - "cssnano": "^7.0.1", - "dotenv": "^16.4.5", - "fancy-log": "^2.0.0", - "gulp": "^4.0.2", - "gulp-babel": "^8.0.0", - "gulp-clean": "^0.4.0", - "gulp-concat": "^2.6.1", - "gulp-data": "^1.3.1", - "gulp-empty-pipe": "^5.0.0", - "gulp-favicons": "^4.0.1", - "gulp-google-webfonts": "^4.1.0", - "gulp-html-beautify": "^1.0.1", - "gulp-html-validate": "github:cebreus/gulp-html-validate", - "gulp-htmlmin": "^5.0.1", - "gulp-if": "^3.0.0", - "gulp-imagemin": "^9.1.0", - "gulp-inject": "^5.0.5", - "gulp-jsbeautifier": "^3.0.1", - "gulp-json-editor": "^2.6.0", - "gulp-markdown-to-json": "^1.1.0", - "gulp-newer": "^1.4.0", - "gulp-nunjucks-render": "^2.2.3", - "gulp-plumber": "^1.2.1", - "gulp-postcss": "^10.0.0", - "gulp-purgecss": "^6.0.0", - "gulp-rename": "^2.0.0", - "gulp-replace": "^1.1.4", - "gulp-rev": "^10.0.0", - "gulp-rev-delete-original": "^0.2.3", - "gulp-rev-replace": "^0.4.4", - "gulp-rev-rewrite": "^5.0.0", - "gulp-sass": "^5.1.0", - "gulp-sass-glob": "^1.1.0", - "gulp-sri-hash": "^2.2.1", - "gulp-todo": "^7.1.1", - "gulp-uglify": "^3.0.2", - "gulp-upng": "^1.0.3", - "imagemin-mozjpeg": "^10.0.0", - "marked": "^12.0.2", - "nunjucks-date-filter-locale": "^1.4.3", - "nunjucks-markdown-filter": "^0.1.0", - "postcss": "^8.4.38", - "postcss-scss": "^4.0.9", - "prettier": "^3.2.5", - "sass": "^1.77.1", - "through2": "^4.0.2", - "vinyl-ftp": "^0.6.1" - }, - "devDependencies": { - "@babel/core": "^7.24.5", - "@babel/eslint-parser": "^7.24.5", - "@babel/preset-env": "^7.24.5", - "@commitlint/cli": "^19.3.0", - "@commitlint/config-conventional": "^19.2.2", - "@j-ulrich/release-it-regex-bumper": "^5.1.0", - "@release-it/conventional-changelog": "^8.0.1", - "@snyk/protect": "^1.1291.0", - "@visionappscz/stylelint-config": "^3.0.0", - "eslint": "^8.57.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.2.4", - "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-regexp": "^2.5.0", - "html-validate": "^8.18.2", - "husky": "^9.0.11", - "lint-staged": "^15.2.2", - "release-it": "^17.2.1", - "remark": "^15.0.1", - "remark-cli": "^12.0.1", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "remark-lint-code": "^2.0.0", - "remark-lint-heading-whitespace": "^1.0.0", - "remark-lint-match-punctuation": "^0.2.1", - "remark-lint-no-dead-urls": "^1.1.0", - "remark-preset-lint-consistent": "^6.0.0", - "remark-preset-lint-markdown-style-guide": "^6.0.0", - "remark-preset-lint-recommended": "^7.0.0", - "stylelint": "^14.16.1", - "stylelint-high-performance-animation": "^1.10.0", - "stylelint-selector-bem-pattern": "^3.0.1" - } + "name": "gulp-devstack", + "version": "5.0.0", + "description": "Basic Gulp DevStack for basic front-end development with customized Bootstrap.", + "scripts": { + "start": "npm run dev", + "build": "cross-env BUILD_MODE=build node ./node_modules/gulp/bin/gulp.js", + "build:validate:html": "cross-env BUILD_MODE=build node ./node_modules/gulp/bin/gulp.js htmlValidate", + "dev": "cross-env BUILD_MODE=dev node ./node_modules/gulp/bin/gulp.js dev", + "export": "cross-env BUILD_MODE=export node ./node_modules/gulp/bin/gulp.js", + "export:validate:html": "cross-env BUILD_MODE=export node ./node_modules/gulp/bin/gulp.js htmlValidate", + "commit": "npx git-cz", + "lint": "pnpm run --parallel --no-bail \"/^lint:.*/\"", + "lint:js": "eslint .", + "lint:css": "stylelint \"**/*.scss\"", + "lint:md": "remark . --frail --quiet", + "lint:templates": "node scripts/run-njklint.js src/", + "lint:prettier": "prettier . --check", + "format": "pnpm run format:js && pnpm run format:css && pnpm run format:md && pnpm run format:templates && pnpm run format:prettier", + "format:js": "eslint . --fix", + "format:css": "stylelint \"**/*.scss\" --fix", + "format:md": "remark . --output --quiet", + "format:templates": "node scripts/run-njklint.js src/ --fix", + "format:prettier": "prettier . -l -w", + "release": "node scripts/release.js", + "prepare": "node -e \"if (require('fs').existsSync('.git')) require('child_process').spawnSync('lefthook', ['install'], {stdio: 'inherit'})\"", + "postinstall": "playwright install chromium", + "debug": "cross-env BUILD_MODE=dev DEBUG=true NODE_ENV=development node ./node_modules/gulp/bin/gulp.js dev", + "debug:meta": "cross-env BUILD_MODE=dev DEBUG_META=true NODE_ENV=development node ./node_modules/gulp/bin/gulp.js dev", + "test": "cross-env NODE_ENV=test node --test --test-concurrency=1 \"tests/unit/**/*.test.js\" \"tests/integration/**/*.test.js\"", + "test:unit": "cross-env NODE_ENV=test node --test --test-concurrency=1 \"tests/unit/**/*.test.js\"", + "test:integration": "cross-env NODE_ENV=test node --test --test-concurrency=1 \"tests/integration/**/*.test.js\"", + "test:e2e": "cross-env NODE_ENV=test node --test --test-concurrency=1 \"tests/e2e/**/*.test.js\"", + "test:smoke": "cross-env NODE_ENV=test node --test \"tests/smoke/**/*.test.js\"", + "test:visual": "cross-env NODE_ENV=test node --test --test-concurrency=1 \"tests/visual/**/*.test.js\"", + "test:ci": "pnpm run test && pnpm run test:smoke && pnpm run test:e2e", + "test:prod": "cross-env BUILD_MODE=build pnpm run test:e2e", + "test:export": "cross-env BUILD_MODE=export pnpm run test:e2e", + "test:coverage": "node --test --test-concurrency=1 --experimental-test-coverage \"tests/**/*.test.js\"", + "serve:build": "npx serve build-prod", + "verify:pipeline": "pnpm run lint && pnpm run test && pnpm run build && pnpm run test:smoke && pnpm run export && pnpm run test:prod && pnpm run test:export && pnpm run test:visual", + "component": "plop", + "lint-staged": "lint-staged" + }, + "type": "module", + "repository": { + "type": "git", + "url": "git+https://github.com/cebreus/gulp-devstack.git" + }, + "homepage": "https://github.com/cebreus/gulp-devstack#readme", + "author": "Jaroslav Vrana ", + "private": false, + "license": "MIT", + "bugs": { + "url": "https://github.com/cebreus/gulp-devstack/issues", + "email": "cebreus@live.com" + }, + "keywords": [ + "devstack", + "gulp", + "bootstrap" + ], + "engines": { + "node": ">=24.10.0" + }, + "dependencies": { + "bootstrap": "5.3.8" + }, + "devDependencies": { + "@axe-core/playwright": "^4.12.1", + "@commitlint/cli": "^21.2.0", + "@commitlint/config-conventional": "^21.2.0", + "@eslint-community/eslint-plugin-eslint-comments": "^4.7.2", + "@ianvs/prettier-plugin-sort-imports": "^4.7.1", + "@playwright/test": "^1.61.1", + "@popperjs/core": "^2.11.8", + "@visionappscz/stylelint-config": "^4.0.0", + "autoprefixer": "^10.5.2", + "browser-sync": "^3.0.4", + "cross-env": "^10.1.0", + "cssnano": "^8.0.2", + "del": "^8.0.1", + "esbuild": "^0.28.1", + "eslint": "^10.6.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-jsdoc": "^63.0.10", + "eslint-plugin-regexp": "^3.1.1", + "eslint-plugin-unused-imports": "^4.4.1", + "favicons": "^7.3.0", + "glob": "^13.0.6", + "globals": "^17.7.0", + "gray-matter": "^4.0.3", + "gulp": "^5.0.1", + "gulp-data": "^1.3.1", + "gulp-esbuild": "^0.15.0", + "gulp-inject": "^5.0.5", + "gulp-jsbeautifier": "^3.0.1", + "gulp-nunjucks-render": "^2.2.3", + "gulp-purgecss": "^8.0.0", + "gulp-rev": "^12.0.0", + "gulp-rev-rewrite": "^6.0.0", + "gulp-sri-hash": "^2.2.1", + "html-validate": "^11.5.5", + "lefthook": "^2.1.9", + "linkinator": "^7.6.1", + "lint-staged": "^17.0.8", + "markdown-it": "^14.2.0", + "nunjucklinter": "^1.3.0", + "nunjucks": "^3.2.4", + "picocolors": "^1.1.1", + "plop": "^4.0.5", + "postcss": "^8.5.16", + "prettier": "^3.9.4", + "prettier-plugin-jinja-template": "^2.2.0", + "remark": "^15.0.1", + "remark-cli": "^12.0.1", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.1", + "remark-lint-code": "^2.0.0", + "remark-lint-heading-whitespace": "^1.0.0", + "remark-lint-no-duplicate-headings": "^4.0.1", + "remark-preset-lint-consistent": "^6.0.1", + "remark-preset-lint-recommended": "^7.0.1", + "sass": "^1.101.0", + "sharp": "^0.35.2", + "stylelint": "^17.14.0", + "stylelint-config-standard-scss": "^17.0.0", + "stylelint-high-performance-animation": "^2.0.0", + "stylelint-selector-bem-pattern": "^5.0.0", + "svgo": "^4.0.1" + } } diff --git a/plopfile.js b/plopfile.js new file mode 100644 index 0000000..ec4df3b --- /dev/null +++ b/plopfile.js @@ -0,0 +1,49 @@ +/** + * Plopfile configuration for component generation. + * @param {import('plop').NodePlopAPI} plop - The Plop instance + */ +export default function (plop) { + plop.setGenerator('component', { + description: 'Create a new reusable UI component', + prompts: [ + { + type: 'input', + name: 'name', + message: 'Component name (kebab-case, e.g. "my-button"):', + validate: (value) => { + if (!value) { + return 'Name is required' + } + if (!/^[a-z0-9-]+$/.test(value)) { + return 'Use kebab-case' + } + return true + }, + }, + ], + actions: [ + { + type: 'add', + path: 'src/lib/components/{{dashCase name}}/{{dashCase name}}.njk', + templateFile: 'gulp/templates/component/component.njk.hbs', + }, + { + type: 'add', + path: 'src/lib/components/{{dashCase name}}/{{dashCase name}}.scss', + templateFile: 'gulp/templates/component/component.scss.hbs', + }, + { + type: 'add', + path: 'src/lib/components/{{dashCase name}}/{{dashCase name}}.md', + templateFile: 'gulp/templates/component/component.md.hbs', + }, + { + type: 'modify', + path: 'docs/COMPONENTS.md', + pattern: /## Component List/, + template: + '## Component List\n\n### {{dashCase name}}\n- **Path**: `src/lib/components/{{dashCase name}}`\n- **Status**: Boilerplate', + }, + ], + }) +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 72a420e..f58ae2b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,15537 +1,9664 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - autoprefixer: - specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.38) - bootstrap: - specifier: 5.3.2 - version: 5.3.2(@popperjs/core@2.11.8) - browser-sync: - specifier: ^3.0.2 - version: 3.0.2 - cssnano: - specifier: ^7.0.1 - version: 7.0.1(postcss@8.4.38) - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - fancy-log: - specifier: ^2.0.0 - version: 2.0.0 - gulp: - specifier: ^4.0.2 - version: 4.0.2 - gulp-babel: - specifier: ^8.0.0 - version: 8.0.0(@babel/core@7.24.5) - gulp-clean: - specifier: ^0.4.0 - version: 0.4.0 - gulp-concat: - specifier: ^2.6.1 - version: 2.6.1 - gulp-data: - specifier: ^1.3.1 - version: 1.3.1 - gulp-empty-pipe: - specifier: ^5.0.0 - version: 5.0.0 - gulp-favicons: - specifier: ^4.0.1 - version: 4.0.1 - gulp-google-webfonts: - specifier: ^4.1.0 - version: 4.1.0 - gulp-html-beautify: - specifier: ^1.0.1 - version: 1.0.1 - gulp-html-validate: - specifier: github:cebreus/gulp-html-validate - version: github.com/cebreus/gulp-html-validate/d7b9e99eaaa3d5df85c00274bb5f5e61e0fe85d9(gulp@4.0.2)(html-validate@8.18.2) - gulp-htmlmin: - specifier: ^5.0.1 - version: 5.0.1 - gulp-if: - specifier: ^3.0.0 - version: 3.0.0 - gulp-imagemin: - specifier: ^9.1.0 - version: 9.1.0(gulp@4.0.2) - gulp-inject: - specifier: ^5.0.5 - version: 5.0.5 - gulp-jsbeautifier: - specifier: ^3.0.1 - version: 3.0.1 - gulp-json-editor: - specifier: ^2.6.0 - version: 2.6.0 - gulp-markdown-to-json: - specifier: ^1.1.0 - version: 1.1.0 - gulp-newer: - specifier: ^1.4.0 - version: 1.4.0 - gulp-nunjucks-render: - specifier: ^2.2.3 - version: 2.2.3 - gulp-plumber: - specifier: ^1.2.1 - version: 1.2.1 - gulp-postcss: - specifier: ^10.0.0 - version: 10.0.0(postcss@8.4.38) - gulp-purgecss: - specifier: ^6.0.0 - version: 6.0.0 - gulp-rename: - specifier: ^2.0.0 - version: 2.0.0 - gulp-replace: - specifier: ^1.1.4 - version: 1.1.4 - gulp-rev: - specifier: ^10.0.0 - version: 10.0.0(gulp@4.0.2) - gulp-rev-delete-original: - specifier: ^0.2.3 - version: 0.2.3 - gulp-rev-replace: - specifier: ^0.4.4 - version: 0.4.4 - gulp-rev-rewrite: - specifier: ^5.0.0 - version: 5.0.0 - gulp-sass: - specifier: ^5.1.0 - version: 5.1.0 - gulp-sass-glob: - specifier: ^1.1.0 - version: 1.1.0 - gulp-sri-hash: - specifier: ^2.2.1 - version: 2.2.1 - gulp-todo: - specifier: ^7.1.1 - version: 7.1.1 - gulp-uglify: - specifier: ^3.0.2 - version: 3.0.2 - gulp-upng: - specifier: ^1.0.3 - version: 1.0.3 - imagemin-mozjpeg: - specifier: ^10.0.0 - version: 10.0.0 - marked: - specifier: ^12.0.2 - version: 12.0.2 - nunjucks-date-filter-locale: - specifier: ^1.4.3 - version: 1.4.3 - nunjucks-markdown-filter: - specifier: ^0.1.0 - version: 0.1.0 - postcss: - specifier: ^8.4.38 - version: 8.4.38 - postcss-scss: - specifier: ^4.0.9 - version: 4.0.9(postcss@8.4.38) - prettier: - specifier: ^3.2.5 - version: 3.2.5 - sass: - specifier: ^1.77.1 - version: 1.77.1 - through2: - specifier: ^4.0.2 - version: 4.0.2 - vinyl-ftp: - specifier: ^0.6.1 - version: 0.6.1 - -devDependencies: - '@babel/core': - specifier: ^7.24.5 - version: 7.24.5 - '@babel/eslint-parser': - specifier: ^7.24.5 - version: 7.24.5(@babel/core@7.24.5)(eslint@8.57.0) - '@babel/preset-env': - specifier: ^7.24.5 - version: 7.24.5(@babel/core@7.24.5) - '@commitlint/cli': - specifier: ^19.3.0 - version: 19.3.0(@types/node@20.12.12)(typescript@5.4.5) - '@commitlint/config-conventional': - specifier: ^19.2.2 - version: 19.2.2 - '@j-ulrich/release-it-regex-bumper': - specifier: ^5.1.0 - version: 5.1.0(release-it@17.2.1) - '@release-it/conventional-changelog': - specifier: ^8.0.1 - version: 8.0.1(release-it@17.2.1) - '@snyk/protect': - specifier: ^1.1291.0 - version: 1.1291.0 - '@visionappscz/stylelint-config': - specifier: ^3.0.0 - version: 3.0.0(postcss@8.4.38)(stylelint@14.16.1) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-airbnb-base: - specifier: ^15.0.0 - version: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) - eslint-plugin-import: - specifier: ^2.29.1 - version: 2.29.1(eslint@8.57.0) - eslint-plugin-jsdoc: - specifier: ^48.2.4 - version: 48.2.4(eslint@8.57.0) - eslint-plugin-prettier: - specifier: ^5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) - eslint-plugin-regexp: - specifier: ^2.5.0 - version: 2.5.0(eslint@8.57.0) - html-validate: - specifier: ^8.18.2 - version: 8.18.2 - husky: - specifier: ^9.0.11 - version: 9.0.11 - lint-staged: - specifier: ^15.2.2 - version: 15.2.2 - release-it: - specifier: ^17.2.1 - version: 17.2.1(typescript@5.4.5) - remark: - specifier: ^15.0.1 - version: 15.0.1 - remark-cli: - specifier: ^12.0.1 - version: 12.0.1 - remark-frontmatter: - specifier: ^5.0.0 - version: 5.0.0 - remark-gfm: - specifier: ^4.0.0 - version: 4.0.0 - remark-lint-code: - specifier: ^2.0.0 - version: 2.0.0 - remark-lint-heading-whitespace: - specifier: ^1.0.0 - version: 1.0.0 - remark-lint-match-punctuation: - specifier: ^0.2.1 - version: 0.2.1 - remark-lint-no-dead-urls: - specifier: ^1.1.0 - version: 1.1.0 - remark-preset-lint-consistent: - specifier: ^6.0.0 - version: 6.0.0 - remark-preset-lint-markdown-style-guide: - specifier: ^6.0.0 - version: 6.0.0 - remark-preset-lint-recommended: - specifier: ^7.0.0 - version: 7.0.0 - stylelint: - specifier: ^14.16.1 - version: 14.16.1 - stylelint-high-performance-animation: - specifier: ^1.10.0 - version: 1.10.0(stylelint@14.16.1) - stylelint-selector-bem-pattern: - specifier: ^3.0.1 - version: 3.0.1(eslint@8.57.0)(typescript@5.4.5) +overrides: + favicons>sharp: 0.35.2 + ws@>=8.0.0 <8.21.0: ^8.21.0 + +importers: + + .: + dependencies: + bootstrap: + specifier: 5.3.8 + version: 5.3.8(@popperjs/core@2.11.8) + devDependencies: + '@axe-core/playwright': + specifier: ^4.12.1 + version: 4.12.1(playwright-core@1.61.1) + '@commitlint/cli': + specifier: ^21.2.0 + version: 21.2.0(@types/node@26.0.1)(typescript@6.0.3) + '@commitlint/config-conventional': + specifier: ^21.2.0 + version: 21.2.0 + '@eslint-community/eslint-plugin-eslint-comments': + specifier: ^4.7.2 + version: 4.7.2(eslint@10.6.0(jiti@2.6.1)) + '@ianvs/prettier-plugin-sort-imports': + specifier: ^4.7.1 + version: 4.7.1(prettier@3.9.4) + '@playwright/test': + specifier: ^1.61.1 + version: 1.61.1 + '@popperjs/core': + specifier: ^2.11.8 + version: 2.11.8 + '@visionappscz/stylelint-config': + specifier: ^4.0.0 + version: 4.0.0(postcss@8.5.16)(stylelint@17.14.0(typescript@6.0.3)) + autoprefixer: + specifier: ^10.5.2 + version: 10.5.2(postcss@8.5.16) + browser-sync: + specifier: ^3.0.4 + version: 3.0.4 + cross-env: + specifier: ^10.1.0 + version: 10.1.0 + cssnano: + specifier: ^8.0.2 + version: 8.0.2(postcss@8.5.16) + del: + specifier: ^8.0.1 + version: 8.0.1 + esbuild: + specifier: ^0.28.1 + version: 0.28.1 + eslint: + specifier: ^10.6.0 + version: 10.6.0(jiti@2.6.1) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@10.6.0(jiti@2.6.1)) + eslint-plugin-jsdoc: + specifier: ^63.0.10 + version: 63.0.10(eslint@10.6.0(jiti@2.6.1)) + eslint-plugin-regexp: + specifier: ^3.1.1 + version: 3.1.1(eslint@10.6.0(jiti@2.6.1)) + eslint-plugin-unused-imports: + specifier: ^4.4.1 + version: 4.4.1(eslint@10.6.0(jiti@2.6.1)) + favicons: + specifier: ^7.3.0 + version: 7.3.0 + glob: + specifier: ^13.0.6 + version: 13.0.6 + globals: + specifier: ^17.7.0 + version: 17.7.0 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + gulp: + specifier: ^5.0.1 + version: 5.0.1 + gulp-data: + specifier: ^1.3.1 + version: 1.3.1 + gulp-esbuild: + specifier: ^0.15.0 + version: 0.15.0(esbuild@0.28.1)(gulp@5.0.1) + gulp-inject: + specifier: ^5.0.5 + version: 5.0.5 + gulp-jsbeautifier: + specifier: ^3.0.1 + version: 3.0.1 + gulp-nunjucks-render: + specifier: ^2.2.3 + version: 2.2.3(chokidar@3.6.0) + gulp-purgecss: + specifier: ^8.0.0 + version: 8.0.0 + gulp-rev: + specifier: ^12.0.0 + version: 12.0.0(gulp@5.0.1) + gulp-rev-rewrite: + specifier: ^6.0.0 + version: 6.0.0 + gulp-sri-hash: + specifier: ^2.2.1 + version: 2.2.1 + html-validate: + specifier: ^11.5.5 + version: 11.5.5 + lefthook: + specifier: ^2.1.9 + version: 2.1.9 + linkinator: + specifier: ^7.6.1 + version: 7.6.1 + lint-staged: + specifier: ^17.0.8 + version: 17.0.8 + markdown-it: + specifier: ^14.2.0 + version: 14.2.0 + nunjucklinter: + specifier: ^1.3.0 + version: 1.3.0 + nunjucks: + specifier: ^3.2.4 + version: 3.2.4(chokidar@3.6.0) + picocolors: + specifier: ^1.1.1 + version: 1.1.1 + plop: + specifier: ^4.0.5 + version: 4.0.5(@types/node@26.0.1) + postcss: + specifier: ^8.5.16 + version: 8.5.16 + prettier: + specifier: ^3.9.4 + version: 3.9.4 + prettier-plugin-jinja-template: + specifier: ^2.2.0 + version: 2.2.0(prettier@3.9.4) + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-cli: + specifier: ^12.0.1 + version: 12.0.1 + remark-frontmatter: + specifier: ^5.0.0 + version: 5.0.0 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 + remark-lint-code: + specifier: ^2.0.0 + version: 2.0.0 + remark-lint-heading-whitespace: + specifier: ^1.0.0 + version: 1.0.0 + remark-lint-no-duplicate-headings: + specifier: ^4.0.1 + version: 4.0.1 + remark-preset-lint-consistent: + specifier: ^6.0.1 + version: 6.0.1 + remark-preset-lint-recommended: + specifier: ^7.0.1 + version: 7.0.1 + sass: + specifier: ^1.101.0 + version: 1.101.0 + sharp: + specifier: ^0.35.2 + version: 0.35.2 + stylelint: + specifier: ^17.14.0 + version: 17.14.0(typescript@6.0.3) + stylelint-config-standard-scss: + specifier: ^17.0.0 + version: 17.0.0(postcss@8.5.16)(stylelint@17.14.0(typescript@6.0.3)) + stylelint-high-performance-animation: + specifier: ^2.0.0 + version: 2.0.0(stylelint@17.14.0(typescript@6.0.3)) + stylelint-selector-bem-pattern: + specifier: ^5.0.0 + version: 5.0.0(stylelint@17.14.0(typescript@6.0.3)) + svgo: + specifier: ^4.0.1 + version: 4.0.1 packages: - /@ampproject/remapping@2.3.0: - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@axe-core/playwright@4.12.1': + resolution: {integrity: sha512-rMd7xriptqKpP+w5265i4Hdkv2X5kbu6uiBi/B2I7uf3hieRBM3qDCfaKPtxfiYb2mKXfF+yLODJwIx+Jv1GDw==} + peerDependencies: + playwright-core: '>= 1.0.0' - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.24.5 - picocolors: 1.0.1 - /@babel/compat-data@7.24.4: - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.24.5: - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - /@babel/eslint-parser@7.24.5(@babel/core@7.24.5)(eslint@8.57.0): - resolution: {integrity: sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - dependencies: - '@babel/core': 7.24.5 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.57.0 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - dev: true - /@babel/generator@7.24.5: - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - dev: true - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - dev: true + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 - lru-cache: 5.1.1 - semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.24.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - semver: 6.3.1 - dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: true - - /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.5): - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} + '@cacheable/memory@2.2.0': + resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@cacheable/utils@2.5.0': + resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 + '@colordx/core@5.5.0': + resolution: {integrity: sha512-3PxTH8itZzltK0U9jTwVVnjLXvnDYuq3m+QXsHkENxWiPRh4WaoLcs1SQjqgZ55kS+QyirpH5BVwzP2gMVG6EQ==} - /@babel/helper-member-expression-to-functions@7.24.5: - resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - dev: true + '@commitlint/cli@21.2.0': + resolution: {integrity: sha512-4GLVIhUaT3c3GBlQ0GB80/5H3xXdn/Tgw4lrsuoOQVDu2wl4Xw0GuzSar8xZKSMv4H3xaKaQXmvH91GmdyYBZA==} + engines: {node: '>=22.12.0'} + hasBin: true - /@babel/helper-module-imports@7.24.3: - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 + '@commitlint/config-conventional@21.2.0': + resolution: {integrity: sha512-Qf8WRDVcyVd14if6VTWenebxFbKnVnbzPUJjlzjkyJGeHK2xCGd63Dr1XZzj0plXKQb9P0BfOxoc1HVeCo2BWQ==} + engines: {node: '>=22.12.0'} - /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@commitlint/config-validator@21.2.0': + resolution: {integrity: sha512-t7AzNHAKeIdo/3NRGwzpufKHsKkPHmFs/56N2Fnsh0/r0rGtnQzTxk6vnFgjaGr4hdSQKNB50/KAhR9Yk4LJKA==} + engines: {node: '>=22.12.0'} - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - dev: true + '@commitlint/ensure@21.2.0': + resolution: {integrity: sha512-76IF9vDNS13lAzEEik9eKwzt8f9hYhWiwVXZ2AnyLCz5/f511FsEQ3pw1X3/zSQpdRLQU7i5qDMVKyXi1GWjSg==} + engines: {node: '>=22.12.0'} - /@babel/helper-plugin-utils@7.24.5: - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} - engines: {node: '>=6.9.0'} - dev: true + '@commitlint/execute-rule@21.0.1': + resolution: {integrity: sha512-RifH+FmImozKBE6mozhF4K3r2RRKP7SMi/Q/zLCmExtp5e05lhHOUYqGBlFBAGNHaZxU/WYw1XuugYK9jQzqnA==} + engines: {node: '>=22.12.0'} - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.24.5 - dev: true + '@commitlint/format@21.2.0': + resolution: {integrity: sha512-c4q64xaav2U83t7k7RyzJerBZurPer7FxUOY0RL5L/6CZijZ7K+s6HIBGIghj0ey1P2+seRX0J9XQYtDued6tg==} + engines: {node: '>=22.12.0'} - /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.24.5 - '@babel/helper-optimise-call-expression': 7.22.5 - dev: true + '@commitlint/is-ignored@21.2.0': + resolution: {integrity: sha512-4/eB0vBN7L88O/oC4ajAEqi7j2ZfNgxl/+11RfAV9YosejZgDXhY2C9VcHnHJhOzPLoSy5P3Mg/46kqeyJfXKw==} + engines: {node: '>=22.12.0'} - /@babel/helper-simple-access@7.24.5: - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 + '@commitlint/lint@21.2.0': + resolution: {integrity: sha512-ceO5dp9pLjEZ6y6qbq/uXWXDPykqqlTsyzoQ0NzecpisSJhK3kTy9qzQoPeJuWG/IMNdV1lO0RgmzqoAlSi1uw==} + engines: {node: '>=22.12.0'} - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - dev: true + '@commitlint/load@21.2.0': + resolution: {integrity: sha512-RjlzWQqruRwIenJEfZtq7kG97co97nKoHpflE5YnF61tDLXxHPrdWImgzw6VL6MlFyaOcVlk74eBV8ZQmc3oIA==} + engines: {node: '>=22.12.0'} - /@babel/helper-split-export-declaration@7.24.5: - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 + '@commitlint/message@21.2.0': + resolution: {integrity: sha512-YxGoiXD/HXNXLJPrQwE5poXa+XH0CBEm+mdvbHQP0g6MV/dmJyUFCzPNzZbxL93GvZ70TmtTK0Z0/IBpAqHv8g==} + engines: {node: '>=22.12.0'} - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} + '@commitlint/parse@21.2.0': + resolution: {integrity: sha512-QHWxG4d0PLTF634/AdyZ0MQS+CLn5YOuJlCFhMMlSGKFxzYGUetkHBj18xgBD+6fVzUrA2lrCdi/vlS2f/oYXg==} + engines: {node: '>=22.12.0'} - /@babel/helper-validator-identifier@7.24.5: - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} - engines: {node: '>=6.9.0'} + '@commitlint/read@21.2.0': + resolution: {integrity: sha512-ELx8Ovh/JoAw5lpvDgxc6Y0We9skf2IPI2RFN+gnYgDGjRdMSF8zeodxhZmcclLWzfUIF7hXLOa8gOlllYcvBA==} + engines: {node: '>=22.12.0'} - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} + '@commitlint/resolve-extends@21.2.0': + resolution: {integrity: sha512-4O/1j51+79Wth9s/MGxt/5gs0XYLDgNlYpltQfhAvLE0itusLKs9zruxbiNg1oOkmkb9L9L4USYGjEj7n87NxA==} + engines: {node: '>=22.12.0'} - /@babel/helper-wrap-function@7.24.5: - resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 - dev: true + '@commitlint/rules@21.2.0': + resolution: {integrity: sha512-C2yXMNpiB8ETZKfx5JD8+ExgF8vTU1VQMKPSUUYwqKpw9oJWQBrlXBpdU038mj2WPjof7o9UzFpmTyBeGMZwZg==} + engines: {node: '>=22.12.0'} - /@babel/helpers@7.24.5: - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - transitivePeerDependencies: - - supports-color + '@commitlint/to-lines@21.0.1': + resolution: {integrity: sha512-bd1BFII7p1EQZre9Kaj+kKaMFP3cFCdt21K7DItVux9XP5WjLgJ0/Uy1pJJh9aPwVJ6SKg62PxqlZaHI8hQAXw==} + engines: {node: '>=22.12.0'} - /@babel/highlight@7.24.5: - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.24.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 + '@commitlint/top-level@21.2.0': + resolution: {integrity: sha512-Y5gmQ+KxzqCrBFJfLvFEPvvwD3LDiNZoTT2yeFBm96M8qhmqSzQc5DvX3rheAaAMjyIvMXOCLS/mWfdpONsjyQ==} + engines: {node: '>=22.12.0'} - /@babel/parser@7.24.5: - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.24.5 + '@commitlint/types@21.2.0': + resolution: {integrity: sha512-7zVFCDB2reMvJH5dmbKnOQPjZEvjdJTH8jc0U/PIPU1r3/+vf5pD1HlfitV2MWsWXrvu7u39iY1lyLUPOaN0Gw==} + engines: {node: '>=22.12.0'} - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} - engines: {node: '>=6.9.0'} + '@conventional-changelog/git-client@2.7.0': + resolution: {integrity: sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==} + engines: {node: '>=18'} peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + conventional-commits-filter: ^5.0.0 + conventional-commits-parser: ^6.4.0 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@conventional-changelog/template@1.2.0': + resolution: {integrity: sha512-12qHxvlKjHmP0PQ+17EREgC7lWyLwbph1RKcZQZ7k7ZWGmrxfxC9gadHGfvzr0g0u8BhiBGg3tks93txodlyRQ==} + engines: {node: '>=22'} - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} - engines: {node: '>=6.9.0'} + '@csstools/css-calc@3.2.1': + resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - dev: true + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} - engines: {node: '>=6.9.0'} + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@csstools/css-tokenizer': ^4.0.0 - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} + '@csstools/css-syntax-patches-for-csstree@1.1.6': + resolution: {integrity: sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - dev: true + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + '@csstools/media-query-list-parser@5.0.0': + resolution: {integrity: sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} + '@csstools/selector-resolve-nested@4.0.0': + resolution: {integrity: sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + postcss-selector-parser: ^7.1.1 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + '@csstools/selector-specificity@6.0.0': + resolution: {integrity: sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + postcss-selector-parser: ^7.1.1 - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} - /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@epic-web/invariant@1.0.0': + resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} - /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@es-joy/jsdoccomment@0.87.0': + resolution: {integrity: sha512-mFXZloZMzuJZXSHUmAFu/pXTk0ZJTJBluuAkrvbzidpTN8W6F2bpRFuedSH+85kbdlRLJqc+gfN+kD3JOLJK5g==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@es-joy/resolve.exports@1.2.0': + resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} + engines: {node: '>=10'} - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.5): - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - dev: true + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - dev: true + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] - /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] - /@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] - /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] - /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.5): - resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - dev: true + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] - /@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - '@babel/helper-split-export-declaration': 7.24.5 - globals: 11.12.0 - dev: true - - /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/template': 7.24.0 - dev: true + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] - /@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] - /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] - /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] - /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - dev: true + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] - /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] - /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - dev: true + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] - /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] - /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] - /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} - engines: {node: '>=6.9.0'} + '@eslint-community/eslint-plugin-eslint-comments@4.7.2': + resolution: {integrity: sha512-LF03qURSwEWm2dz5wtdDCzNk+7Opl0X7q6I3undsaIuNsEiNvRV3BCtqu14Q/6Pzg1tBj44LcxpW2EpSLZStZw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - dev: true + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} - engines: {node: '>=6.9.0'} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - dev: true + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-simple-access': 7.24.5 - dev: true + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 - dev: true + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@gulpjs/messages@1.1.0': + resolution: {integrity: sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==} + engines: {node: '>=10.13.0'} - /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@gulpjs/to-absolute-glob@4.0.0': + resolution: {integrity: sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==} + engines: {node: '>=10.13.0'} - /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - dev: true + '@html-validate/stylish@6.0.0': + resolution: {integrity: sha512-d1/lI3qIXhGVJF3+MmKEBn1dRX6U4Z+BDaOdDI3E6SXcO+OQ7hC/3mSo6BIjwQlcuV6NdDOKm6QCrzIQL1EezQ==} + engines: {node: ^22.16.0 || >= 24.0.0} - /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - dev: true + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} - /@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - dev: true + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} - /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - dev: true + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} - /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - dev: true + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} - /@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - dev: true + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} - /@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} - engines: {node: '>=6.9.0'} + '@ianvs/prettier-plugin-sort-imports@4.7.1': + resolution: {integrity: sha512-jmTNYGlg95tlsoG3JLCcuC4BrFELJtLirLAkQW/71lXSyOhVt/Xj7xWbbGcuVbNq1gwWgSyMrPjJc9Z30hynVw==} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@prettier/plugin-oxc': ^0.0.4 || ^0.1.0 + '@vue/compiler-sfc': 2.7.x || 3.x + content-tag: ^4.0.0 + prettier: 2 || 3 || ^4.0.0-0 + prettier-plugin-ember-template-tag: ^2.1.0 + peerDependenciesMeta: + '@prettier/plugin-oxc': + optional: true + '@vue/compiler-sfc': + optional: true + content-tag: + optional: true + prettier-plugin-ember-template-tag: + optional: true - /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} - /@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - dev: true + '@img/sharp-darwin-arm64@0.35.2': + resolution: {integrity: sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [darwin] - /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@img/sharp-darwin-x64@0.35.2': + resolution: {integrity: sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [darwin] - /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - regenerator-transform: 0.15.2 - dev: true + '@img/sharp-freebsd-wasm32@0.35.2': + resolution: {integrity: sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==} + engines: {node: '>=20.9.0'} + os: [freebsd] - /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@img/sharp-libvips-darwin-arm64@1.3.1': + resolution: {integrity: sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==} + cpu: [arm64] + os: [darwin] - /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@img/sharp-libvips-darwin-x64@1.3.1': + resolution: {integrity: sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==} + cpu: [x64] + os: [darwin] - /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true + '@img/sharp-libvips-linux-arm64@1.3.1': + resolution: {integrity: sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==} + cpu: [arm64] + os: [linux] + libc: [glibc] - /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@img/sharp-libvips-linux-arm@1.3.1': + resolution: {integrity: sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==} + cpu: [arm] + os: [linux] + libc: [glibc] - /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@img/sharp-libvips-linux-ppc64@1.3.1': + resolution: {integrity: sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==} + cpu: [ppc64] + os: [linux] + libc: [glibc] - /@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@img/sharp-libvips-linux-riscv64@1.3.1': + resolution: {integrity: sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] - /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@img/sharp-libvips-linux-s390x@1.3.1': + resolution: {integrity: sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==} + cpu: [s390x] + os: [linux] + libc: [glibc] - /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@img/sharp-libvips-linux-x64@1.3.1': + resolution: {integrity: sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==} + cpu: [x64] + os: [linux] + libc: [glibc] - /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@img/sharp-libvips-linuxmusl-arm64@1.3.1': + resolution: {integrity: sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==} + cpu: [arm64] + os: [linux] + libc: [musl] - /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - dev: true + '@img/sharp-libvips-linuxmusl-x64@1.3.1': + resolution: {integrity: sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==} + cpu: [x64] + os: [linux] + libc: [musl] - /@babel/preset-env@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.5) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.1 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true + '@img/sharp-linux-arm64@0.35.2': + resolution: {integrity: sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5): - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/types': 7.24.5 - esutils: 2.0.3 - dev: true + '@img/sharp-linux-arm@0.35.2': + resolution: {integrity: sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==} + engines: {node: '>=20.9.0'} + cpu: [arm] + os: [linux] + libc: [glibc] - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: true + '@img/sharp-linux-ppc64@0.35.2': + resolution: {integrity: sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==} + engines: {node: '>=20.9.0'} + cpu: [ppc64] + os: [linux] + libc: [glibc] - /@babel/runtime-corejs3@7.24.5: - resolution: {integrity: sha512-GWO0mgzNMLWaSYM4z4NVIuY0Cd1fl8cPnuetuddu5w/qGuvt5Y7oUi/kvvQGK9xgOkFJDQX2heIvTRn/OQ1XTg==} - engines: {node: '>=6.9.0'} - dependencies: - core-js-pure: 3.37.1 - regenerator-runtime: 0.14.1 - dev: true + '@img/sharp-linux-riscv64@0.35.2': + resolution: {integrity: sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==} + engines: {node: '>=20.9.0'} + cpu: [riscv64] + os: [linux] + libc: [glibc] - /@babel/runtime@7.24.5: - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: true + '@img/sharp-linux-s390x@0.35.2': + resolution: {integrity: sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==} + engines: {node: '>=20.9.0'} + cpu: [s390x] + os: [linux] + libc: [glibc] - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@img/sharp-linux-x64@0.35.2': + resolution: {integrity: sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + libc: [glibc] - /@babel/traverse@7.24.5: - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@img/sharp-linuxmusl-arm64@0.35.2': + resolution: {integrity: sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + libc: [musl] - /@babel/types@7.24.5: - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 - to-fast-properties: 2.0.0 + '@img/sharp-linuxmusl-x64@0.35.2': + resolution: {integrity: sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + libc: [musl] - /@commitlint/cli@19.3.0(@types/node@20.12.12)(typescript@5.4.5): - resolution: {integrity: sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==} - engines: {node: '>=v18'} - hasBin: true - dependencies: - '@commitlint/format': 19.3.0 - '@commitlint/lint': 19.2.2 - '@commitlint/load': 19.2.0(@types/node@20.12.12)(typescript@5.4.5) - '@commitlint/read': 19.2.1 - '@commitlint/types': 19.0.3 - execa: 8.0.1 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - typescript - dev: true + '@img/sharp-wasm32@0.35.2': + resolution: {integrity: sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==} + engines: {node: '>=20.9.0'} - /@commitlint/config-conventional@19.2.2: - resolution: {integrity: sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 19.0.3 - conventional-changelog-conventionalcommits: 7.0.2 - dev: true + '@img/sharp-webcontainers-wasm32@0.35.2': + resolution: {integrity: sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==} + engines: {node: '>=20.9.0'} + cpu: [wasm32] - /@commitlint/config-validator@19.0.3: - resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 19.0.3 - ajv: 8.13.0 - dev: true + '@img/sharp-win32-arm64@0.35.2': + resolution: {integrity: sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [win32] - /@commitlint/ensure@19.0.3: - resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 19.0.3 - lodash.camelcase: 4.3.0 - lodash.kebabcase: 4.1.1 - lodash.snakecase: 4.1.1 - lodash.startcase: 4.4.0 - lodash.upperfirst: 4.3.1 - dev: true + '@img/sharp-win32-ia32@0.35.2': + resolution: {integrity: sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==} + engines: {node: ^20.9.0} + cpu: [ia32] + os: [win32] - /@commitlint/execute-rule@19.0.0: - resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} - engines: {node: '>=v18'} - dev: true + '@img/sharp-win32-x64@0.35.2': + resolution: {integrity: sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [win32] - /@commitlint/format@19.3.0: - resolution: {integrity: sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 19.0.3 - chalk: 5.3.0 - dev: true + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - /@commitlint/is-ignored@19.2.2: - resolution: {integrity: sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 19.0.3 - semver: 7.6.2 - dev: true + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} - /@commitlint/lint@19.2.2: - resolution: {integrity: sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/is-ignored': 19.2.2 - '@commitlint/parse': 19.0.3 - '@commitlint/rules': 19.0.3 - '@commitlint/types': 19.0.3 - dev: true + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} - /@commitlint/load@19.2.0(@types/node@20.12.12)(typescript@5.4.5): - resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/config-validator': 19.0.3 - '@commitlint/execute-rule': 19.0.0 - '@commitlint/resolve-extends': 19.1.0 - '@commitlint/types': 19.0.3 - chalk: 5.3.0 - cosmiconfig: 9.0.0(typescript@5.4.5) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.12.12)(cosmiconfig@9.0.0)(typescript@5.4.5) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - transitivePeerDependencies: - - '@types/node' - - typescript - dev: true + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} - /@commitlint/message@19.0.0: - resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==} - engines: {node: '>=v18'} - dev: true + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - /@commitlint/parse@19.0.3: - resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 19.0.3 - conventional-changelog-angular: 7.0.0 - conventional-commits-parser: 5.0.0 - dev: true + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} - /@commitlint/read@19.2.1: - resolution: {integrity: sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/top-level': 19.0.0 - '@commitlint/types': 19.0.3 - execa: 8.0.1 - git-raw-commits: 4.0.0 - minimist: 1.2.8 - dev: true + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - /@commitlint/resolve-extends@19.1.0: - resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/config-validator': 19.0.3 - '@commitlint/types': 19.0.3 - global-directory: 4.0.1 - import-meta-resolve: 4.1.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - dev: true + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - /@commitlint/rules@19.0.3: - resolution: {integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/ensure': 19.0.3 - '@commitlint/message': 19.0.0 - '@commitlint/to-lines': 19.0.0 - '@commitlint/types': 19.0.3 - execa: 8.0.1 - dev: true + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.6.0 - /@commitlint/to-lines@19.0.0: - resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==} - engines: {node: '>=v18'} - dev: true + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - /@commitlint/top-level@19.0.0: - resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==} - engines: {node: '>=v18'} - dependencies: - find-up: 7.0.0 - dev: true + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} - /@commitlint/types@19.0.3: - resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} - engines: {node: '>=v18'} - dependencies: - '@types/conventional-commits-parser': 5.0.0 - chalk: 5.3.0 - dev: true + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} - /@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1): - resolution: {integrity: sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - '@csstools/css-tokenizer': ^2.3.1 - dependencies: - '@csstools/css-tokenizer': 2.3.1 - dev: true + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} - /@csstools/css-tokenizer@2.3.1: - resolution: {integrity: sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==} - engines: {node: ^14 || ^16 || >=18} - dev: true + '@npmcli/config@8.3.4': + resolution: {integrity: sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==} + engines: {node: ^16.14.0 || >=18.0.0} - /@csstools/media-query-list-parser@2.1.11(@csstools/css-parser-algorithms@2.6.3)(@csstools/css-tokenizer@2.3.1): - resolution: {integrity: sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - '@csstools/css-parser-algorithms': ^2.6.3 - '@csstools/css-tokenizer': ^2.3.1 - dependencies: - '@csstools/css-parser-algorithms': 2.6.3(@csstools/css-tokenizer@2.3.1) - '@csstools/css-tokenizer': 2.3.1 - dev: true + '@npmcli/git@5.0.8': + resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} + engines: {node: ^16.14.0 || >=18.0.0} - /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.0.16): - resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss-selector-parser: ^6.0.10 - dependencies: - postcss-selector-parser: 6.0.16 - dev: true + '@npmcli/map-workspaces@3.0.6': + resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - /@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.0.16): - resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss-selector-parser: ^6.0.13 - dependencies: - postcss-selector-parser: 6.0.16 - dev: true + '@npmcli/name-from-folder@2.0.0': + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - /@dual-bundle/import-meta-resolve@4.1.0: - resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} - dev: true + '@npmcli/package-json@5.2.1': + resolution: {integrity: sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==} + engines: {node: ^16.14.0 || >=18.0.0} - /@emnapi/runtime@1.1.1: - resolution: {integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==} - requiresBuild: true - dependencies: - tslib: 2.6.2 - dev: false - optional: true + '@npmcli/promise-spawn@7.0.2': + resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} + engines: {node: ^16.14.0 || >=18.0.0} - /@es-joy/jsdoccomment@0.43.0: - resolution: {integrity: sha512-Q1CnsQrytI3TlCB1IVWXWeqUIPGVEKGaE7IbVdt13Nq/3i0JESAkQQERrfiQkmlpijl+++qyqPgaS31Bvc1jRQ==} - engines: {node: '>=16'} - dependencies: - '@types/eslint': 8.56.10 - '@types/estree': 1.0.5 - '@typescript-eslint/types': 7.9.0 - comment-parser: 1.4.1 - esquery: 1.5.0 - jsdoc-type-pratt-parser: 4.0.0 - dev: true + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - dev: true + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] - /@eslint/js@8.57.0: - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@html-validate/stylish@4.2.0: - resolution: {integrity: sha512-Nl8HCv0hGRSLQ+n1OD4Hk3a+Urwk9HH0vQkAzzCarT4KlA7bRl+6xEiS5PZVwOmjtC7XiH/oNe3as9Fxcr2A1w==} - engines: {node: '>= 16'} - dependencies: - kleur: 4.1.5 - - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@2.0.3: - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - dev: true - - /@hutson/parse-repository-url@5.0.0: - resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} - engines: {node: '>=10.13.0'} - dev: true - - /@iarna/toml@2.2.5: - resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - dev: true - - /@img/sharp-darwin-arm64@0.33.3: - resolution: {integrity: sha512-FaNiGX1MrOuJ3hxuNzWgsT/mg5OHG/Izh59WW2mk1UwYHUwtfbhk5QNKYZgxf0pLOhx9ctGiGa2OykD71vOnSw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.2 - dev: false - optional: true - - /@img/sharp-darwin-x64@0.33.3: - resolution: {integrity: sha512-2QeSl7QDK9ru//YBT4sQkoq7L0EAJZA3rtV+v9p8xTKl4U1bUqTIaCnoC7Ctx2kCjQgwFXDasOtPTCT8eCTXvw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.2 - dev: false - optional: true - - /@img/sharp-libvips-darwin-arm64@1.0.2: - resolution: {integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==} - engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@img/sharp-libvips-darwin-x64@1.0.2: - resolution: {integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==} - engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true + os: [freebsd] - /@img/sharp-libvips-linux-arm64@1.0.2: - resolution: {integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==} - engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@img/sharp-libvips-linux-arm@1.0.2: - resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} - engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - requiresBuild: true - dev: false - optional: true - - /@img/sharp-libvips-linux-s390x@1.0.2: - resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} - engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: false - optional: true + libc: [glibc] - /@img/sharp-libvips-linux-x64@1.0.2: - resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} - engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] os: [linux] - requiresBuild: true - dev: false - optional: true + libc: [musl] - /@img/sharp-libvips-linuxmusl-arm64@1.0.2: - resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} - engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: false - optional: true - - /@img/sharp-libvips-linuxmusl-x64@1.0.2: - resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} - engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true + libc: [glibc] - /@img/sharp-linux-arm64@0.33.3: - resolution: {integrity: sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.2 - dev: false - optional: true - - /@img/sharp-linux-arm@0.33.3: - resolution: {integrity: sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==} - engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.2 - dev: false - optional: true - - /@img/sharp-linux-s390x@0.33.3: - resolution: {integrity: sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==} - engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [s390x] - os: [linux] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.2 - dev: false - optional: true + libc: [musl] - /@img/sharp-linux-x64@0.33.3: - resolution: {integrity: sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.2 - dev: false - optional: true - - /@img/sharp-linuxmusl-arm64@0.33.3: - resolution: {integrity: sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 - dev: false - optional: true + libc: [glibc] - /@img/sharp-linuxmusl-x64@0.33.3: - resolution: {integrity: sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 - dev: false - optional: true + libc: [musl] - /@img/sharp-wasm32@0.33.3: - resolution: {integrity: sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [wasm32] - requiresBuild: true - dependencies: - '@emnapi/runtime': 1.1.1 - dev: false - optional: true + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] - /@img/sharp-win32-ia32@0.33.3: - resolution: {integrity: sha512-CyimAduT2whQD8ER4Ux7exKrtfoaUiVr7HG0zZvO0XTFn2idUWljjxv58GxNTkFb8/J9Ub9AqITGkJD6ZginxQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: false - optional: true - /@img/sharp-win32-x64@0.33.3: - resolution: {integrity: sha512-viT4fUIDKnli3IfOephGnolMzhz5VaTvDRkYqtZxOMIoMQ4MrAziO7pT1nVnOt2FAm7qW5aa+CCc13aEY6Le0g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - requiresBuild: true - dev: false - optional: true - - /@inquirer/figures@1.0.1: - resolution: {integrity: sha512-mtup3wVKia3ZwULPHcbs4Mor8Voi+iIXEWD7wCNbIO6lYR62oPCTQyrddi5OMYVXHzeCSoneZwJuS8sBvlEwDw==} - engines: {node: '>=18'} - dev: true - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} - /@j-ulrich/release-it-regex-bumper@5.1.0(release-it@17.2.1): - resolution: {integrity: sha512-nXvpAehdeStBxyUkBDNr/afAjF0BWPPRCfl5N5XYoZmcHCqVyoHklzZrVEH6LTnzm+Xwt9f58BynWsO+Sc/jyA==} - engines: {node: '>=16'} - peerDependencies: - release-it: 16 || 17 - dependencies: - chalk: 5.3.0 - date-fns: 2.30.0 - fast-glob: 3.3.2 - lodash: 4.17.21 - release-it: 17.2.1(typescript@5.4.5) - semver: 7.6.2 - xregexp: 5.1.1 - optionalDependencies: - diff: 5.2.0 - dev: true + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 + '@playwright/test@1.61.1': + resolution: {integrity: sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==} + engines: {node: '>=18'} + hasBin: true - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@sidvind/better-ajv-errors@7.0.0': + resolution: {integrity: sha512-imVsp5D3KxJ8+uUmu2dsLKnFg3qdX952v/L1gZoCa0NO2ivhQWHMpYM2KmpFrRXHWFjlqkNZ/935nxiTqXEi1A==} + engines: {node: ^22.12 || >= 24.0} + peerDependencies: + ajv: ^8.0.0 - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@simple-libs/child-process-utils@1.0.2': + resolution: {integrity: sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==} + engines: {node: '>=18'} - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@simple-libs/stream-utils@1.2.0': + resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} + engines: {node: '>=18'} - /@leichtgewicht/ip-codec@2.0.5: - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - dev: true + '@simple-libs/stream-utils@2.0.0': + resolution: {integrity: sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==} + engines: {node: '>=22'} - /@ljharb/through@2.3.13: - resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - dev: true + '@sindresorhus/base62@1.0.0': + resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} + engines: {node: '>=18'} - /@mrmlnc/readdir-enhanced@2.2.1: - resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==} - engines: {node: '>=4'} - dependencies: - call-me-maybe: 1.0.2 - glob-to-regexp: 0.3.0 - dev: false + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} - /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - dependencies: - eslint-scope: 5.1.1 - dev: true + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - /@nodelib/fs.stat@1.1.3: - resolution: {integrity: sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==} - engines: {node: '>= 6'} - dev: false + '@types/concat-stream@2.0.3': + resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} - /@npmcli/config@8.3.1: - resolution: {integrity: sha512-lEY3TnkVrNUwI0vCDTFlKTbxK9DxZ83JmXXcQI7kp7pyg7zj/a36xSDmcikXvUbtV2PQpmUwmV0HDAB94NcgNA==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - '@npmcli/map-workspaces': 3.0.6 - ci-info: 4.0.0 - ini: 4.1.2 - nopt: 7.2.1 - proc-log: 4.2.0 - read-package-json-fast: 3.0.2 - semver: 7.6.2 - walk-up-path: 3.0.1 - dev: true + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - /@npmcli/map-workspaces@3.0.6: - resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/name-from-folder': 2.0.0 - glob: 10.3.15 - minimatch: 9.0.4 - read-package-json-fast: 3.0.2 - dev: true + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - /@npmcli/name-from-folder@2.0.0: - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - /@octokit/auth-token@4.0.0: - resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} - engines: {node: '>= 18'} - dev: true + '@types/expect@1.20.4': + resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} - /@octokit/core@5.2.0: - resolution: {integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==} - engines: {node: '>= 18'} - dependencies: - '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.1.0 - '@octokit/request': 8.4.0 - '@octokit/request-error': 5.1.0 - '@octokit/types': 13.5.0 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.1 - dev: true - - /@octokit/endpoint@9.0.5: - resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} - engines: {node: '>= 18'} - dependencies: - '@octokit/types': 13.5.0 - universal-user-agent: 6.0.1 - dev: true + '@types/fined@1.1.5': + resolution: {integrity: sha512-2N93vadEGDFhASTIRbizbl4bNqpMOId5zZfj6hHqYZfEzEfO9onnU4Im8xvzo8uudySDveDHBOOSlTWf38ErfQ==} - /@octokit/graphql@7.1.0: - resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} - engines: {node: '>= 18'} - dependencies: - '@octokit/request': 8.4.0 - '@octokit/types': 13.5.0 - universal-user-agent: 6.0.1 - dev: true + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - /@octokit/openapi-types@20.0.0: - resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} - dev: true + '@types/inquirer@9.0.10': + resolution: {integrity: sha512-vFW2WbXwO9eZpRT5GJGFJ/shgyMNnYozmnjakt9jCQSS1lvqX8pZEQMjJ9RdDPct/YxwciQ8+V8OYn9euIrZDA==} - /@octokit/openapi-types@22.2.0: - resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} - dev: true + '@types/is-empty@1.2.3': + resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} - /@octokit/plugin-paginate-rest@9.2.1(@octokit/core@5.2.0): - resolution: {integrity: sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '5' - dependencies: - '@octokit/core': 5.2.0 - '@octokit/types': 12.6.0 - dev: true + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - /@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.0): - resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '5' - dependencies: - '@octokit/core': 5.2.0 - dev: true + '@types/liftoff@4.0.3': + resolution: {integrity: sha512-UgbL2kR5pLrWICvr8+fuSg0u43LY250q7ZMkC+XKC3E+rs/YBDEnQIzsnhU5dYsLlwMi3R75UvCL87pObP1sxw==} - /@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.0): - resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '5' - dependencies: - '@octokit/core': 5.2.0 - '@octokit/types': 12.6.0 - dev: true + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - /@octokit/request-error@5.1.0: - resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} - engines: {node: '>= 18'} - dependencies: - '@octokit/types': 13.5.0 - deprecation: 2.3.1 - once: 1.4.0 - dev: true + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - /@octokit/request@8.4.0: - resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==} - engines: {node: '>= 18'} - dependencies: - '@octokit/endpoint': 9.0.5 - '@octokit/request-error': 5.1.0 - '@octokit/types': 13.5.0 - universal-user-agent: 6.0.1 - dev: true + '@types/node@22.20.0': + resolution: {integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==} - /@octokit/rest@20.1.0: - resolution: {integrity: sha512-STVO3itHQLrp80lvcYB2UIKoeil5Ctsgd2s1AM+du3HqZIR35ZH7WE9HLwUOLXH0myA0y3AGNPo8gZtcgIbw0g==} - engines: {node: '>= 18'} - dependencies: - '@octokit/core': 5.2.0 - '@octokit/plugin-paginate-rest': 9.2.1(@octokit/core@5.2.0) - '@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.0) - '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.0) - dev: true + '@types/node@26.0.1': + resolution: {integrity: sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw==} - /@octokit/types@12.6.0: - resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} - dependencies: - '@octokit/openapi-types': 20.0.0 - dev: true + '@types/picomatch@4.0.3': + resolution: {integrity: sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==} - /@octokit/types@13.5.0: - resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} - dependencies: - '@octokit/openapi-types': 22.2.0 - dev: true + '@types/supports-color@8.1.3': + resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} - /@one-ini/wasm@0.1.1: - resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - dev: false + '@types/text-table@0.2.5': + resolution: {integrity: sha512-hcZhlNvMkQG/k1vcZ6yHOl6WAYftQ2MLfTHcYRZ2xYZFD8tGVnE3qFV0lj1smQeDSR7/yY0PyuUalauf33bJeA==} - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - optional: true + '@types/through@0.0.33': + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} - /@pkgr/core@0.1.1: - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - /@pnpm/config.env-replace@1.1.0: - resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} - engines: {node: '>=12.22.0'} - dev: true + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - /@pnpm/network.ca-file@1.0.2: - resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} - engines: {node: '>=12.22.0'} - dependencies: - graceful-fs: 4.2.10 - dev: true + '@types/vinyl@2.0.12': + resolution: {integrity: sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==} - /@pnpm/npm-conf@2.2.2: - resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} - engines: {node: '>=12'} - dependencies: - '@pnpm/config.env-replace': 1.1.0 - '@pnpm/network.ca-file': 1.0.2 - config-chain: 1.1.13 - dev: true + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: false + '@typescript-eslint/types@8.62.1': + resolution: {integrity: sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /@release-it/conventional-changelog@8.0.1(release-it@17.2.1): - resolution: {integrity: sha512-pwc9jaBYDaSX5TXw6rEnPfqDkKJN2sFBhYpON1kBi9T3sA9EOBncC4ed0Bv3L1ciNb6eqEJXPfp+tQMqVlv/eg==} - engines: {node: '>=18'} - peerDependencies: - release-it: ^17.0.0 - dependencies: - concat-stream: 2.0.0 - conventional-changelog: 5.1.0 - conventional-recommended-bump: 9.0.0 - release-it: 17.2.1(typescript@5.4.5) - semver: 7.6.2 - dev: true - - /@sidvind/better-ajv-errors@2.1.3(ajv@8.13.0): - resolution: {integrity: sha512-lWuod/rh7Xz5uXiEGSfm2Sd5PG7K/6yJfoAZVqzsEswjPJhUz15R7Gn/o8RczA041QS15hBd/BCSeu9vwPArkA==} - engines: {node: '>= 16.14'} + '@visionappscz/stylelint-config@4.0.0': + resolution: {integrity: sha512-dCh1oQxgzpg3ML4zeYqzo8XYPDUx4xXJ7Nx7mF2NU4dDvsuJZXee32U5Z9tUnTxL1kimRpraVIPzHmOI5wN0WQ==} + engines: {node: '>=18.12.0'} peerDependencies: - ajv: 4.11.8 - 8 - dependencies: - '@babel/code-frame': 7.24.2 - ajv: 8.13.0 - chalk: 4.1.2 - - /@sindresorhus/is@0.14.0: - resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} - engines: {node: '>=6'} - dev: true + stylelint: ^16.0.0 - /@sindresorhus/is@0.7.0: - resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==} - engines: {node: '>=4'} - dev: false + a-sync-waterfall@1.0.1: + resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==} - /@sindresorhus/is@5.6.0: - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} - engines: {node: '>=14.16'} - dev: true + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - /@sindresorhus/is@6.3.0: - resolution: {integrity: sha512-bOSPck7aIJjASXIg1qvXSIjXhVBpIEKdl2Wxg4pVqoTRPL8wWExKBrnGIh6CEnhkFQHfc36k7APhO3uXV4g5xg==} - engines: {node: '>=16'} - dev: false + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} - /@sindresorhus/merge-streams@2.3.0: - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - /@snyk/protect@1.1291.0: - resolution: {integrity: sha512-BRbgzSOSlzIBmhdEqM0y0q8uhYd2h+tfl3OuMH62JvQ+AI9lFV5Va99gl+wqS8GBBOohQmIh4HnuD25LMCdO7Q==} - engines: {node: '>=10'} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} hasBin: true - dev: true - /@socket.io/component-emitter@3.1.2: - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - dev: false - - /@szmarczak/http-timer@1.1.2: - resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} - engines: {node: '>=6'} - dependencies: - defer-to-connect: 1.1.3 - dev: true + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - /@szmarczak/http-timer@5.0.1: - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} - dependencies: - defer-to-connect: 2.0.1 - dev: true + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - /@tokenizer/token@0.3.0: - resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - dev: false + ansi-colors@1.1.0: + resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} + engines: {node: '>=0.10.0'} - /@tootallnate/quickjs-emscripten@0.23.0: - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - dev: true + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} - /@trysound/sax@0.2.0: - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - dev: false + ansi-cyan@0.1.1: + resolution: {integrity: sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A==} + engines: {node: '>=0.10.0'} - /@types/concat-stream@2.0.3: - resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} - dependencies: - '@types/node': 20.12.12 - dev: true + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} - /@types/conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} - dependencies: - '@types/node': 20.12.12 - dev: true + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + engines: {node: '>=18'} - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - dev: false + ansi-gray@0.1.1: + resolution: {integrity: sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==} + engines: {node: '>=0.10.0'} - /@types/cors@2.8.17: - resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} - dependencies: - '@types/node': 20.12.12 - dev: false + ansi-red@0.1.1: + resolution: {integrity: sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==} + engines: {node: '>=0.10.0'} - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - dependencies: - '@types/ms': 0.7.34 - dev: true + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} - /@types/eslint@8.56.10: - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} - dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 - dev: true + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} - /@types/estree-jsx@1.0.5: - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - dependencies: - '@types/estree': 1.0.5 - dev: true + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} - /@types/expect@1.20.4: - resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} - dev: false + ansi-wrap@0.1.0: + resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==} + engines: {node: '>=0.10.0'} - /@types/glob@7.2.0: - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 20.12.12 - dev: false + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - /@types/hast@3.0.4: - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - dependencies: - '@types/unist': 3.0.2 - dev: true - - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: true + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - /@types/is-empty@1.2.3: - resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} - dev: true + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 20.12.12 + arr-diff@1.1.0: + resolution: {integrity: sha512-OQwDZUqYaQwyyhDJHThmzId8daf4/RFNLaeh3AevmSeZ5Y7ug4Ga/yKc6l6kTZOBW781rCj103ZuTh8GAsB3+Q==} + engines: {node: '>=0.10.0'} - /@types/mdast@4.0.4: - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - dependencies: - '@types/unist': 3.0.2 - dev: true + arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: false + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true + arr-union@2.1.0: + resolution: {integrity: sha512-t5db90jq+qdgk8aFnxEkjqta0B/GHrM1pxzuuZz2zWsOXc5nKu3t+76s/PQBA8FTcM/ipspIH9jWG4OxCBc2eA==} + engines: {node: '>=0.10.0'} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - dev: true + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} - /@types/node@20.12.12: - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} - dependencies: - undici-types: 5.26.5 + array-each@1.0.1: + resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} + engines: {node: '>=0.10.0'} - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true + array-slice@0.2.3: + resolution: {integrity: sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q==} + engines: {node: '>=0.10.0'} - /@types/parse-json@4.0.2: - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - dev: true + array-slice@1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} - /@types/responselike@1.0.3: - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - dependencies: - '@types/node': 20.12.12 + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - /@types/supports-color@8.1.3: - resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} - dev: true + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} - /@types/text-table@0.2.5: - resolution: {integrity: sha512-hcZhlNvMkQG/k1vcZ6yHOl6WAYftQ2MLfTHcYRZ2xYZFD8tGVnE3qFV0lj1smQeDSR7/yY0PyuUalauf33bJeA==} - dev: true + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - dev: true + async-done@2.0.0: + resolution: {integrity: sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==} + engines: {node: '>= 10.13.0'} - /@types/unist@3.0.2: - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - dev: true + async-each-series@0.1.1: + resolution: {integrity: sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==} + engines: {node: '>=0.8.0'} - /@types/vinyl@2.0.12: - resolution: {integrity: sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==} - dependencies: - '@types/expect': 1.20.4 - '@types/node': 20.12.12 - dev: false + async-settle@2.0.0: + resolution: {integrity: sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==} + engines: {node: '>= 10.13.0'} - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - dev: true + async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + autoprefixer@10.5.2: + resolution: {integrity: sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 - /@typescript-eslint/types@7.9.0: - resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} - engines: {node: ^18.18.0 || >=20.0.0} - dev: true + axe-core@4.12.1: + resolution: {integrity: sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==} + engines: {node: '>=4'} - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} peerDependencies: - typescript: '*' + react-native-b4a: '*' peerDependenciesMeta: - typescript: + react-native-b4a: optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.2 - tsutils: 3.21.0(typescript@5.4.5) - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - eslint: 8.57.0 - eslint-scope: 5.1.1 - semver: 7.6.2 - transitivePeerDependencies: - - supports-color - - typescript - dev: true + bach@2.0.1: + resolution: {integrity: sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==} + engines: {node: '>=10.13.0'} - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - dev: true + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} - /@visionappscz/stylelint-config@3.0.0(postcss@8.4.38)(stylelint@14.16.1): - resolution: {integrity: sha512-swRHIueR03HKONZaz3K18OwM0v1qY6uDfkGNsQ994RqnELK8uMmTLJPpv6AvmVQDj5vbFh5zKpfgEU/hizko2A==} - engines: {node: '>=14', npm: '>=6'} + bare-events@2.9.1: + resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} peerDependencies: - stylelint: ^14.3.0 - dependencies: - stylelint: 14.16.1 - stylelint-config-standard: 24.0.0(stylelint@14.16.1) - stylelint-config-standard-scss: 3.0.0(postcss@8.4.38)(stylelint@14.16.1) - stylelint-order: 5.0.0(stylelint@14.16.1) - transitivePeerDependencies: - - postcss - dev: true + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + baseline-browser-mapping@2.10.40: + resolution: {integrity: sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==} + engines: {node: '>=6.0.0'} hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - dev: true - /a-sync-waterfall@1.0.1: - resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==} - dev: false + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - /abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: false + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + bootstrap@5.3.8: + resolution: {integrity: sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==} peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.3 - dev: true + '@popperjs/core': ^2.11.8 - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} - /add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - dev: true + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} - /agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true + brace-expansion@5.0.7: + resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} + engines: {node: 18 || 20 || >=22} - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true + browser-sync-client@3.0.4: + resolution: {integrity: sha512-+ew5ubXzGRKVjquBL3u6najS40TG7GxCdyBll0qSRc/n+JRV9gb/yDdRL1IAgRHqjnJTdqeBKKIQabjvjRSYRQ==} + engines: {node: '>=8.0.0'} - /ajv@8.13.0: - resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 + browser-sync-ui@3.0.4: + resolution: {integrity: sha512-5Po3YARCZ/8yQHFzvrSjn8+hBUF7ZWac39SHsy8Tls+7tE62iq6pYWxpVU6aOOMAGD21RwFQhQeqmJPf70kHEQ==} - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - dependencies: - string-width: 4.2.3 - dev: true + browser-sync@3.0.4: + resolution: {integrity: sha512-mcYOIy4BW6sWSEnTSBjQwWsnbx2btZX78ajTTjdNfyC/EqQVcIe0nQR6894RNAMtvlfAnLaH9L2ka97zpvgenA==} + engines: {node: '>= 8.0.0'} + hasBin: true - /ansi-colors@1.1.0: - resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-wrap: 0.1.0 - dev: false + browserslist@4.28.4: + resolution: {integrity: sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true - /ansi-colors@3.2.4: - resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} - engines: {node: '>=6'} - dev: false + bs-recipes@1.3.4: + resolution: {integrity: sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==} - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: false + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - /ansi-cyan@0.1.1: - resolution: {integrity: sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-wrap: 0.1.0 - dev: false + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - /ansi-escapes@6.2.1: - resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} - engines: {node: '>=14.16'} - dev: true + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} - /ansi-gray@0.1.1: - resolution: {integrity: sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-wrap: 0.1.0 - dev: false + cacheable@2.5.0: + resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} - /ansi-red@0.1.1: - resolution: {integrity: sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-wrap: 0.1.0 - dev: false + caller-callsite@2.0.0: + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: false + caller-path@2.0.0: + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} + + callsites@2.0.0: + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} - /ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - dev: false - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + caniuse-api@4.0.0: + resolution: {integrity: sha512-B0hQ1OLyJuHTQSOWXvwibWqM6DCoqJdvBA6X1S/53bd4XU7LJ1yurIPlrsouol3mw1jh9pGI4ivubSpmJeIqCA==} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + caniuse-lite@1.0.30001800: + resolution: {integrity: sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==} - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: false + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - /ansi-wrap@0.1.0: - resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==} - engines: {node: '>=0.10.0'} - dev: false + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - /anymatch@2.0.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - dependencies: - micromatch: 3.1.10 - normalize-path: 2.1.1 - transitivePeerDependencies: - - supports-color - dev: false + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - /append-buffer@1.0.2: - resolution: {integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==} - engines: {node: '>=0.10.0'} - dependencies: - buffer-equal: 1.0.1 - dev: false + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: false + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - /archive-type@4.0.0: - resolution: {integrity: sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==} - engines: {node: '>=4'} - dependencies: - file-type: 4.4.0 - dev: false + cheerio@1.2.0: + resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} + engines: {node: '>=20.18.1'} - /archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - dev: false + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} - /are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} - dev: true + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: false + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} - /arr-diff@1.1.0: - resolution: {integrity: sha512-OQwDZUqYaQwyyhDJHThmzId8daf4/RFNLaeh3AevmSeZ5Y7ug4Ga/yKc6l6kTZOBW781rCj103ZuTh8GAsB3+Q==} - engines: {node: '>=0.10.0'} - dependencies: - arr-flatten: 1.1.0 - array-slice: 0.2.3 - dev: false + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} - /arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - dev: false + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} - /arr-filter@1.1.2: - resolution: {integrity: sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==} - engines: {node: '>=0.10.0'} - dependencies: - make-iterator: 1.0.1 - dev: false + cli-truncate@5.2.0: + resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} + engines: {node: '>=20'} - /arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - dev: false + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} - /arr-map@2.0.2: - resolution: {integrity: sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==} - engines: {node: '>=0.10.0'} - dependencies: - make-iterator: 1.0.1 - dev: false + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - /arr-union@2.1.0: - resolution: {integrity: sha512-t5db90jq+qdgk8aFnxEkjqta0B/GHrM1pxzuuZz2zWsOXc5nKu3t+76s/PQBA8FTcM/ipspIH9jWG4OxCBc2eA==} - engines: {node: '>=0.10.0'} - dev: false + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} - /arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - dev: false + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - dev: true + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} - /array-differ@1.0.0: - resolution: {integrity: sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==} - engines: {node: '>=0.10.0'} - dev: false + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} - /array-each@1.0.1: - resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} - engines: {node: '>=0.10.0'} - dev: false + co@3.1.0: + resolution: {integrity: sha512-CQsjCRiNObI8AtTsNIBDRMQ4oMR83CzEswHYahClvul7gKk+lDQiOKv+5qh7LQWf5sh6jkZNispz/QlsZxyNgA==} - /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - /array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - dev: true + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} - /array-initial@1.1.0: - resolution: {integrity: sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==} - engines: {node: '>=0.10.0'} - dependencies: - array-slice: 1.1.0 - is-number: 4.0.0 - dev: false + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /array-last@1.3.0: - resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 4.0.0 - dev: false + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true - /array-slice@0.2.3: - resolution: {integrity: sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q==} - engines: {node: '>=0.10.0'} - dev: false + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - /array-slice@1.1.0: - resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} - engines: {node: '>=0.10.0'} - dev: false + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - /array-sort@1.0.0: - resolution: {integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==} - engines: {node: '>=0.10.0'} - dependencies: - default-compare: 1.0.0 - get-value: 2.0.6 - kind-of: 5.1.0 - dev: false + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} - /array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} - dependencies: - array-uniq: 1.0.3 - dev: false + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} - /array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - dev: false + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - /array-unique@0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} - dev: false + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} - /array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - dev: true + comment-parser@1.4.7: + resolution: {integrity: sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==} + engines: {node: '>= 12.0.0'} - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - dev: true + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - dev: true + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} - /array.prototype.map@1.0.7: - resolution: {integrity: sha512-XpcFfLoBEAhezrrNw1V+yLXkE7M6uR7xJEsxbG6c/V9v043qurwVJB9r9UTnoSioFDoz1i1VOydpWGmJpfVZbg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-array-method-boxes-properly: 1.0.0 - es-object-atoms: 1.0.0 - is-string: 1.0.7 - dev: true + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - dev: true + connect-history-api-fallback@1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true + connect@3.6.6: + resolution: {integrity: sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==} + engines: {node: '>= 0.10.0'} - /arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - dev: false + conventional-changelog-angular@9.2.0: + resolution: {integrity: sha512-2EihZvM1KmbBGwuUow8lNXLe+ECRFsyOcV8X0197/WI7Rvvgfi55Oicfw0wxJTXGGIVXSfj+xBoNj+cxLlIiVw==} + engines: {node: '>=22'} - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: false + conventional-changelog-conventionalcommits@10.2.0: + resolution: {integrity: sha512-UtlM9GqolY7OmlQh5L/UEVoKsTUpTgUVy1PU8JN5gl5Ydaejb7WRklGliG1SKPxxj7hzA173eG3Kt5fYWE2pmg==} + engines: {node: '>=22'} - /assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - dev: false + conventional-commits-parser@7.0.0: + resolution: {integrity: sha512-dZe/p+FgGQLNJFqaCgNdl8j6a7gI8xuaN30Wy5g7nvyK3jqOpNUEUZ3pGJ5D68h89uRh038FtkeOk/bnGmYkmg==} + engines: {node: '>=22'} + hasBin: true - /ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - dependencies: - tslib: 2.6.2 - dev: true + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - dev: true + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + copy-props@4.0.0: + resolution: {integrity: sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw==} + engines: {node: '>= 10.13.0'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /async-done@1.3.2: - resolution: {integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==} + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - process-nextick-args: 2.0.1 - stream-exhaust: 1.0.2 - dev: false - /async-each-series@0.1.1: - resolution: {integrity: sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==} - engines: {node: '>=0.8.0'} - dev: false + cosmiconfig-typescript-loader@6.3.0: + resolution: {integrity: sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==} + engines: {node: '>=v18'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=9' + typescript: '>=5' - /async-each@1.0.6: - resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} - dev: false + cosmiconfig@5.2.1: + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} - /async-retry@1.3.3: - resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - dependencies: - retry: 0.13.1 - dev: true + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true - /async-settle@1.0.0: - resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==} - engines: {node: '>= 0.10'} - dependencies: - async-done: 1.3.2 - dev: false + cross-env@10.1.0: + resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} + engines: {node: '>=20'} + hasBin: true - /async@0.9.2: - resolution: {integrity: sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==} - dev: false + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} - /async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - dependencies: - lodash: 4.17.21 - dev: false + css-functions-list@3.3.3: + resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} + engines: {node: '>=12'} - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - dev: false + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - /atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - dev: false + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - /autoprefixer@10.4.19(postcss@8.4.38): - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} - engines: {node: ^10 || ^12 || >=14} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} hasBin: true + + cssnano-preset-default@8.0.2: + resolution: {integrity: sha512-+jQAqIKCqMmBjZs7741XkilU93ITZ/EW8gjAkMmujdCzfDkfjrDBv2VqkSu29Fzeig/0rZ3S9IAwfPLlmXEUfQ==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001618 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.0.1 - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + postcss: ^8.5.15 - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - dependencies: - possible-typed-array-names: 1.0.0 - dev: true + cssnano-utils@6.0.1: + resolution: {integrity: sha512-zk65GIxA8tCjqVk7nTm1mE+ZKxtnxAvU5JSUaBLXbAr3ZF7IOvz3fbPOnEDvZKhnS7GOIitXTS5BgehLzNoc8Q==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.5): - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + cssnano@8.0.2: + resolution: {integrity: sha512-K+a76gA1v0/CsYgcsE95HGGyIuPKxpQSetwSwz4nHEM8fFXqSkzq2JzEXFL8v5+CCjxzVVVhPcTK3Oo8SaF/xA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true + postcss: ^8.5.15 + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.1 - transitivePeerDependencies: - - supports-color - dev: true + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.5): - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) - transitivePeerDependencies: - - supports-color - dev: true + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - /bach@1.2.0: - resolution: {integrity: sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==} - engines: {node: '>= 0.10'} - dependencies: - arr-filter: 1.1.2 - arr-flatten: 1.1.0 - arr-map: 2.0.2 - array-each: 1.0.1 - array-initial: 1.1.0 - array-last: 1.3.0 - async-done: 1.3.2 - async-settle: 1.0.0 - now-and-later: 2.0.1 - dev: false - - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: true + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - /balanced-match@2.0.0: - resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} - dev: true + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - /bare-events@2.2.2: - resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} - requiresBuild: true - dev: false - optional: true + del@8.0.1: + resolution: {integrity: sha512-gPqh0mKTPvaUZGAuHbrBUYKZWBNAeHG7TU3QH5EhVwPMyKvmfJaNXhcD2jTcXsJRRcffuho4vaYweu80dRrMGA==} + engines: {node: '>=18'} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} - /base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - dev: false + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} - /base@0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} engines: {node: '>=0.10.0'} - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.3.1 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.2 - pascalcase: 0.1.1 - dev: false - /basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} - dev: true + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} - /batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - dev: false + dev-ip@1.0.1: + resolution: {integrity: sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==} + engines: {node: '>= 0.8.0'} + hasBin: true - /beeper@1.1.1: - resolution: {integrity: sha512-3vqtKL1N45I5dV0RdssXZG7X6pCqQrWPNOlBPZPrd+QkE2HEhR57Z04m0KtpbsZH73j+a3F8UD1TQnn+ExTvIA==} - engines: {node: '>=0.10.0'} - dev: false + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - /before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - dev: true + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - /bin-build@3.0.0: - resolution: {integrity: sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==} - engines: {node: '>=4'} - dependencies: - decompress: 4.2.1 - download: 6.2.5 - execa: 0.7.0 - p-map-series: 1.0.0 - tempfile: 2.0.0 - dev: false + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - /bin-check@4.1.0: - resolution: {integrity: sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==} - engines: {node: '>=4'} - dependencies: - execa: 0.7.0 - executable: 4.1.1 - dev: false + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - /bin-version-check@4.0.0: - resolution: {integrity: sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==} - engines: {node: '>=6'} - dependencies: - bin-version: 3.1.0 - semver: 5.7.2 - semver-truncate: 1.1.2 - dev: false + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} - /bin-version@3.1.0: - resolution: {integrity: sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==} - engines: {node: '>=6'} - dependencies: - execa: 1.0.0 - find-versions: 3.2.0 - dev: false + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - /bin-wrapper@4.1.0: - resolution: {integrity: sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==} - engines: {node: '>=6'} - dependencies: - bin-check: 4.1.0 - bin-version-check: 4.0.0 - download: 7.1.0 - import-lazy: 3.1.0 - os-filter-obj: 2.0.0 - pify: 4.0.1 - dev: false + each-props@3.0.0: + resolution: {integrity: sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==} + engines: {node: '>= 10.13.0'} - /binary-extensions@1.13.1: - resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} - engines: {node: '>=0.10.0'} - dev: false + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + easy-extender@2.3.4: + resolution: {integrity: sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==} + engines: {node: '>= 4.0.0'} - /binaryextensions@2.3.0: - resolution: {integrity: sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==} - engines: {node: '>=0.8'} - dev: false + easy-transform-stream@1.0.1: + resolution: {integrity: sha512-ktkaa6XR7COAR3oj02CF3IOgz2m1hCaY3SfzvKT4Svt2MhHw9XCt+ncJNWfe2TGz31iqzNGZ8spdKQflj+Rlog==} + engines: {node: '>=14.16'} - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - requiresBuild: true - dependencies: - file-uri-to-path: 1.0.0 - dev: false - optional: true + eazy-logger@4.1.0: + resolution: {integrity: sha512-+mn7lRm+Zf1UT/YaH8WXtpU6PIV2iOjzP6jgKoiaq/VNrjYKp+OHZGe2znaLgDeFkw8cL9ffuaUm+nNnzcYyGw==} + engines: {node: '>= 0.8.0'} - /bl@1.2.3: - resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} - dependencies: - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - dev: false + editorconfig@1.0.7: + resolution: {integrity: sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==} + engines: {node: '>=14'} + hasBin: true - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: false + electron-to-chromium@1.5.383: + resolution: {integrity: sha512-I2484/KkAvl8lm9VyjH2JnbOIV0d/UCqT7gbzs6l+o6Vmn9wgB66uVcKX+Vk6HrXtY6fbWTOEXuv8waDTuFNCw==} - /bootstrap@5.3.2(@popperjs/core@2.11.8): - resolution: {integrity: sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==} - peerDependencies: - '@popperjs/core': ^2.11.8 - dependencies: - '@popperjs/core': 2.11.8 - dev: false + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - /boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} - dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.3.0 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - dev: true + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} - /braces@2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} - 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.4 - snapdragon: 0.8.2 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: false + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} - /browser-sync-client@3.0.2: - resolution: {integrity: sha512-tBWdfn9L0wd2Pjuz/NWHtNEKthVb1Y67vg8/qyGNtCqetNz5lkDkFnrsx5UhPNPYUO8vci50IWC/BhYaQskDiQ==} - engines: {node: '>=8.0.0'} - dependencies: - etag: 1.8.1 - fresh: 0.5.2 - mitt: 1.2.0 - dev: false + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - /browser-sync-ui@3.0.2: - resolution: {integrity: sha512-V3FwWAI+abVbFLTyJjXJlCMBwjc3GXf/BPGfwO2fMFACWbIGW9/4SrBOFYEOOtqzCjQE0Di+U3VIb7eES4omNA==} - dependencies: - async-each-series: 0.1.1 - chalk: 4.1.2 - connect-history-api-fallback: 1.6.0 - immutable: 3.8.2 - server-destroy: 1.0.1 - socket.io-client: 4.7.5 - stream-throttle: 0.1.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false + engine.io-client@6.6.6: + resolution: {integrity: sha512-iY6QdftLQ9pyiPoX082bpf/u1UewnOaJrtJIF9T0++QB34lZrj0uP+Q/bj8AlUsAxqhnkTV2BS8SBZSxOmoV5Q==} - /browser-sync@3.0.2: - resolution: {integrity: sha512-PC9c7aWJFVR4IFySrJxOqLwB9ENn3/TaXCXtAa0SzLwocLN3qMjN+IatbjvtCX92BjNXsY6YWg9Eb7F3Wy255g==} - engines: {node: '>= 8.0.0'} - hasBin: true - dependencies: - browser-sync-client: 3.0.2 - browser-sync-ui: 3.0.2 - bs-recipes: 1.3.4 - chalk: 4.1.2 - chokidar: 3.6.0 - connect: 3.6.6 - connect-history-api-fallback: 1.6.0 - dev-ip: 1.0.1 - easy-extender: 2.3.4 - eazy-logger: 4.0.1 - etag: 1.8.1 - fresh: 0.5.2 - fs-extra: 3.0.1 - http-proxy: 1.18.1 - immutable: 3.8.2 - micromatch: 4.0.5 - opn: 5.3.0 - portscanner: 2.2.0 - raw-body: 2.5.2 - resp-modifier: 6.0.2 - rx: 4.1.0 - send: 0.16.2 - serve-index: 1.9.1 - serve-static: 1.13.2 - server-destroy: 1.0.1 - socket.io: 4.7.5 - ua-parser-js: 1.0.37 - yargs: 17.7.2 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - dev: false + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001618 - electron-to-chromium: 1.4.769 - node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.0) + engine.io@6.6.9: + resolution: {integrity: sha512-clKkw4C7nJ22mGgoVcCg6V/W/TxdNyIOTr89k2ONZu81qqkddPFDF0LXcbAwhzPD8DjkiRCjzuiO6Y+fkpD4vg==} + engines: {node: '>=10.2.0'} - /bs-recipes@1.3.4: - resolution: {integrity: sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==} - dev: false + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} - /buffer-alloc-unsafe@1.1.0: - resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - dev: false + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} - /buffer-alloc@1.2.0: - resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} - dependencies: - buffer-alloc-unsafe: 1.1.0 - buffer-fill: 1.0.0 - dev: false + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: false + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} - /buffer-equal@1.0.1: - resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} - engines: {node: '>=0.4'} - dev: false + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} - /buffer-fill@1.0.0: - resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} - dev: false + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: true + es-toolkit@1.49.0: + resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} - /bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} - dependencies: - run-applescript: 7.0.0 - dev: true + hasBin: true - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: false + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} - /cache-base@1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} - dependencies: - collection-visit: 1.0.0 - component-emitter: 1.3.1 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.1 - to-object-path: 0.3.0 - union-value: 1.0.1 - unset-value: 1.0.0 - dev: false - - /cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} - engines: {node: '>=14.16'} - dev: true + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - /cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} - engines: {node: '>=14.16'} - dependencies: - '@types/http-cache-semantics': 4.0.4 - get-stream: 6.0.1 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - mimic-response: 4.0.0 - normalize-url: 8.0.1 - responselike: 3.0.0 - dev: true - - /cacheable-request@2.1.4: - resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==} - dependencies: - clone-response: 1.0.2 - get-stream: 3.0.0 - http-cache-semantics: 3.8.1 - keyv: 3.0.0 - lowercase-keys: 1.0.0 - normalize-url: 2.0.1 - responselike: 1.0.2 - dev: false - - /cacheable-request@6.1.0: - resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 3.1.0 - lowercase-keys: 2.0.0 - normalize-url: 4.5.1 - responselike: 1.0.2 - dev: true - - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - /call-me-maybe@1.0.2: - resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} - dev: false + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} - /caller-callsite@2.0.0: - resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} - engines: {node: '>=4'} - dependencies: - callsites: 2.0.0 - dev: false + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} - /caller-path@2.0.0: - resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} - engines: {node: '>=4'} - dependencies: - caller-callsite: 2.0.0 - dev: false + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' - /callsites@2.0.0: - resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} - engines: {node: '>=4'} - dev: false + eslint-plugin-jsdoc@63.0.10: + resolution: {integrity: sha512-A9UIWsCquaKnit7rasXxYf12hhGIdDRjv65/RUE3AxbT6rdKBvr3MjH37g3gP+g4ipQMXuMn9slFKjO+vqNfkg==} + engines: {node: ^22.13.0 || >=24} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + eslint-plugin-regexp@3.1.1: + resolution: {integrity: sha512-MxR5nqoQCtVWmJwia0D2+NlXX1xzdpkslsVOZLEYQ4PQWEaL65PCZXURxaBc3lPnkNFpNxzMIRmYVxdl8giXRA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: '>=9.38.0' - /callsites@4.1.0: - resolution: {integrity: sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==} - engines: {node: '>=12.20'} - dev: false + eslint-plugin-unused-imports@4.4.1: + resolution: {integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^10.0.0 || ^9.0.0 || ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true - /camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - dev: false + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} - dev: false + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true + eslint@10.6.0: + resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: true + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - /caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001618 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 - dev: false + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true - /caniuse-lite@1.0.30001618: - resolution: {integrity: sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} - /caw@2.0.1: - resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==} - engines: {node: '>=4'} - dependencies: - get-proxy: 2.1.0 - isurl: 1.0.0 - tunnel-agent: 0.6.0 - url-to-options: 1.0.1 - dev: false + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: true + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: false - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - /change-file-extension@0.1.1: - resolution: {integrity: sha512-lB0j9teu8JtDPDHRfU8pNH33w4wMu5bOaKoT4PxH+AKugBrIfpiJMTTKIm0TErNeJPkeQEgvH31YpccTwOKPRg==} - engines: {node: '>=18'} - dev: false + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: true + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: true + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: true + extend-shallow@1.1.4: + resolution: {integrity: sha512-L7AGmkO6jhDkEBBGWlLtftA80Xq8DipnrRPr0pyi7GQLXkaq9JYA4xF4z6qnadIC6euiTDKco0cGSU9muw+WTw==} + engines: {node: '>=0.10.0'} - /character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - dev: true + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} - /check-links@1.1.8: - resolution: {integrity: sha512-lxt1EeQ1CVkmiZzPfbPufperYK0t7MvhdLs3zlRH9areA6NVT1tcGymAdJONolNWQBdCFU/sek59RpeLmVHCnw==} - engines: {node: '>=8'} - dependencies: - got: 9.6.0 - is-relative-url: 2.0.0 - p-map: 2.1.0 - p-memoize: 2.1.0 - dev: true + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - /cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - dependencies: - boolbase: 1.0.0 - css-select: 5.1.0 - css-what: 6.1.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - dev: false + fancy-log@1.3.3: + resolution: {integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==} + engines: {node: '>= 0.10'} - /cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} - dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.1.0 - htmlparser2: 8.0.2 - parse5: 7.1.2 - parse5-htmlparser2-tree-adapter: 7.0.0 - dev: false - - /chokidar@2.1.8: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies - dependencies: - anymatch: 2.0.0 - async-each: 1.0.6 - braces: 2.3.2 - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 4.0.3 - normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1 - upath: 1.2.0 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - dev: false + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} - /ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} - dev: true + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - /class-utils@0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 - dev: false + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - /clean-css@4.2.4: - resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} - engines: {node: '>= 4.0'} - dependencies: - source-map: 0.6.1 - dev: false + fast-levenshtein@3.0.0: + resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true + fast-uri@3.1.3: + resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: true + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: true + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - restore-cursor: 4.0.0 - dev: true + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: true + favicons@7.3.0: + resolution: {integrity: sha512-4v42LShwdrw059EpUOhUiehMD3mEfzqo1w92GvN5FSJlursP5H0NhUskTvxxbSWiYUctOg3qpLL/onQ+JwBVYg==} + engines: {node: '>=20.0.0'} - /cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} - dependencies: - slice-ansi: 5.0.0 - string-width: 7.1.0 - dev: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true - /cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - dev: true + file-entry-cache@11.1.5: + resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} - /cliui@3.2.0: - resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - wrap-ansi: 2.1.0 - dev: false + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} - /clone-buffer@1.0.0: - resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} - engines: {node: '>= 0.10'} - dev: false + finalhandler@1.1.0: + resolution: {integrity: sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==} + engines: {node: '>= 0.8'} - /clone-response@1.0.2: - resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} - dependencies: - mimic-response: 1.0.1 - dev: false + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - dependencies: - mimic-response: 1.0.1 - dev: true + findup-sync@5.0.0: + resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} + engines: {node: '>= 10.13.0'} - /clone-stats@0.0.1: - resolution: {integrity: sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==} - dev: false + fined@2.0.0: + resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==} + engines: {node: '>= 10.13.0'} - /clone-stats@1.0.0: - resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} - dev: false + first-chunk-stream@5.0.0: + resolution: {integrity: sha512-WdHo4ejd2cG2Dl+sLkW79SctU7mUQDfr4s1i26ffOZRs5mgv+BRttIM9gwcq0rDbemo0KlpVPaa3LBVLqPXzcQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /clone@0.2.0: - resolution: {integrity: sha512-g62n3Kb9cszeZvmvBUqP/dsEJD/+80pDA8u8KqHnAPrVnQ2Je9rVV6opxkhuWCd1kCn2gOibzDKxCtBvD3q5kA==} - dev: false + flagged-respawn@2.0.0: + resolution: {integrity: sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==} + engines: {node: '>= 10.13.0'} - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} - /clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - dev: false + flat-cache@6.1.23: + resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} - /cloneable-readable@1.1.3: - resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} - dependencies: - inherits: 2.0.4 - process-nextick-args: 2.0.1 - readable-stream: 2.3.8 - dev: false + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - /co@3.1.0: - resolution: {integrity: sha512-CQsjCRiNObI8AtTsNIBDRMQ4oMR83CzEswHYahClvul7gKk+lDQiOKv+5qh7LQWf5sh6jkZNispz/QlsZxyNgA==} - dev: true + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true - /code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} - dev: false - - /collapse-white-space@2.1.0: - resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - dev: true - /collection-map@1.0.0: - resolution: {integrity: sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==} + for-own@1.0.0: + resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} engines: {node: '>=0.10.0'} - dependencies: - arr-map: 2.0.2 - for-own: 1.0.0 - make-iterator: 1.0.1 - dev: false - /collection-visit@1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - dev: false + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + fs-extra@3.0.1: + resolution: {integrity: sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==} - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: false + fs-mkdirp-stream@2.0.1: + resolution: {integrity: sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==} + engines: {node: '>=10.13.0'} - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: false + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] - /color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - dev: false - - /colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: true + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - dev: false + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: true + get-value@3.0.1: + resolution: {integrity: sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==} + engines: {node: '>=6.0'} - /commander@12.0.0: - resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} + git-raw-commits@5.0.1: + resolution: {integrity: sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==} engines: {node: '>=18'} - dev: false + deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. + hasBin: true - /commander@2.17.1: - resolution: {integrity: sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==} - dev: false + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - /commander@2.19.0: - resolution: {integrity: sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==} - dev: false + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: false + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} - /commander@5.1.0: - resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} - engines: {node: '>= 6'} - dev: false + glob-stream@8.0.3: + resolution: {integrity: sha512-fqZVj22LtFJkHODT+M4N1RJQ3TjnnQhfE9GwZI8qXscYarnhpip70poMldRnP8ipQ/w0B621kOhfc53/J9bd/A==} + engines: {node: '>=10.13.0'} - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: false + glob-watcher@6.0.0: + resolution: {integrity: sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw==} + engines: {node: '>= 10.13.0'} - /comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - dev: true + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - dev: true + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true - /component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - dev: false + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + global-directory@5.0.0: + resolution: {integrity: sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==} + engines: {node: '>=20'} - /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - dev: false + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} - /concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.2 - typedarray: 0.0.6 - dev: true + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} - /concat-with-sourcemaps@1.1.0: - resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} - dependencies: - source-map: 0.6.1 - dev: false + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} - /config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} - /configstore@6.0.0: - resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} - engines: {node: '>=12'} - dependencies: - dot-prop: 6.0.1 - graceful-fs: 4.2.11 - unique-string: 3.0.0 - write-file-atomic: 3.0.3 - xdg-basedir: 5.1.0 - dev: true + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} + engines: {node: '>=18'} - /confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - dev: true + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} - /connect-history-api-fallback@1.6.0: - resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} - engines: {node: '>=0.8'} - dev: false + globby@16.2.0: + resolution: {integrity: sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==} + engines: {node: '>=20'} - /connect@3.6.6: - resolution: {integrity: sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==} - engines: {node: '>= 0.10.0'} - dependencies: - debug: 2.6.9 - finalhandler: 1.1.0 - parseurl: 1.3.3 - utils-merge: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: false + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - dependencies: - safe-buffer: 5.2.1 - dev: false + glogg@2.2.0: + resolution: {integrity: sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A==} + engines: {node: '>= 10.13.0'} - /conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} - dependencies: - compare-func: 2.0.0 - dev: true + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /conventional-changelog-atom@4.0.0: - resolution: {integrity: sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw==} - engines: {node: '>=16'} - dev: true + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} - /conventional-changelog-codemirror@4.0.0: - resolution: {integrity: sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q==} - engines: {node: '>=16'} - dev: true + group-array@1.0.0: + resolution: {integrity: sha512-PJresALe5TUzSIcdWKLdAKcdUDxv8du2EGueShgAL2xknbcTo5Bk1xbNaNhxpWxxAx/SV7N+5S0UyK7XV0+QhA==} + engines: {node: '>=8'} - /conventional-changelog-conventionalcommits@7.0.2: - resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} - engines: {node: '>=16'} - dependencies: - compare-func: 2.0.0 - dev: true + gulp-cli@3.1.0: + resolution: {integrity: sha512-zZzwlmEsTfXcxRKiCHsdyjZZnFvXWM4v1NqBJSYbuApkvVKivjcmOS2qruAJ+PkEHLFavcDKH40DPc1+t12a9Q==} + engines: {node: '>=10.13.0'} + hasBin: true - /conventional-changelog-core@7.0.0: - resolution: {integrity: sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg==} - engines: {node: '>=16'} - dependencies: - '@hutson/parse-repository-url': 5.0.0 - add-stream: 1.0.0 - conventional-changelog-writer: 7.0.1 - conventional-commits-parser: 5.0.0 - git-raw-commits: 4.0.0 - git-semver-tags: 7.0.1 - hosted-git-info: 7.0.2 - normalize-package-data: 6.0.1 - read-pkg: 8.1.0 - read-pkg-up: 10.1.0 - dev: true + gulp-data@1.3.1: + resolution: {integrity: sha512-fvpQJvgVyhkwRcFP3Y9QUS9sWvIFsAlJDinQjhLuknmHZz52jH0gHmTujYBFjr9aTlTHlrAayY5m1d0tA1HzGQ==} + engines: {node: '>=0.9.0', npm: '>=1.2.10'} - /conventional-changelog-ember@4.0.0: - resolution: {integrity: sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA==} - engines: {node: '>=16'} - dev: true + gulp-esbuild@0.15.0: + resolution: {integrity: sha512-W2vM1hED6SvfhouhE3nVoJP1yWqqUCINGif/kSY2d0OSyEu6dHIKXrWaZYk5ou1cdUGmIvAjt5iP4ZXcOUXrfg==} + engines: {node: '>=22'} + peerDependencies: + esbuild: '>=0.17' + gulp: '>=4' - /conventional-changelog-eslint@5.0.0: - resolution: {integrity: sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA==} - engines: {node: '>=16'} - dev: true + gulp-inject@5.0.5: + resolution: {integrity: sha512-5bGMjqleXUHPu4CI1pnVzHtwyMy+Zt8EMo1RFwNsOpidPxwjFwyLgmsRZWGMMI8UenJMJRjURqwznfFmqb5wgw==} + engines: {node: '>=8'} - /conventional-changelog-express@4.0.0: - resolution: {integrity: sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw==} - engines: {node: '>=16'} - dev: true + gulp-jsbeautifier@3.0.1: + resolution: {integrity: sha512-zSXsXQy0/s6qjhhtTun+/ZfC/q8cz/fZpZmxoGPKpmxjuP7/F+oGpV/LHqtOAaWNo+WjcxLVey0cFoNrPZiHWg==} + engines: {node: '>=4'} - /conventional-changelog-jquery@5.0.0: - resolution: {integrity: sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw==} - engines: {node: '>=16'} - dev: true + gulp-nunjucks-render@2.2.3: + resolution: {integrity: sha512-YHrmwiwPw2DN16WJVj8S2tgUanB1ssZE8e5rRF6rH1T41mhO7r59iAqw92Yz5WSZXYB9G+uYXDTCODgixYPIRw==} + engines: {node: '>=0.10.0'} - /conventional-changelog-jshint@4.0.0: - resolution: {integrity: sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg==} - engines: {node: '>=16'} - dependencies: - compare-func: 2.0.0 - dev: true + gulp-plugin-extras@1.1.0: + resolution: {integrity: sha512-T0AXOEVoKYzLIBlwEZ7LtAx2w4ExIozIoxVeYEVLFbdxI7i0sWvFDq0F8mm47djixDF3vAqDPoyGwh3Sg/PWtQ==} + engines: {node: '>=18'} - /conventional-changelog-preset-loader@4.1.0: - resolution: {integrity: sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==} - engines: {node: '>=16'} - dev: true + gulp-purgecss@8.0.0: + resolution: {integrity: sha512-wR40dGqrbtSHQXa2aIqSt6iigUtIuqobIDvKOwkZ0FL95ZjoKuScPzSLSQp+McdwION0hQckwl7lHE5CmNXrLg==} - /conventional-changelog-writer@7.0.1: - resolution: {integrity: sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==} - engines: {node: '>=16'} - hasBin: true - dependencies: - conventional-commits-filter: 4.0.0 - handlebars: 4.7.8 - json-stringify-safe: 5.0.1 - meow: 12.1.1 - semver: 7.6.2 - split2: 4.2.0 - dev: true + gulp-rev-rewrite@6.0.0: + resolution: {integrity: sha512-SKefSq5FVw7VAzPr8ZBvVMH7s1M7GXHyNhPlP/3k1IkD7lObLbVK8/WCY632+zfHJkc6kMsPlz4TP9lEA++4wg==} + engines: {node: '>=18'} - /conventional-changelog@5.1.0: - resolution: {integrity: sha512-aWyE/P39wGYRPllcCEZDxTVEmhyLzTc9XA6z6rVfkuCD2UBnhV/sgSOKbQrEG5z9mEZJjnopjgQooTKxEg8mAg==} - engines: {node: '>=16'} - dependencies: - conventional-changelog-angular: 7.0.0 - conventional-changelog-atom: 4.0.0 - conventional-changelog-codemirror: 4.0.0 - conventional-changelog-conventionalcommits: 7.0.2 - conventional-changelog-core: 7.0.0 - conventional-changelog-ember: 4.0.0 - conventional-changelog-eslint: 5.0.0 - conventional-changelog-express: 4.0.0 - conventional-changelog-jquery: 5.0.0 - conventional-changelog-jshint: 4.0.0 - conventional-changelog-preset-loader: 4.1.0 - dev: true - - /conventional-commits-filter@4.0.0: - resolution: {integrity: sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==} - engines: {node: '>=16'} - dev: true + gulp-rev@12.0.0: + resolution: {integrity: sha512-MU3IASTTx+XZQrmz5WdhoflA2AIir815b/ItpRBFWkIP8kWSInU1IFRSvdX36AvIDRxR9izFqod/PXdjSw7tXw==} + engines: {node: '>=20'} + peerDependencies: + gulp: '>=4' + peerDependenciesMeta: + gulp: + optional: true - /conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 2.0.0 - meow: 12.1.1 - split2: 4.2.0 - dev: true + gulp-sri-hash@2.2.1: + resolution: {integrity: sha512-nPcrs3lUBKZeC6E2Fi0Qz8WzP4hUlX3qraTfpCcKNJ49QpchBMu73xFRYtXqXBvhJPwDcIswAQQuVi6NhKh5JQ==} + engines: {node: '>= 8.x', npm: '>= 6.x'} - /conventional-recommended-bump@9.0.0: - resolution: {integrity: sha512-HR1yD0G5HgYAu6K0wJjLd7QGRK8MQDqqj6Tn1n/ja1dFwBCE6QmV+iSgQ5F7hkx7OUR/8bHpxJqYtXj2f/opPQ==} - engines: {node: '>=16'} + gulp@5.0.1: + resolution: {integrity: sha512-PErok3DZSA5WGMd6XXV3IRNO0mlB+wW3OzhFJLEec1jSERg2j1bxJ6e5Fh6N6fn3FH2T9AP4UYNb/pYlADB9sA==} + engines: {node: '>=10.13.0'} hasBin: true - dependencies: - conventional-changelog-preset-loader: 4.1.0 - conventional-commits-filter: 4.0.0 - conventional-commits-parser: 5.0.0 - git-raw-commits: 4.0.0 - git-semver-tags: 7.0.1 - meow: 12.1.1 - dev: true - - /convert-hrtime@5.0.0: - resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} - engines: {node: '>=12'} - dev: false - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false + gulplog@2.2.0: + resolution: {integrity: sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A==} + engines: {node: '>= 10.13.0'} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} + engines: {node: '>=0.4.7'} + hasBin: true - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - dev: false + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - /copy-descriptor@0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} - dev: false + has-flag@5.0.1: + resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} + engines: {node: '>=12'} - /copy-props@2.0.5: - resolution: {integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==} - dependencies: - each-props: 1.3.2 - is-plain-object: 5.0.0 - dev: false + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} + engines: {node: '>=20'} - /core-js-compat@3.37.1: - resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} - dependencies: - browserslist: 4.23.0 - dev: true + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} - /core-js-pure@3.37.1: - resolution: {integrity: sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==} - requiresBuild: true - dev: true + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} - /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - dev: false + hookified@2.2.0: + resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.12.12)(cosmiconfig@9.0.0)(typescript@5.4.5): - resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} - engines: {node: '>=v16'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=8.2' - typescript: '>=4' - dependencies: - '@types/node': 20.12.12 - cosmiconfig: 9.0.0(typescript@5.4.5) - jiti: 1.21.0 - typescript: 5.4.5 - dev: true + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} - /cosmiconfig@5.2.1: - resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} - engines: {node: '>=4'} - dependencies: - import-fresh: 2.0.0 - is-directory: 0.3.1 - js-yaml: 3.14.1 - parse-json: 4.0.0 - dev: false + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - dev: true + html-tags@5.1.0: + resolution: {integrity: sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==} + engines: {node: '>=20.10'} - /cosmiconfig@9.0.0(typescript@5.4.5): - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} + html-validate@11.5.5: + resolution: {integrity: sha512-ky5ZNzAmzv/rV9NjObeP+sPcxePKHmc5nTB62/0YR9s/LobeyDRd/CqwmArpNpZpb9vGCCyEgVMgS1PIyujHIw==} + engines: {node: ^22.22.0 || >= 24.8.0} + hasBin: true peerDependencies: - typescript: '>=4.9.5' + '@jest/globals': ^29.0.3 || ^30.0.0 + '@vitest/expect': ^3.0.0 || ^4.0.1 + jest: ^29.0.3 || ^30.0.0 + jest-snapshot: ^29.0.3 || ^30.0.0 + vitest: ^3.0.0 || ^4.0.1 peerDependenciesMeta: - typescript: + '@jest/globals': + optional: true + '@vitest/expect': + optional: true + jest: + optional: true + jest-snapshot: + optional: true + vitest: optional: true - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - typescript: 5.4.5 - dev: true - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: false + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} - /cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - requiresBuild: true - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - dev: false + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} - /crypto-random-string@4.0.0: - resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} - engines: {node: '>=12'} - dependencies: - type-fest: 1.4.0 - dev: true + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} - /css-declaration-sorter@7.2.0(postcss@8.4.38): - resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.0.9 - dependencies: - postcss: 8.4.38 - dev: false + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} - /css-functions-list@3.2.2: - resolution: {integrity: sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==} - engines: {node: '>=12 || >=16'} - dev: true + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} - /css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - requiresBuild: true - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 - dev: false - optional: true + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.1.0 - nth-check: 2.1.1 - dev: false + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} - requiresBuild: true - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - dev: false - optional: true + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} - /css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - dependencies: - mdn-data: 2.0.28 - source-map-js: 1.2.0 - dev: false + ignore@6.0.2: + resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} + engines: {node: '>= 4'} - /css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.0 + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: false + immutable@3.8.3: + resolution: {integrity: sha512-AUY/VyX0E5XlibOmWt10uabJzam1zlYjwiEgQSDc5+UIkFNaF9WM0JxXKaNMGf+F/ffUF+7kRKXM9A7C0xXqMg==} + engines: {node: '>=0.10.0'} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + immutable@5.1.9: + resolution: {integrity: sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==} + + import-fresh@2.0.0: + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} engines: {node: '>=4'} - hasBin: true - /cssnano-preset-default@7.0.1(postcss@8.4.38): - resolution: {integrity: sha512-Fumyr+uZMcjYQeuHssAZxn0cKj3cdQc5GcxkBcmEzISGB+UW9CLNlU4tBOJbJGcPukFDlicG32eFbrc8K9V5pw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - dependencies: - browserslist: 4.23.0 - css-declaration-sorter: 7.2.0(postcss@8.4.38) - cssnano-utils: 5.0.0(postcss@8.4.38) - postcss: 8.4.38 - postcss-calc: 10.0.0(postcss@8.4.38) - postcss-colormin: 7.0.0(postcss@8.4.38) - postcss-convert-values: 7.0.0(postcss@8.4.38) - postcss-discard-comments: 7.0.0(postcss@8.4.38) - postcss-discard-duplicates: 7.0.0(postcss@8.4.38) - postcss-discard-empty: 7.0.0(postcss@8.4.38) - postcss-discard-overridden: 7.0.0(postcss@8.4.38) - postcss-merge-longhand: 7.0.0(postcss@8.4.38) - postcss-merge-rules: 7.0.0(postcss@8.4.38) - postcss-minify-font-values: 7.0.0(postcss@8.4.38) - postcss-minify-gradients: 7.0.0(postcss@8.4.38) - postcss-minify-params: 7.0.0(postcss@8.4.38) - postcss-minify-selectors: 7.0.0(postcss@8.4.38) - postcss-normalize-charset: 7.0.0(postcss@8.4.38) - postcss-normalize-display-values: 7.0.0(postcss@8.4.38) - postcss-normalize-positions: 7.0.0(postcss@8.4.38) - postcss-normalize-repeat-style: 7.0.0(postcss@8.4.38) - postcss-normalize-string: 7.0.0(postcss@8.4.38) - postcss-normalize-timing-functions: 7.0.0(postcss@8.4.38) - postcss-normalize-unicode: 7.0.0(postcss@8.4.38) - postcss-normalize-url: 7.0.0(postcss@8.4.38) - postcss-normalize-whitespace: 7.0.0(postcss@8.4.38) - postcss-ordered-values: 7.0.0(postcss@8.4.38) - postcss-reduce-initial: 7.0.0(postcss@8.4.38) - postcss-reduce-transforms: 7.0.0(postcss@8.4.38) - postcss-svgo: 7.0.0(postcss@8.4.38) - postcss-unique-selectors: 7.0.0(postcss@8.4.38) - dev: false - - /cssnano-utils@5.0.0(postcss@8.4.38): - resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - dependencies: - postcss: 8.4.38 - dev: false + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} - /cssnano@7.0.1(postcss@8.4.38): - resolution: {integrity: sha512-917Mej/4SdI7b55atsli3sU4MOJ9XDoKgnlCtQtXYj8XUFcM3riTuYHyqBBnnskawW+zWwp0KxJzpEUodlpqUg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - dependencies: - cssnano-preset-default: 7.0.1(postcss@8.4.38) - lilconfig: 3.1.1 - postcss: 8.4.38 - dev: false + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - /csso@4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} - requiresBuild: true - dependencies: - css-tree: 1.1.3 - dev: false - optional: true + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} - /csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - dependencies: - css-tree: 2.2.1 - dev: false + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /cyclist@1.0.2: - resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} - dev: false + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - /d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} - dependencies: - es5-ext: 0.10.64 - type: 2.7.2 - dev: false + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - /dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - dev: true + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: true + inquirer@9.3.8: + resolution: {integrity: sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==} + engines: {node: '>=18'} - /data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} - dev: true - - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: true - - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: true + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: true + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dependencies: - '@babel/runtime': 7.24.5 - dev: true + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - /dateformat@2.2.0: - resolution: {integrity: sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==} - dev: false + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: false + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + is-directory@0.3.1: + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - dependencies: - character-entities: 2.0.2 - dev: true - - /decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - dev: false - - /decompress-response@3.3.0: - resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} - engines: {node: '>=4'} - dependencies: - mimic-response: 1.0.1 - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: true - - /decompress-tar@4.1.1: - resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} - engines: {node: '>=4'} - dependencies: - file-type: 5.2.0 - is-stream: 1.1.0 - tar-stream: 1.6.2 - dev: false - - /decompress-tarbz2@4.1.1: - resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} - engines: {node: '>=4'} - dependencies: - decompress-tar: 4.1.1 - file-type: 6.2.0 - is-stream: 1.1.0 - seek-bzip: 1.0.6 - unbzip2-stream: 1.4.3 - dev: false + is-empty@1.2.0: + resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} - /decompress-targz@4.1.1: - resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} - engines: {node: '>=4'} - dependencies: - decompress-tar: 4.1.1 - file-type: 5.2.0 - is-stream: 1.1.0 - dev: false + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} - /decompress-unzip@4.0.1: - resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} - engines: {node: '>=4'} - dependencies: - file-type: 3.9.0 - get-stream: 2.3.1 - pify: 2.3.0 - yauzl: 2.10.0 - dev: false + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} - /decompress@4.2.1: - resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} - engines: {node: '>=4'} - dependencies: - decompress-tar: 4.1.1 - decompress-tarbz2: 4.1.1 - decompress-targz: 4.1.1 - decompress-unzip: 4.0.1 - graceful-fs: 4.2.11 - make-dir: 1.3.0 - pify: 2.3.0 - strip-dirs: 2.1.0 - dev: false + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - /default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} - engines: {node: '>=18'} - dev: true + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - /default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} - engines: {node: '>=18'} - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.0 - dev: true + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} - /default-compare@1.0.0: - resolution: {integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==} + is-negated-glob@1.0.0: + resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} engines: {node: '>=0.10.0'} - dependencies: - kind-of: 5.1.0 - dev: false - - /default-resolution@2.0.0: - resolution: {integrity: sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==} - engines: {node: '>= 0.10'} - dev: false - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 + is-number-like@1.0.8: + resolution: {integrity: sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==} - /defer-to-connect@1.1.3: - resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} - dev: true + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: true + is-path-cwd@3.0.0: + resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - dev: true - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} - /define-property@0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 0.1.7 - dev: false - /define-property@1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 1.0.3 - dev: false - /define-property@2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 1.0.3 - isobject: 3.0.1 - dev: false - /degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - dev: true + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: false + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: false + is-valid-glob@1.0.0: + resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==} + engines: {node: '>=0.10.0'} - /deprecated@0.0.1: - resolution: {integrity: sha512-BRACtc6B1mJe2J2mruHFqHWrtLy0Qppu/7LKdqWH3o/9j1L/1phPUaQV+2S3H8ZDW0k6h+NEOKcHBDRikWLiOA==} - engines: {node: '>= 0.9'} - dev: false + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} - /deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - dev: true + is-wsl@1.1.0: + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + engines: {node: '>=4'} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - /destroy@1.0.4: - resolution: {integrity: sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==} - dev: false + isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} + engines: {node: '>= 18.0.0'} - /detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - dev: false - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: false + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - /detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - dev: false + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} - /dev-ip@1.0.1: - resolution: {integrity: sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==} - engines: {node: '>= 0.8.0'} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true - dev: false - /devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dependencies: - dequal: 2.0.3 - dev: true + js-beautify@1.15.4: + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} + engines: {node: '>=14'} + hasBin: true - /diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - requiresBuild: true - dev: true - optional: true + js-cookie@3.0.8: + resolution: {integrity: sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==} - /dir-glob@2.2.2: - resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} - engines: {node: '>=4'} - dependencies: - path-type: 3.0.0 - dev: false + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true + js-yaml@3.15.0: + resolution: {integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==} + hasBin: true - /dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} - dependencies: - '@leichtgewicht/ip-codec': 2.0.5 - dev: true + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + hasBin: true - /dns-socket@4.2.2: - resolution: {integrity: sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg==} + jsdoc-type-pratt-parser@7.2.0: + resolution: {integrity: sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==} + engines: {node: '>=20.0.0'} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} - dependencies: - dns-packet: 5.6.1 - dev: true + hasBin: true - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - dev: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - /dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - requiresBuild: true - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - dev: false - optional: true + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - dev: false + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: false + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - /domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - requiresBuild: true - dependencies: - domelementtype: 2.3.0 - dev: false - optional: true + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: false + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - /domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - requiresBuild: true - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - dev: false - optional: true + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: false + jsonfile@3.0.1: + resolution: {integrity: sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==} - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 - dev: true + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - /dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} - dependencies: - is-obj: 2.0.0 - dev: true + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} - /dot-prop@8.0.2: - resolution: {integrity: sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==} - engines: {node: '>=16'} - dependencies: - type-fest: 3.13.1 - dev: false + kind-of@1.1.0: + resolution: {integrity: sha512-aUH6ElPnMGon2/YkxRIigV32MOpTVcoXQ1Oo8aYn40s+sJ3j+0gFZsT8HKDcxNy7Fi9zuquWtGaGAahOdv5p/g==} + engines: {node: '>=0.10.0'} - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: false + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} - /download@6.2.5: - resolution: {integrity: sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==} - engines: {node: '>=4'} - dependencies: - caw: 2.0.1 - content-disposition: 0.5.4 - decompress: 4.2.1 - ext-name: 5.0.0 - file-type: 5.2.0 - filenamify: 2.1.0 - get-stream: 3.0.0 - got: 7.1.0 - make-dir: 1.3.0 - p-event: 1.3.0 - pify: 3.0.0 - dev: false - - /download@7.1.0: - resolution: {integrity: sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - dependencies: - archive-type: 4.0.0 - caw: 2.0.1 - content-disposition: 0.5.4 - decompress: 4.2.1 - ext-name: 5.0.0 - file-type: 8.1.0 - filenamify: 2.1.0 - get-stream: 3.0.0 - got: 8.3.2 - make-dir: 1.3.0 - p-event: 2.3.1 - pify: 3.0.0 - dev: false - - /duplexer2@0.0.2: - resolution: {integrity: sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==} - dependencies: - readable-stream: 1.1.14 - dev: false - - /duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - dependencies: - readable-stream: 2.3.8 - dev: false - /duplexer3@0.1.5: - resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} - /duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - dev: false + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} - /duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 3.6.2 - stream-shift: 1.0.3 - dev: false + last-run@2.0.0: + resolution: {integrity: sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ==} + engines: {node: '>= 10.13.0'} - /each-props@1.3.2: - resolution: {integrity: sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==} - dependencies: - is-plain-object: 2.0.4 - object.defaults: 1.1.0 - dev: false + lead@4.0.0: + resolution: {integrity: sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==} + engines: {node: '>=10.13.0'} - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + lefthook-darwin-arm64@2.1.9: + resolution: {integrity: sha512-119HryNcvr4nqn0wUIrNPgpMEPn9yMQzEcW/lezRsnb56PCJriJB92+MCySPVcWDxJnZef7o0T3jdnPNiSH7Qg==} + cpu: [arm64] + os: [darwin] - /easy-extender@2.3.4: - resolution: {integrity: sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==} - engines: {node: '>= 4.0.0'} - dependencies: - lodash: 4.17.21 - dev: false + lefthook-darwin-x64@2.1.9: + resolution: {integrity: sha512-dwo5Tke2XcQCM56DGHgFKBfRbJIL6xs2wZ0zG1TUVZgl4t4mQUt6LiZ4V/ZQfYHTZF9qywvXoIlR5N35qOaiVQ==} + cpu: [x64] + os: [darwin] - /easy-transform-stream@1.0.1: - resolution: {integrity: sha512-ktkaa6XR7COAR3oj02CF3IOgz2m1hCaY3SfzvKT4Svt2MhHw9XCt+ncJNWfe2TGz31iqzNGZ8spdKQflj+Rlog==} - engines: {node: '>=14.16'} - dev: false + lefthook-freebsd-arm64@2.1.9: + resolution: {integrity: sha512-+09PVap6nl6xsaHch5JLtq7WvIR++U1Q2MzA2ai0M4uB/VP3AqrvKqHw6+9hjyKnIH+HHL83uqi77EAY+LaxLA==} + cpu: [arm64] + os: [freebsd] - /eazy-logger@4.0.1: - resolution: {integrity: sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==} - engines: {node: '>= 0.8.0'} - dependencies: - chalk: 4.1.2 - dev: false + lefthook-freebsd-x64@2.1.9: + resolution: {integrity: sha512-8XresjKIYpkE9ARgCtBEZgJZxAU3T4MIqzj4zNy15XRT59I1Us+QdqXTNm+pkZ41Yd2X/nxs2Pkvbq3NWWlIGw==} + cpu: [x64] + os: [freebsd] - /editions@2.3.1: - resolution: {integrity: sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==} - engines: {node: '>=0.8'} - dependencies: - errlop: 2.2.0 - semver: 6.3.1 - dev: false + lefthook-linux-arm64@2.1.9: + resolution: {integrity: sha512-1oNIQfwrPe6rgU2KcDM3aF6+hpZDCKx1TmawQKpXUY5gVsbZ7MqX0Sk/1lnnWxqPm+kQQ5f6J2dpFWd+4xH8jg==} + cpu: [arm64] + os: [linux] - /editorconfig@1.0.4: - resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} - engines: {node: '>=14'} + lefthook-linux-x64@2.1.9: + resolution: {integrity: sha512-fT+7Q+BJyGp+CslFQkNXmdFRgyVXsPHPi9NAsDX0a6QOyNnoORByAsvx6zeAKuF5rL3BBgNfho1/v2RuGxGy9w==} + cpu: [x64] + os: [linux] + + lefthook-openbsd-arm64@2.1.9: + resolution: {integrity: sha512-4bVuafBk3dddVNo0+3hMbjcJs4mqYAstxpPMmX2ufkudSTYFNIhWoqwuGVQV/SS/xdcOKJAldW4qayAzed2ysw==} + cpu: [arm64] + os: [openbsd] + + lefthook-openbsd-x64@2.1.9: + resolution: {integrity: sha512-PmPoMmLP/wQQWcQ9u2YH86bTZ3UCfBsxuEmVTEyPU2U8R1qSTp5r/Gs3G8cN5Mxo91XB9oBERtF1n+xD3W6aVA==} + cpu: [x64] + os: [openbsd] + + lefthook-windows-arm64@2.1.9: + resolution: {integrity: sha512-KphfkBKmwBnmolyrdhIl3lrBaOyTcCgXBT2AB/9OHnEXhOLvv5uTCUkrD4YRAxXPtFKq6UvnapIeoL3GZq0bdA==} + cpu: [arm64] + os: [win32] + + lefthook-windows-x64@2.1.9: + resolution: {integrity: sha512-2qlUtkJHZ3MyUxgV5XTEmcrIoNZA07iwaquoswAcqv/1MeBFXlD+O+koFRfrzWng2O5WYEbpJnd8tvaYnV8fTA==} + cpu: [x64] + os: [win32] + + lefthook@2.1.9: + resolution: {integrity: sha512-bwDaIOViTktE8kJLf9jP0p+H2/RDTlFFlc43Am2YgUsX22hI6Sq4RbzsrecwzY5y+MHTipOH7WsmWSEniePHWQ==} hasBin: true - dependencies: - '@one-ini/wasm': 0.1.1 - commander: 10.0.1 - minimatch: 9.0.1 - semver: 7.6.2 - dev: false - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: false + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} - /electron-to-chromium@1.4.769: - resolution: {integrity: sha512-bZu7p623NEA2rHTc9K1vykl57ektSPQYFFqQir8BOYf6EKOB+yIsbFB9Kpm7Cgt6tsLr9sRkqfqSZUw7LP1XxQ==} + liftoff@5.0.1: + resolution: {integrity: sha512-wwLXMbuxSF8gMvubFcFRp56lkFV69twvbU5vDPbaw+Q+/rF8j0HKjGbIdlSi+LuJm9jf7k9PB+nTxnsLMPcv2Q==} + engines: {node: '>=10.13.0'} - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: true + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + limiter@1.1.5: + resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: false + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /end-of-stream@0.1.5: - resolution: {integrity: sha512-go5TQkd0YRXYhX+Lc3UrXkoKU5j+m72jEP5lHWr2Nh82L8wfZtH8toKgcg4T10o23ELIMGXQdwCbl+qAXIPDrw==} - dependencies: - once: 1.3.3 - dev: false + linkify-it@5.0.1: + resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 + linkinator@7.6.1: + resolution: {integrity: sha512-+VzKKZXA8wyCW1x0B0YeQvyuenDu3vZGIWMdzK1yEK0HlBfmEKopt87+Judt4VdPOGRMioKzJK0+X8ifIvOc5Q==} + engines: {node: '>=20'} + hasBin: true - /engine.io-client@6.5.3: - resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4 - engine.io-parser: 5.2.2 - ws: 8.11.0 - xmlhttprequest-ssl: 2.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false + lint-staged@17.0.8: + resolution: {integrity: sha512-B2P/d+jVW0UXOQ0MVMLrB/9ydA1P+zz6jYfdrbbEd9ur3S2rcbduFWKiUCC02Sm5hbC8nrm7y24WuYMG54HfxA==} + engines: {node: '>=22.22.1'} + hasBin: true - /engine.io-parser@5.2.2: - resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} - engines: {node: '>=10.0.0'} - dev: false + listr2@10.2.2: + resolution: {integrity: sha512-JtNtbZj8q5BnDMR7trpwvwk3RIrANtIVzEUm8w7amp6xelLgyuq+4WZoTH913XaQAoH/cNdYhaNzBPA2U3xbDw==} + engines: {node: '>=22.13.0'} - /engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} - engines: {node: '>=10.2.0'} - dependencies: - '@types/cookie': 0.4.1 - '@types/cors': 2.8.17 - '@types/node': 20.12.12 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.4.2 - cors: 2.8.5 - debug: 4.3.4 - engine.io-parser: 5.2.2 - ws: 8.11.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false + load-plugin@6.0.3: + resolution: {integrity: sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==} - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - requiresBuild: true - dev: false - optional: true + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: false + lodash.isfinite@3.3.2: + resolution: {integrity: sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==} - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - /environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} - dev: false - /eol@0.9.1: - resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==} - dev: false + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - /errlop@2.2.0: - resolution: {integrity: sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==} - engines: {node: '>=0.8'} - dev: false + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} - /es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - dev: true - - /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true - - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: true - - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - dev: true + markdown-it@14.2.0: + resolution: {integrity: sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==} + hasBin: true - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - dev: true + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - dependencies: - hasown: 2.0.2 - dev: true + marked-gfm-heading-id@4.1.4: + resolution: {integrity: sha512-CspnvVfHSkb/znqdPS4jUR8HtCjq3M/DnrsJCrfLBLvdrgbemmoINKpeWKQYkBiXAoBGejw0cV7xzqrPdup3WA==} + peerDependencies: + marked: '>=13 <19' - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true + marked@17.0.6: + resolution: {integrity: sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA==} + engines: {node: '>= 20'} + hasBin: true - /es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - requiresBuild: true - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - dev: false + mathml-tag-names@4.0.0: + resolution: {integrity: sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==} - /es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - dev: false + mdast-comment-marker@3.0.0: + resolution: {integrity: sha512-bt08sLmTNg00/UtVDiqZKocxqvQqqyQZAg1uaRuO/4ysXV5motg7RolF5o5yy/sY1rG0v2XgZEqFWho1+2UquA==} - /es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} - dependencies: - d: 1.0.2 - ext: 1.7.0 - dev: false + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} - /es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - dev: false + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} - /escape-goat@4.0.0: - resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} - engines: {node: '>=12'} - dev: true + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: false + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: true + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - dev: true + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0): - resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.2 - dependencies: - confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-import: 2.29.1(eslint@8.57.0) - object.assign: 4.1.5 - object.entries: 1.1.8 - semver: 6.3.1 - dev: true + mdast-util-heading-style@3.0.0: + resolution: {integrity: sha512-tsUfM9Kj9msjlemA/38Z3pvraQay880E3zP2NgIthMoGcpU9bcPX9oSM6QC/+eFXGGB4ba+VCB1dKAPHB7Veug==} - /eslint-config-prettier@9.1.0(eslint@8.57.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.57.0 - dev: true + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - dependencies: - debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: true + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} - /eslint-module-utils@2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - debug: 3.2.7 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - dev: true + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} - /eslint-plugin-import@2.29.1(eslint@8.57.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.13.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} - /eslint-plugin-jest@27.9.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - /eslint-plugin-jsdoc@48.2.4(eslint@8.57.0): - resolution: {integrity: sha512-3ebvVgCJFy06gpmuS2ynz13uh9iFSzZ1C1dDkgcSAqVVg82zlORKMk2fvjq708pAO6bwfs5YLttknFEbaoDiGw==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - dependencies: - '@es-joy/jsdoccomment': 0.43.0 - are-docs-informative: 0.0.2 - comment-parser: 1.4.1 - debug: 4.3.4 - escape-string-regexp: 4.0.0 - eslint: 8.57.0 - esquery: 1.5.0 - is-builtin-module: 3.2.1 - semver: 7.6.2 - spdx-expression-parse: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - dependencies: - eslint: 8.57.0 - eslint-config-prettier: 9.1.0(eslint@8.57.0) - prettier: 3.2.5 - prettier-linter-helpers: 1.0.0 - synckit: 0.8.8 - dev: true + mdast-util-to-string@1.1.0: + resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} - /eslint-plugin-regexp@2.5.0(eslint@8.57.0): - resolution: {integrity: sha512-I7vKcP0o75WS5SHiVNXN+Eshq49sbrweMQIuqSL3AId9AwDe9Dhbfug65vw64LxmOd4v+yf5l5Xt41y9puiq0g==} - engines: {node: ^18 || >=20} - peerDependencies: - eslint: '>=8.44.0' - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 - comment-parser: 1.4.1 - eslint: 8.57.0 - jsdoc-type-pratt-parser: 4.0.0 - refa: 0.12.1 - regexp-ast-analysis: 0.7.1 - scslre: 0.3.0 - dev: true + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true + mdn-data@2.28.1: + resolution: {integrity: sha512-U9w+PzSZ00Z5m9rZ5ARVFL5xOfuCHdKYi/1RRwDCJsboFgJDNT3zT6PIPD7mZQYaQLhsZM3GfDRgSMRHhSmVng==} - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} - /esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.2 - dev: false + meow@14.1.0: + resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} + engines: {node: '>=20'} - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 - dev: true + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: false + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - /event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - dev: false + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: false + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: true + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - /exec-buffer@3.2.0: - resolution: {integrity: sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==} - engines: {node: '>=4'} - requiresBuild: true - dependencies: - execa: 0.7.0 - p-finally: 1.0.0 - pify: 3.0.0 - rimraf: 2.7.1 - tempfile: 2.0.0 - dev: false - optional: true + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - /execa@0.7.0: - resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} - engines: {node: '>=4'} - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: false + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - /execa@1.0.0: - resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} - engines: {node: '>=6'} - dependencies: - cross-spawn: 6.0.5 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: false + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - /execa@6.1.0: - resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 3.0.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - dev: false - - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - /executable@4.1.1: - resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} - engines: {node: '>=4'} - dependencies: - pify: 2.3.0 - dev: false + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - /expand-brackets@2.1.4: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} - dependencies: - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: false + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - /expand-hash@0.2.2: - resolution: {integrity: sha512-umf1Ls/PtHupY5S0ci6638rHLSCVbIeZoTLH/dFv4rqb9/4xLdqcyC4qAczo76mlSeSe0ah3fu/oENWGernm8w==} - engines: {node: '>=0.8'} - dependencies: - lodash: 2.4.2 - dev: false + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - /expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} - dependencies: - homedir-polyfill: 1.0.3 - dev: false + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - /ext-list@2.2.2: - resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} - engines: {node: '>=0.10.0'} - dependencies: - mime-db: 1.52.0 - dev: false + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - /ext-name@5.0.0: - resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} - engines: {node: '>=4'} - dependencies: - ext-list: 2.2.2 - sort-keys-length: 1.0.1 - dev: false + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - /ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - dependencies: - type: 2.7.2 - dev: false + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - /extend-shallow@1.1.4: - resolution: {integrity: sha512-L7AGmkO6jhDkEBBGWlLtftA80Xq8DipnrRPr0pyi7GQLXkaq9JYA4xF4z6qnadIC6euiTDKco0cGSU9muw+WTw==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 1.1.0 - dev: false + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - dependencies: - is-extendable: 0.1.1 - dev: false + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - /extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - dev: false + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: true + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - /extglob@2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - 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.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: false + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - /fancy-log@1.3.3: - resolution: {integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==} - engines: {node: '>= 0.10'} - dependencies: - ansi-gray: 0.1.1 - color-support: 1.1.3 - parse-node-version: 1.0.1 - time-stamp: 1.1.0 - dev: false + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - /fancy-log@2.0.0: - resolution: {integrity: sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==} - engines: {node: '>=10.13.0'} - dependencies: - color-support: 1.1.3 - dev: false + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} - /fast-equals@5.0.1: - resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} - engines: {node: '>=6.0.0'} - dev: false + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true - /fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - dev: false + mime@4.1.0: + resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} + engines: {node: '>=16'} + hasBin: true - /fast-glob@2.2.7: - resolution: {integrity: sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==} - engines: {node: '>=4.0.0'} - dependencies: - '@mrmlnc/readdir-enhanced': 2.2.1 - '@nodelib/fs.stat': 1.1.3 - glob-parent: 3.1.0 - is-glob: 4.0.3 - merge2: 1.4.1 - micromatch: 3.1.10 - transitivePeerDependencies: - - supports-color - dev: false + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} - /fast-levenshtein@1.1.4: - resolution: {integrity: sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==} - dev: false + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} - /fast-xml-parser@4.3.6: - resolution: {integrity: sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==} - hasBin: true - requiresBuild: true - dependencies: - strnum: 1.0.5 - dev: false - optional: true + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - /fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - dev: true + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - dependencies: - reusify: 1.0.4 + mitt@1.2.0: + resolution: {integrity: sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==} - /fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - dependencies: - format: 0.2.2 - dev: true + modify-filename@2.0.0: + resolution: {integrity: sha512-VX9/MdgUN9StpSLImJ0+AyV2dxJJtyojIwRHF/Ja942tW7FTzxXI186jDSTk4k5wj2+59a4bRzFnJUgMSi+ygg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /favicons@7.2.0: - resolution: {integrity: sha512-k/2rVBRIRzOeom3wI9jBPaSEvoTSQEW4iM0EveBmBBKFxO8mSyyRWtDlfC3VnEfu0avmjrMzy8/ZFPSe6F71Hw==} - engines: {node: '>=14.0.0'} - dependencies: - escape-html: 1.0.3 - sharp: 0.33.3 - xml2js: 0.6.2 - dev: false + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - dependencies: - pend: 1.2.0 - dev: false + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - dev: true + mute-stdout@2.0.0: + resolution: {integrity: sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==} + engines: {node: '>= 10.13.0'} - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - dev: true + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - /file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - dependencies: - flat-cache: 4.0.1 - dev: true + nanoid@3.3.15: + resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true - /file-type@10.11.0: - resolution: {integrity: sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==} - engines: {node: '>=6'} - requiresBuild: true - dev: false - optional: true + nanospinner@1.2.2: + resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /file-type@19.0.0: - resolution: {integrity: sha512-s7cxa7/leUWLiXO78DVVfBVse+milos9FitauDLG1pI7lNaJ2+5lzPnr2N24ym+84HVwJL6hVuGfgVE+ALvU8Q==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-plop@0.32.3: + resolution: {integrity: sha512-tn+OxutdqhvoByKJ7p84FZBSUDfUB76bcvj0ugLBvgE9V52LFcnz8cauCDKi6otnctvFCqa9XkrU35pBY5Baig==} + engines: {node: '>=18'} + + node-releases@2.0.50: + resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} engines: {node: '>=18'} - dependencies: - readable-web-to-node-stream: 3.0.2 - strtok3: 7.0.0 - token-types: 5.0.1 - dev: false - /file-type@3.9.0: - resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - dev: false - /file-type@4.4.0: - resolution: {integrity: sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==} - engines: {node: '>=4'} - dev: false + now-and-later@3.0.0: + resolution: {integrity: sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==} + engines: {node: '>= 10.13.0'} - /file-type@5.2.0: - resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} - engines: {node: '>=4'} - dev: false + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - /file-type@6.2.0: - resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} - engines: {node: '>=4'} - dev: false + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - /file-type@8.1.0: - resolution: {integrity: sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==} - engines: {node: '>=6'} - dev: false + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - requiresBuild: true - dev: false - optional: true + npm-pick-manifest@9.1.0: + resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} + engines: {node: ^16.14.0 || >=18.0.0} - /filename-reserved-regex@2.0.0: - resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} - engines: {node: '>=4'} - dev: false + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - /filenamify@2.1.0: - resolution: {integrity: sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==} - engines: {node: '>=4'} - dependencies: - filename-reserved-regex: 2.0.0 - strip-outer: 1.0.1 - trim-repeated: 1.0.0 - dev: false + nunjucklinter@1.3.0: + resolution: {integrity: sha512-bZxUtjc4x6ZY7rwoD9WiZ9y5NPQR7hli7a8NOJyqhoTaIyb+vOTpeAGUhtKv7BrcdDI9D0CWU4y2dHoD8n97qA==} + engines: {node: '>=18.0.0'} + hasBin: true - /fill-range@4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - dev: false + nunjucks@3.2.4: + resolution: {integrity: sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==} + engines: {node: '>= 6.9.0'} + hasBin: true + peerDependencies: + chokidar: ^3.3.0 + peerDependenciesMeta: + chokidar: + optional: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} - /finalhandler@1.1.0: - resolution: {integrity: sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.3.0 - parseurl: 1.3.3 - statuses: 1.3.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false + object-deep-merge@2.0.1: + resolution: {integrity: sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==} - /find-index@0.1.1: - resolution: {integrity: sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==} - dev: false + object.defaults@1.1.0: + resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} + engines: {node: '>=0.10.0'} - /find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} engines: {node: '>=0.10.0'} - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - dev: false - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - dev: true + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} - /find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - unicorn-magic: 0.1.0 - dev: true - /find-versions@3.2.0: - resolution: {integrity: sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==} - engines: {node: '>=6'} - dependencies: - semver-regex: 2.0.0 - dev: false + opn@5.3.0: + resolution: {integrity: sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==} + engines: {node: '>=4'} - /findup-sync@2.0.0: - resolution: {integrity: sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==} - engines: {node: '>= 0.10'} - dependencies: - detect-file: 1.0.0 - is-glob: 3.1.0 - micromatch: 3.1.10 - resolve-dir: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: false + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} - /findup-sync@3.0.0: - resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==} - engines: {node: '>= 0.10'} - dependencies: - detect-file: 1.0.0 - is-glob: 4.0.3 - micromatch: 3.1.10 - resolve-dir: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: false + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} - /fined@1.2.0: - resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} - engines: {node: '>= 0.10'} - dependencies: - expand-tilde: 2.0.2 - is-plain-object: 2.0.4 - object.defaults: 1.1.0 - object.pick: 1.3.0 - parse-filepath: 1.0.2 - dev: false + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} - /first-chunk-stream@1.0.0: - resolution: {integrity: sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==} - engines: {node: '>=0.10.0'} - dev: false + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} - /first-chunk-stream@5.0.0: - resolution: {integrity: sha512-WdHo4ejd2cG2Dl+sLkW79SctU7mUQDfr4s1i26ffOZRs5mgv+BRttIM9gwcq0rDbemo0KlpVPaa3LBVLqPXzcQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false + p-map@7.0.5: + resolution: {integrity: sha512-e8vJF4XdVkzqqSHguEMz41mQO1wKwxKm5ENrUJQUu9kLDCtn83cxbyHZcszr4QC5zEA7WffRRC4gsTecC7J9oA==} + engines: {node: '>=18'} - /flagged-respawn@1.0.1: - resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} - engines: {node: '>= 0.10'} - dev: false + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} - /flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - dev: true + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true + parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} - /flush-write-stream@1.1.1: - resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: false + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} - /follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} - /for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - dev: false + parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + engines: {node: '>=16'} - /for-own@1.0.0: - resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} - engines: {node: '>=0.10.0'} - dependencies: - for-in: 1.0.2 - dev: false + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} - /fork-stream@0.0.4: - resolution: {integrity: sha512-Pqq5NnT78ehvUnAk/We/Jr22vSvanRlFTpAmQ88xBY/M1TlHe+P0ILuEyXS595ysdGfaj22634LBkGMA2GTcpA==} - dev: false + parse-statements@1.0.11: + resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} - /form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} - engines: {node: '>= 14.17'} - dev: true + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} - /format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - dev: true + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - dependencies: - fetch-blob: 3.2.0 - dev: true + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - dev: false + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} - /fragment-cache@0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} - dependencies: - map-cache: 0.2.2 - dev: false + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: false + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} - /from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: false + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /front-matter@2.3.0: - resolution: {integrity: sha512-+gOIDsGWHVAiWSDfg3vpiHwkOrwO4XNS3YQH5DMmneLEPWzdCAnbSQCtxReF4yPK1nszLvAmLeR2SprnDQDnyQ==} - dependencies: - js-yaml: 3.14.1 - dev: false + path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false + path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} - /fs-extra@3.0.1: - resolution: {integrity: sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 3.0.1 - universalify: 0.1.2 - dev: false + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} - /fs-mkdirp-stream@1.0.0: - resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==} - engines: {node: '>= 0.10'} - dependencies: - graceful-fs: 4.2.11 - through2: 2.0.5 - dev: false + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - /fsevents@1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} - os: [darwin] - deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 - requiresBuild: true - dependencies: - bindings: 1.5.0 - nan: 2.19.0 - dev: false - optional: true + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} - /ftp@0.3.10: - resolution: {integrity: sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==} - engines: {node: '>=0.8.0'} - dependencies: - readable-stream: 1.1.14 - xregexp: 2.0.0 - dev: false + playwright-core@1.61.1: + resolution: {integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==} + engines: {node: '>=18'} + hasBin: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + playwright@1.61.1: + resolution: {integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==} + engines: {node: '>=18'} + hasBin: true - /function-timeout@1.0.1: - resolution: {integrity: sha512-6yPMImFFuaMPNaTMTBuolA8EanHJWF5Vju0NHpObRURT105J6x1Mf2a7J4P7Sqk2xDxv24N5L0RatEhTBhNmdA==} + plop@4.0.5: + resolution: {integrity: sha512-pJz6oWC9LyBp5mBrRp8AUV2RNiuGW+t/HOs4zwN+b/3YxoObZOOFvjn1mJMpAeKi2pbXADMFOOVQVTVXEdDHDw==} engines: {node: '>=18'} - dev: false + hasBin: true - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - dev: true + plugin-error@0.1.2: + resolution: {integrity: sha512-WzZHcm4+GO34sjFMxQMqZbsz3xiNEgonCskQ9v+IroMmYgk/tas8dG+Hr2D6IbRPybZ12oWpzE/w3cGJ6FJzOw==} + engines: {node: '>=0.10.0'} - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + plugin-error@1.0.1: + resolution: {integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==} + engines: {node: '>= 0.10'} - /gaze@0.5.2: - resolution: {integrity: sha512-3IWbXGkDDHFX8zIlNdfnmhvlSMhpBO6tDr4InB8fGku6dh/gjFPGNqcdsXJajZg05x9jRzXbL6gCnCnuMap4tw==} - engines: {node: '>= 0.8.0'} - dependencies: - globule: 0.1.0 - dev: false + plugin-error@2.0.1: + resolution: {integrity: sha512-zMakqvIDyY40xHOvzXka0kUvf40nYIuwRE8dWhti2WtjQZ31xAgBZBhxsK7vK3QbRXS1Xms/LO7B5cuAsfB2Gg==} + engines: {node: '>=10.13.0'} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} - /get-caller-file@1.0.3: - resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} - dev: false + portscanner@2.2.0: + resolution: {integrity: sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==} + engines: {node: '>=0.4', npm: '>=1.0.0'} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + postcss-bem-linter@4.0.1: + resolution: {integrity: sha512-jTG3uMo6n2YyxLBPLsRN+5R9djNJZ3mirAugvnYbZaZOwPmLb/MaQ2uql0fSdVYegjZBmX8tW5B0mfZigiXZ9Q==} + peerDependencies: + postcss: ^8.4.21 - /get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - dev: true + postcss-calc@10.1.1: + resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} + engines: {node: ^18.12 || ^20.9 || >=22.0} + peerDependencies: + postcss: ^8.4.38 - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 + postcss-colormin@8.0.1: + resolution: {integrity: sha512-qBY4ABQ6d8/mk5RRZHwMllrZMxeMey3azVY2dZUEk+RgiUC4ARdPR3/AITzNqqKTbvW/3y/MJKinDrzwqn8RDQ==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /get-proxy@2.1.0: - resolution: {integrity: sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==} - engines: {node: '>=4'} - dependencies: - npm-conf: 1.1.3 - dev: false + postcss-convert-values@8.0.1: + resolution: {integrity: sha512-IdOSIX3BzfMvCc1TAHIha2gfy17xnb5vfML8e2BIKARnFOghksESfaSAB/3CXgyLfMozZAbTRPVQF5dbuKOidw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /get-stdin@7.0.0: - resolution: {integrity: sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==} - engines: {node: '>=8'} - dev: false + postcss-discard-comments@8.0.1: + resolution: {integrity: sha512-FDvzm3tXlEsQBO2XQgnta5ugsAqwBrgWH+j5QgXpegEIDYA0VPnZg2aP7LtmWtC49POskeIhXesFiU/k3NyFHA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /get-stream@2.3.1: - resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} - engines: {node: '>=0.10.0'} - dependencies: - object-assign: 4.1.1 - pinkie-promise: 2.0.1 - dev: false + postcss-discard-duplicates@8.0.1: + resolution: {integrity: sha512-stTDXkI8YkCUfADurQhp03oq5ynsgSx6Qrw5B1swds6oTHtAeOZ9I0SHGK8cY/VpWUsIYFDWMs3IWf9jIEfFvA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - dev: false + postcss-discard-empty@8.0.1: + resolution: {integrity: sha512-Zv4fM1Yfhk71tbt6gfiptbL6jDHi+7apSnaMeaO9n1uET+1embrXQw5m93Zp5x28UyQSuv+AVkFY193jdwZ33w==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /get-stream@4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - dependencies: - pump: 3.0.0 + postcss-discard-overridden@8.0.1: + resolution: {integrity: sha512-ykt4fvrC7yYGzbxKyqBVjDCbsjF/11JgWK8enrdkobRyqqEtb/uDUCbKOGdvrK8X7BrShW8Lv5cCRNbdkNHGkQ==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + postcss-merge-longhand@8.0.1: + resolution: {integrity: sha512-huTfSYgQ13O81SFvAuOi7GWnO48vvybjj3xF+X3qUoPjzvvaLpJH5DcUqqXcwOEulZUcvaV4s0V9WtWs+IAQPA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true + postcss-merge-rules@8.0.1: + resolution: {integrity: sha512-o3rk4UpnPNg469tklYwbR/NtvKc/f/wJiVDTnNQ/EFPw/LeiPOHUCvV1GIBQIZHGrBAYdPjToK6a+ojYprsrxQ==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - dev: true + postcss-minify-font-values@8.0.1: + resolution: {integrity: sha512-L8Nzs/PRlBSPrLdY/7rAiU5ZN5800+2J/4LRbfyG8SJnPljmgMaXVmQiCklvRS+yObfVRNtvmk/Ean/eoYcSeg==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /get-uri@6.0.3: - resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} - engines: {node: '>= 14'} - dependencies: - basic-ftp: 5.0.5 - data-uri-to-buffer: 6.0.2 - debug: 4.3.4 - fs-extra: 11.2.0 - transitivePeerDependencies: - - supports-color - dev: true + postcss-minify-gradients@8.0.1: + resolution: {integrity: sha512-qf+4s/hZMqTwpWN2teqf6+1yvR/SZK5HgHqXYuACeJXV7ABe7AXtBEomgxagUzcN4bSnmqBh5vnIml0dYqykYg==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - dev: false + postcss-minify-params@8.0.1: + resolution: {integrity: sha512-L0h3H59deFfFg0wQN1NVaS/8E/LfGvaMuZKGO7siwlG995zo3OshtQyRkqKdVqcBwAORBvZ1nDZrKPLRapYkQw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /get-value@3.0.1: - resolution: {integrity: sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==} - engines: {node: '>=6.0'} - dependencies: - isobject: 3.0.1 - dev: false + postcss-minify-selectors@8.0.2: + resolution: {integrity: sha512-3icdxc/zght5UAizdwqZBDE2KOWHf1jMQCxET6iLACeNlRxfTPyXS0/COpGk8CQ2cECyaEKTRUd/i/k8Gxmz4g==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /gifsicle@5.3.0: - resolution: {integrity: sha512-FJTpgdj1Ow/FITB7SVza5HlzXa+/lqEY0tHQazAJbuAdvyJtkH4wIdsR2K414oaTwRXHFLLF+tYbipj+OpYg+Q==} - engines: {node: '>=10'} - hasBin: true - requiresBuild: true - dependencies: - bin-build: 3.0.0 - bin-wrapper: 4.1.0 - execa: 5.1.1 - dev: false - optional: true + postcss-normalize-charset@8.0.1: + resolution: {integrity: sha512-xzqr36F8UeIZOvOHsf3aul+RVJCADvSwuwpMLgizqKjisHZpBfztgW0XFLBfJvz9pJgaStaOXAtGb0zLqT6B0w==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /git-raw-commits@4.0.0: - resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} - engines: {node: '>=16'} - hasBin: true - dependencies: - dargs: 8.1.0 - meow: 12.1.1 - split2: 4.2.0 - dev: true + postcss-normalize-display-values@8.0.1: + resolution: {integrity: sha512-ZDWOijOK1FFMlpgiQCUO9fCNKd7HJ9L7z9HWEq4iyubnUFWzdTSwm/LcrMbNW6iZ1oAtqeLYA0WA3xHszOI08g==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /git-semver-tags@7.0.1: - resolution: {integrity: sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q==} - engines: {node: '>=16'} - hasBin: true - dependencies: - meow: 12.1.1 - semver: 7.6.2 - dev: true + postcss-normalize-positions@8.0.1: + resolution: {integrity: sha512-uuivan2poSqbE48ST4do20dGaFUeXey9/H8rhHzoyVHB2I6BmkoVLZ/C9+BRjUlpaAFYVOoDY7epkiidzaYbvA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} - dependencies: - is-ssh: 1.4.0 - parse-url: 8.1.0 - dev: true + postcss-normalize-repeat-style@8.0.1: + resolution: {integrity: sha512-q2hq5fmKxk29K6DjKA3nZ17Q2dtjhLYFNmFweKALmooUqx6UWAHF1bBoWTu/EqlJ88josb82A/J0Atj9LJUmpQ==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /git-url-parse@14.0.0: - resolution: {integrity: sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==} - dependencies: - git-up: 7.0.0 - dev: true + postcss-normalize-string@8.0.1: + resolution: {integrity: sha512-+Wf+kQJhm1WgSGEAuUaswE9rdpR9QbrKRVemcVHs6rhOoOTVIdAbgaicftfYA6vLM346P8onRzkEVbFN29ktKQ==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 - dev: false + postcss-normalize-timing-functions@8.0.1: + resolution: {integrity: sha512-W8/tvwRlm3T+yjGkg0IRTF4bvHj0vILYr/LOogCrJKHz2ey2HFRwfsAA8Bk9N4BGR7z7WmmDu/KzzwhJ6FoGPQ==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 + postcss-normalize-unicode@8.0.1: + resolution: {integrity: sha512-Ad0YHNRBp4WHEOYUM/4wL/8MoL2fimEF8se/0q+Rt/owMzYpbxsypC1P8fN/oluwoRmRKdNVX7X2oycEobPWcQ==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-stream@3.1.18: - resolution: {integrity: sha512-owHtlMMXIAbxLjhUAO0HhW1/TB7kV0AwDduI3BLbYsWCaRzNIcLBu8N0wHZft2Za2SCmUXCEOdpZzC7k/H19eg==} - engines: {node: '>= 0.9'} - dependencies: - glob: 4.5.3 - glob2base: 0.0.12 - minimatch: 2.0.10 - ordered-read-streams: 0.1.0 - through2: 0.6.5 - unique-stream: 1.0.0 - dev: false - - /glob-stream@6.1.0: - resolution: {integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==} - engines: {node: '>= 0.10'} - dependencies: - extend: 3.0.2 - glob: 7.2.3 - glob-parent: 3.1.0 - is-negated-glob: 1.0.0 - ordered-read-streams: 1.0.1 - pumpify: 1.5.1 - readable-stream: 2.3.8 - remove-trailing-separator: 1.1.0 - to-absolute-glob: 2.0.2 - unique-stream: 2.3.1 - dev: false + postcss-normalize-url@8.0.1: + resolution: {integrity: sha512-tkYcip6pCDY806xuxpJYqMW2M3/623jzGFJmz3m5Us47q8P28+gbRZxaea3Rr/CmwwLUiVlh+BTGYwQ6gvaP8A==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /glob-to-regexp@0.3.0: - resolution: {integrity: sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==} - dev: false + postcss-normalize-whitespace@8.0.1: + resolution: {integrity: sha512-XzORadNfSrKWDZZpgAEHPKINKx8r9r9RIfE9c70g/HThdpbmPHhDYCodHSVESDxmKeySAYw1p4liuBCf7j6LyA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /glob-watcher@0.0.6: - resolution: {integrity: sha512-lzYWq1BJLBmtb9rzT6+lgbFlEW6Sc7B+Qs3RmsNA9lbdFSqLHhebfypPR3nbEOMeEQyawVXqSDH0aqjtImldow==} - engines: {node: '>= 0.9'} - dependencies: - gaze: 0.5.2 - dev: false + postcss-ordered-values@8.0.1: + resolution: {integrity: sha512-OLXq5lR1yk3KWQ1FPK6aWjFFdktHE9f9kb8cnt4LmIw7w30DnzgD9+sOVYJc5HenkWCX8i1MJhhFwmqc/GYqLg==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /glob-watcher@5.0.5: - resolution: {integrity: sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==} - engines: {node: '>= 0.10'} - dependencies: - anymatch: 2.0.0 - async-done: 1.3.2 - chokidar: 2.1.8 - is-negated-glob: 1.0.0 - just-debounce: 1.1.0 - normalize-path: 3.0.0 - object.defaults: 1.1.0 - transitivePeerDependencies: - - supports-color - dev: false + postcss-reduce-initial@8.0.1: + resolution: {integrity: sha512-+aQsR6+61KRoIfcFNLP3v9RM7+0iYOTtPnjl1wr6JqMW1zx6S+t2ktHRefXwacFdHIDj5+ETG0KY7K3+SGQ4Nw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /glob2base@0.0.12: - resolution: {integrity: sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==} - engines: {node: '>= 0.10'} - dependencies: - find-index: 0.1.1 - dev: false + postcss-reduce-transforms@8.0.1: + resolution: {integrity: sha512-x71slHVykiFi5RuKEXM0wgYpY2PngC78x6R8TnZhHF3lhqt+u/w3MGwYLX+2t5O87ssRiMfEAhQH+3J4QwVzCw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /glob@10.3.15: - resolution: {integrity: sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==} - engines: {node: '>=16 || 14 >=14.18'} - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.4 - minipass: 7.1.1 - path-scurry: 1.11.1 + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} - /glob@3.1.21: - resolution: {integrity: sha512-ANhy2V2+tFpRajE3wN4DhkNQ08KDr0Ir1qL12/cUe5+a7STEK8jkW4onUYuY8/06qAFuT5je7mjAqzx0eKI2tQ==} - dependencies: - graceful-fs: 1.2.3 - inherits: 1.0.2 - minimatch: 0.2.14 - dev: false + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 - /glob@4.5.3: - resolution: {integrity: sha512-I0rTWUKSZKxPSIAIaqhSXTM/DiII6wame+rEC3cFA5Lqmr9YmdL7z6Hj9+bdWtTvoY1Su4/OiMLmb37Y7JzvJQ==} - dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 2.0.10 - once: 1.4.0 - dev: false + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + postcss-selector-parser@7.1.4: + resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} + engines: {node: '>=4'} - /global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} - dependencies: - ini: 4.1.1 - dev: true + postcss-sorting@8.0.2: + resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==} + peerDependencies: + postcss: ^8.4.20 - /global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} - dependencies: - ini: 2.0.0 - dev: true + postcss-svgo@8.0.1: + resolution: {integrity: sha512-HpnvWii7W0/FPrsejJa6ZTi0kNtTJP/Iba7CUMPX0xPV6QpnndOp+SDP74tFtgjA2cYKYNWJPOlmLXMsvi/9yA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} - dependencies: - global-prefix: 1.0.2 - is-windows: 1.0.2 - resolve-dir: 1.0.1 - dev: false + postcss-unique-selectors@8.0.1: + resolution: {integrity: sha512-+xvKI5+/Cl8yYQwxDV39Uhuc4WV951xngFvPPjiPj2NIbIfm6vbbRTXblyw0FioLkIoGlw+7qUcY1h2YhaZYgw==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} - dependencies: - global-prefix: 3.0.0 - dev: true + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} - dependencies: - expand-tilde: 2.0.2 - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 1.0.2 - which: 1.3.1 - dev: false + postcss@8.5.16: + resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} + engines: {node: ^10 || ^12 || >=14} - /global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} - dependencies: - ini: 1.3.8 - kind-of: 6.0.3 - which: 1.3.1 - dev: true + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + presentable-error@0.0.1: + resolution: {integrity: sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==} + engines: {node: '>=16'} - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true + prettier-plugin-jinja-template@2.2.0: + resolution: {integrity: sha512-FVZtWvSW8RKvHToWHgI9j1eau7t2mekYoVKg7GdDS16QVOYM8f08yzVptBUvSXKQR2xJAXCLi0rGGvJGFtCUrA==} + peerDependencies: + prettier: ^3.0.0 - /globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - dev: true + prettier@3.9.4: + resolution: {integrity: sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg==} + engines: {node: '>=14'} + hasBin: true + + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - /globby@14.0.1: - resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} - engines: {node: '>=18'} - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.2 - ignore: 5.3.1 - path-type: 5.0.0 - slash: 5.1.0 - unicorn-magic: 0.1.0 + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - /globby@9.2.0: - resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} - dependencies: - '@types/glob': 7.2.0 - array-union: 1.0.2 - dir-glob: 2.2.2 - fast-glob: 2.2.7 - glob: 7.2.3 - ignore: 4.0.6 - pify: 4.0.1 - slash: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false - /globjoin@0.1.4: - resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} - dev: true + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} - /globule@0.1.0: - resolution: {integrity: sha512-3eIcA2OjPCm4VvwIwZPzIxCVssA8HSpM2C6c6kK5ufJH4FGwWoyqL3In19uuX4oe+TwH3w2P1nQDmW56iehO4A==} - engines: {node: '>= 0.8.0'} - dependencies: - glob: 3.1.21 - lodash: 1.0.2 - minimatch: 0.2.14 - dev: false + purgecss@8.0.0: + resolution: {integrity: sha512-QFJyps9y5oHeXnNA3Ql1EaAqWBivNwQn19Pw1lt9RxfB+4e+bIyqCyuombk79D6Fxe+lPXggVfI1WtRGEBwgbQ==} + hasBin: true + + qified@0.10.1: + resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} + engines: {node: '>=20'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} + engines: {node: '>= 0.8'} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + refa@0.12.1: + resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + regexp-ast-analysis@0.7.1: + resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + remark-cli@12.0.1: + resolution: {integrity: sha512-2NAEOACoTgo+e+YAaCTODqbrWyhMVmlUyjxNCkTrDRHHQvH6+NbrnqVvQaLH/Q8Ket3v90A43dgAJmXv8y5Tkw==} + hasBin: true + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-lint-blockquote-indentation@4.0.1: + resolution: {integrity: sha512-7BhOsImFgTD7IIliu2tt+yJbx5gbMbXCOspc3VdYf/87iLJdWKqJoMy2V6DZG7kBjBlBsIZi38fDDngJttXt4w==} + + remark-lint-checkbox-character-style@5.0.1: + resolution: {integrity: sha512-6qilm7XQXOcTvjFEqqNY57Ki7md9rkSdpMIfIzVXdEnI4Npl2BnUff6ANrGRM7qTgJTrloaf8H0eQ91urcU6Og==} + + remark-lint-code-block-style@4.0.1: + resolution: {integrity: sha512-d4mHsEpv1yqXWl2dd+28tGRX0Lzk5qw7cfxAQVkOXPUONhsMFwXJEBeeqZokeG4lOKtkKdIJR7ezScDfWR0X4w==} + + remark-lint-code@2.0.0: + resolution: {integrity: sha512-2U2OAPJM1vm9SGNPFKWQQ7gO85XdF990k7WGQ/GasDq/J0q5euY2PTco3tf1RWmDc/LFDWBM4UC6p3fzuDlkog==} + + remark-lint-emphasis-marker@4.0.1: + resolution: {integrity: sha512-BF1WWsAxai3XoKk48sfiqT3L8m02AZLj3BnipWkHDRXuLfz6VwsHVaHWyNvvE0p6b2B3A5dSYbcfJu5RmPx4tQ==} + + remark-lint-fenced-code-marker@4.0.1: + resolution: {integrity: sha512-uI91OcVPKjNxV+vpjDW9T64hkE0a/CRn3JhwdMxUAJYpVsKnA7PFPSFJOx/abNsVZHNSe7ZFGgGdaH/lqgSizA==} + + remark-lint-final-newline@3.0.1: + resolution: {integrity: sha512-q5diKHD6BMbzqWqgvYPOB8AJgLrMzEMBAprNXjcpKoZ/uCRqly+gxjco+qVUMtMWSd+P+KXZZEqoa7Y6QiOudw==} + + remark-lint-hard-break-spaces@4.1.1: + resolution: {integrity: sha512-AKDPDt39fvmr3yk38OKZEWJxxCOOUBE+96AsBfs+ExS5LW6oLa9041X5ahFDQHvHGzdoremEIaaElursaPEkNg==} + + remark-lint-heading-style@4.0.1: + resolution: {integrity: sha512-+rUpJ/N2CGC5xPgZ18XgsCsUBtadgEhdTi0BJPrsFmHPzL22BUHajeg9im8Y7zphUcbi1qFiKuxZd2nzDgZSXQ==} + + remark-lint-heading-whitespace@1.0.0: + resolution: {integrity: sha512-DykoBIXNbkihg64D+mztSOv3l82RTH4tIZW/HUB4QM4NpIEB+pVIPQpCYD0K4pTgvKiwoqsj4NY8qJ1EhNHAmQ==} + + remark-lint-link-title-style@4.0.1: + resolution: {integrity: sha512-MtmnYrhjhRXR0zeiyYf/7GBlUF5KAPypJb345KjyDluOhI4Wj4VAXvVQuov/MFc3y8p/1yVwv3QDYv6yue8/wQ==} + + remark-lint-list-item-bullet-indent@5.0.1: + resolution: {integrity: sha512-LKuTxkw5aYChzZoF3BkfaBheSCHs0T8n8dPHLQEuOLo6iC5wy98iyryz0KZ61GD8stlZgQO2KdWSdnP6vr40Iw==} + + remark-lint-list-item-content-indent@4.0.1: + resolution: {integrity: sha512-KSopxxp64O6dLuTQ2sWaTqgjKWr1+AoB1QCTektMJ3mfHfn0QyZzC2CZbBU22KGzBhiYXv9cIxlJlxUtq2NqHg==} - /glogg@1.0.2: - resolution: {integrity: sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==} + remark-lint-list-item-indent@4.0.1: + resolution: {integrity: sha512-gJd1Q+jOAeTgmGRsdMpnRh01DUrAm0O5PCQxE8ttv1QZOV015p/qJH+B4N6QSmcUuPokHLAh9USuq05C73qpiA==} + + remark-lint-no-blockquote-without-marker@6.0.1: + resolution: {integrity: sha512-b4IOkNcG7C16HYAdKUeAhO7qPt45m+v7SeYbVrqvbSFtlD3EUBL8fgHRgLK1mdujFXDP1VguOEMx+Txv8JOT4w==} + + remark-lint-no-duplicate-definitions@4.0.1: + resolution: {integrity: sha512-Ek+A/xDkv5Nn+BXCFmf+uOrFSajCHj6CjhsHjtROgVUeEPj726yYekDBoDRA0Y3+z+U30AsJoHgf/9Jj1IFSug==} + + remark-lint-no-duplicate-headings@4.0.1: + resolution: {integrity: sha512-6lggqnpIe5FepikjYF2me3ovKV4oD/rAz8WmwVbLR2cLkce1iH+PB7jyxk/A2gQQqrDcIlRMA5Ct2Yj56cEwhQ==} + + remark-lint-no-heading-content-indent@5.0.1: + resolution: {integrity: sha512-YIWktnZo7M9aw7PGnHdshvetSH3Y0qW+Fm143R66zsk5lLzn1XA5NEd/MtDzP8tSxxV+gcv+bDd5St1QUI4oSQ==} + + remark-lint-no-literal-urls@4.0.1: + resolution: {integrity: sha512-RhTANFkFFXE6bM+WxWcPo2TTPEfkWG3lJZU50ycW7tJJmxUzDNzRed/z80EVJIdGwFa0NntVooLUJp3xrogalQ==} + + remark-lint-no-shortcut-reference-image@4.0.1: + resolution: {integrity: sha512-hQhJ3Dr8ZWRdj7qm6+9vcPpqtGchhENA2UHOmcTraLf6dN1cFATCgY/HbTbRIN6NkG/EEClTgRC1QCokWR2Mmw==} + + remark-lint-no-shortcut-reference-link@4.0.1: + resolution: {integrity: sha512-YxciuUZc90QaJYhayGO80lS3zxEOBgwwLW1MKYB7AfUdkrLcLVlS+DFloiq0MZ7EDVXuuGUEnIzyjyLSbI5BUA==} + + remark-lint-no-undefined-references@5.0.2: + resolution: {integrity: sha512-5prkVb1tKwJwr5+kct/UjsLjvMdEDO7uClPeGfrxfAcN59+pWU8OUSYiqYmpSKWJPIdyxPRS8Oyf1HtaYvg8VQ==} + + remark-lint-no-unused-definitions@4.0.2: + resolution: {integrity: sha512-KRzPmvfq6b3LSEcAQZobAn+5eDfPTle0dPyDEywgPSc3E7MIdRZQenL9UL8iIqHQWK4FvdUD0GX8FXGqu5EuCw==} + + remark-lint-ordered-list-marker-style@4.0.1: + resolution: {integrity: sha512-vZTAbstcBPbGwJacwldGzdGmKwy5/4r29SZ9nQkME4alEl5B1ReSBlYa8t7QnTSW7+tqvA9Sg71RPadgAKWa4w==} + + remark-lint-ordered-list-marker-value@4.0.1: + resolution: {integrity: sha512-HQb1MrArvApREC1/I6bkiFlZVDjngsuII29n8E8StnAaHOMN3hVYy6wJ9Uk+O3+X9O8v7fDsZPqFUHSfJhERXQ==} + + remark-lint-rule-style@4.0.1: + resolution: {integrity: sha512-gl1Ft13oTS3dJUCsWZzxD/5dAwI1HON67KU7uNfODD5gXJ8Y11deOWbun190ma7XbYdD7P0l8VT2HeRtEQzrWg==} + + remark-lint-strong-marker@4.0.1: + resolution: {integrity: sha512-KaGtj/OWEP4eoafevnlp3NsEVwC7yGEjBJ6uFMzfjNoXyjATdfZ2euB/AfKVt/A/FdZeeMeVoAUFH4DL+hScLQ==} + + remark-lint-table-cell-padding@5.1.1: + resolution: {integrity: sha512-6fgVA1iINBoAJaZMOnSsxrF9Qj9+hmCqrsrqZqgJJETjT1ODGH64iAN1/6vHR7dIwmy73d6ysB2WrGyKhVlK3A==} + + remark-lint@10.0.1: + resolution: {integrity: sha512-1+PYGFziOg4pH7DDf1uMd4AR3YuO2EMnds/SdIWMPGT7CAfDRSnAmpxPsJD0Ds3IKpn97h3d5KPGf1WFOg6hXQ==} + + remark-message-control@8.0.0: + resolution: {integrity: sha512-brpzOO+jdyE/mLqvqqvbogmhGxKygjpCUCG/PwSCU43+JZQ+RM+sSzkCWBcYvgF3KIAVNIoPsvXjBkzO7EdsYQ==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-preset-lint-consistent@6.0.1: + resolution: {integrity: sha512-SOLdA36UOU1hiGFm6HAqN9+DORGJPVWxU/EvPVkknTr9V4ULhlzHEJ8OVRMVX3jqoy4lrwb4IqiboVz0YLA7+Q==} + + remark-preset-lint-recommended@7.0.1: + resolution: {integrity: sha512-j1CY5u48PtZl872BQ40uWSQMT3R4gXKp0FUgevMu5gW7hFMtvaCiDq+BfhzeR8XKKiW9nIMZGfIMZHostz5X4g==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + replace-ext@1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} engines: {node: '>= 0.10'} - dependencies: - sparkles: 1.0.1 - dev: false - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.4 + replace-ext@2.0.0: + resolution: {integrity: sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==} + engines: {node: '>= 10'} - /got@12.6.1: - resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} - engines: {node: '>=14.16'} - dependencies: - '@sindresorhus/is': 5.6.0 - '@szmarczak/http-timer': 5.0.1 - cacheable-lookup: 7.0.0 - cacheable-request: 10.2.14 - decompress-response: 6.0.0 - form-data-encoder: 2.1.4 - get-stream: 6.0.1 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 3.0.0 - responselike: 3.0.0 - dev: true - - /got@13.0.0: - resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} - engines: {node: '>=16'} - dependencies: - '@sindresorhus/is': 5.6.0 - '@szmarczak/http-timer': 5.0.1 - cacheable-lookup: 7.0.0 - cacheable-request: 10.2.14 - decompress-response: 6.0.0 - form-data-encoder: 2.1.4 - get-stream: 6.0.1 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 3.0.0 - responselike: 3.0.0 - dev: true - - /got@7.1.0: - resolution: {integrity: sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==} - engines: {node: '>=4'} - dependencies: - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.3 - decompress-response: 3.3.0 - duplexer3: 0.1.5 - get-stream: 3.0.0 - is-plain-obj: 1.1.0 - is-retry-allowed: 1.2.0 - is-stream: 1.1.0 - isurl: 1.0.0 - lowercase-keys: 1.0.1 - p-cancelable: 0.3.0 - p-timeout: 1.2.1 - safe-buffer: 5.2.1 - timed-out: 4.0.1 - url-parse-lax: 1.0.0 - url-to-options: 1.0.1 - dev: false + replace-homedir@2.0.0: + resolution: {integrity: sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw==} + engines: {node: '>= 10.13.0'} - /got@8.3.2: - resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + reserved-identifiers@1.2.0: + resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} + engines: {node: '>=18'} + + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + + resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} - dependencies: - '@sindresorhus/is': 0.7.0 - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.3 - cacheable-request: 2.1.4 - decompress-response: 3.3.0 - duplexer3: 0.1.5 - get-stream: 3.0.0 - into-stream: 3.1.0 - is-retry-allowed: 1.2.0 - isurl: 1.0.0 - lowercase-keys: 1.0.1 - mimic-response: 1.0.1 - p-cancelable: 0.4.1 - p-timeout: 2.0.1 - pify: 3.0.0 - safe-buffer: 5.2.1 - timed-out: 4.0.1 - url-parse-lax: 3.0.0 - url-to-options: 1.0.1 - dev: false - /got@9.6.0: - resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} - engines: {node: '>=8.6'} - dependencies: - '@sindresorhus/is': 0.14.0 - '@szmarczak/http-timer': 1.1.2 - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.3 - cacheable-request: 6.1.0 - decompress-response: 3.3.0 - duplexer3: 0.1.5 - get-stream: 4.1.0 - lowercase-keys: 1.0.1 - mimic-response: 1.0.1 - p-cancelable: 1.1.0 - to-readable-stream: 1.0.0 - url-parse-lax: 3.0.0 - dev: true - - /graceful-fs@1.2.3: - resolution: {integrity: sha512-iiTUZ5vZ+2ZV+h71XAgwCSu6+NAizhFU3Yw8aC/hH5SQ3SnISqEqAek40imAFGtDcwJKNhXvSY+hzIolnLwcdQ==} - engines: {node: '>=0.4.0'} - deprecated: please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js - dev: false + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} - /graceful-fs@3.0.12: - resolution: {integrity: sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==} - engines: {node: '>=0.4.0'} - dependencies: - natives: 1.1.6 - dev: false + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} - /graceful-fs@4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - dev: true + resolve-options@2.0.0: + resolution: {integrity: sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==} + engines: {node: '>= 10.13.0'} - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + resp-modifier@6.0.2: + resolution: {integrity: sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==} + engines: {node: '>= 0.8.0'} - /group-array@1.0.0: - resolution: {integrity: sha512-PJresALe5TUzSIcdWKLdAKcdUDxv8du2EGueShgAL2xknbcTo5Bk1xbNaNhxpWxxAx/SV7N+5S0UyK7XV0+QhA==} + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} - dependencies: - arr-flatten: 1.1.0 - for-own: 1.0.0 - get-value: 3.0.1 - kind-of: 6.0.3 - split-string: 6.1.0 - union-value: 2.0.1 - dev: false - /gulp-babel@8.0.0(@babel/core@7.24.5): - resolution: {integrity: sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ==} - engines: {node: '>=6'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - plugin-error: 1.0.1 - replace-ext: 1.0.1 - through2: 2.0.5 - vinyl-sourcemaps-apply: 0.2.1 - dev: false + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} - /gulp-clean@0.4.0: - resolution: {integrity: sha512-DARK8rNMo4lHOFLGTiHEJdf19GuoBDHqGUaypz+fOhrvOs3iFO7ntdYtdpNxv+AzSJBx/JfypF0yEj9ks1IStQ==} - engines: {node: '>=0.9'} - dependencies: - fancy-log: 1.3.3 - plugin-error: 0.1.2 - rimraf: 2.7.1 - through2: 2.0.5 - vinyl: 2.2.1 - dev: false + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} - /gulp-cli@2.3.0: - resolution: {integrity: sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==} - engines: {node: '>= 0.10'} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rev-hash@4.1.0: + resolution: {integrity: sha512-e0EGnaveLY2IYpYwHNdh43WZ2M84KgW3Z/T4F6+Z/BlZI/T1ZbxTWj36xgYgUPOieGXYo2q225jTeUXn+LWYjw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + rev-path@3.0.0: + resolution: {integrity: sha512-2fUuv6IC7Z+Vj+DXEunJYJDZuwSsaJJHeLar3n2PGvHSH7j5+Xpd/Xh7PenekH4WQhxFuHtsGwd1dCh/HvT6Gw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rx@4.1.0: + resolution: {integrity: sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass@1.101.0: + resolution: {integrity: sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==} + engines: {node: '>=20.19.0'} hasBin: true - dependencies: - ansi-colors: 1.1.0 - archy: 1.0.0 - array-sort: 1.0.0 - color-support: 1.1.3 - concat-stream: 1.6.2 - copy-props: 2.0.5 - fancy-log: 1.3.3 - gulplog: 1.0.0 - interpret: 1.4.0 - isobject: 3.0.1 - liftoff: 3.1.0 - matchdep: 2.0.0 - mute-stdout: 1.0.1 - pretty-hrtime: 1.0.3 - replace-homedir: 1.0.0 - semver-greatest-satisfied-range: 1.1.0 - v8flags: 3.2.0 - yargs: 7.1.2 - transitivePeerDependencies: - - supports-color - dev: false - /gulp-concat@2.6.1: - resolution: {integrity: sha512-a2scActrQrDBpBbR3WUZGyGS1JEPLg5PZJdIa7/Bi3GuKAmPYDK6SFhy/NZq5R8KsKKFvtfR0fakbUCcKGCCjg==} - engines: {node: '>= 0.10'} - dependencies: - concat-with-sourcemaps: 1.1.0 - through2: 2.0.5 - vinyl: 2.2.1 - dev: false + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} - /gulp-data@1.3.1: - resolution: {integrity: sha512-fvpQJvgVyhkwRcFP3Y9QUS9sWvIFsAlJDinQjhLuknmHZz52jH0gHmTujYBFjr9aTlTHlrAayY5m1d0tA1HzGQ==} - engines: {node: '>=0.9.0', npm: '>=1.2.10'} - dependencies: - plugin-error: 0.1.2 - through2: 2.0.5 - util-extend: 1.0.3 - dev: false + scslre@0.3.0: + resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} + engines: {node: ^14.0.0 || >=16.0.0} - /gulp-empty-pipe@5.0.0: - resolution: {integrity: sha512-NpctMoFcTnX52AsbPRVVn2PtsGwv9WXDeO0q2K37FNQZPMJ86zzU++jHHtHlDiP2O1PWa45/IGpr0pQE0ZmPYw==} - dependencies: - through: 2.3.8 - dev: false + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} - /gulp-favicons@4.0.1: - resolution: {integrity: sha512-MnQds0RulILN40woyVmtfIB0sCYLsmkYlMyd90aLsmZtyrtWQH3552vzlIj6FQ38MR291XoDNqctIQ4xX0j+hA==} - engines: {node: '>=16.14.0'} - dependencies: - favicons: 7.2.0 - multipipe: 4.0.0 - vinyl: 3.0.0 - dev: false + semver-greatest-satisfied-range@2.0.0: + resolution: {integrity: sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g==} + engines: {node: '>= 10.13.0'} - /gulp-google-webfonts@4.1.0: - resolution: {integrity: sha512-LjmhiEgIoMTdPp68K8xhWHMVoE1hrgiEmTMWp23F/DGnKxalTP4CUqfksm73ZRqcEvqFD7hrJ/CQdSPCyIgHqQ==} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - dependencies: - async: 0.9.2 - commander: 2.20.3 - lodash.defaults: 3.1.2 - mkdirp: 0.5.6 - through2: 0.6.5 - vinyl: 2.2.1 - dev: false - /gulp-html-beautify@1.0.1: - resolution: {integrity: sha512-XbWWDcPQGvdBttEpuhNwBbOpOTR8l+K7/pJLKDLPcdZDCqo+sWvXTUqgYGFJu2Ax1sIiN9uvoM4fwJjgeRtZxQ==} - dependencies: - js-beautify: 1.15.1 - rcloader: 0.1.4 - through2: 2.0.5 - dev: false + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true - /gulp-htmlmin@5.0.1: - resolution: {integrity: sha512-ASlyDPZOSKjHYUifYV0rf9JPDflN9IRIb8lw2vRqtYMC4ljU3zAmnnaVXwFQ3H+CfXxZSUesZ2x7jrnPJu93jA==} - engines: {node: '>= 6.0'} - dependencies: - html-minifier: 3.5.21 - plugin-error: 1.0.1 - through2: 2.0.5 - dev: false + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} - /gulp-if@3.0.0: - resolution: {integrity: sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw==} - dependencies: - gulp-match: 1.1.0 - ternary-stream: 3.0.0 - through2: 3.0.2 - dev: false + serve-index@1.9.2: + resolution: {integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==} + engines: {node: '>= 0.8.0'} - /gulp-imagemin@9.1.0(gulp@4.0.2): - resolution: {integrity: sha512-PmzTWoNrVMYVN4ObRdHyt6oer4mqxV53IbCDi3Q8EHeDZW0OzAuh6RlOtpd/R7PFmbDUk64q5P+L04fD9I5cVA==} - engines: {node: '>=18'} - peerDependencies: - gulp: '>=4' - peerDependenciesMeta: - gulp: - optional: true - dependencies: - chalk: 5.3.0 - gulp: 4.0.2 - gulp-plugin-extras: 1.0.0 - imagemin: 9.0.0 - plur: 5.1.0 - pretty-bytes: 6.1.1 - optionalDependencies: - imagemin-gifsicle: 7.0.0 - imagemin-mozjpeg: 10.0.0 - imagemin-optipng: 8.0.0 - imagemin-svgo: 10.0.1 - dev: false + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} - /gulp-inject@5.0.5: - resolution: {integrity: sha512-5bGMjqleXUHPu4CI1pnVzHtwyMy+Zt8EMo1RFwNsOpidPxwjFwyLgmsRZWGMMI8UenJMJRjURqwznfFmqb5wgw==} + server-destroy@1.0.1: + resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} + + set-value@3.0.3: + resolution: {integrity: sha512-Xsn/XSatoVOGBbp5hs3UylFDs5Bi9i+ArpVJKdHPniZHoEgRniXTqHWrWrGQ0PbEClVT6WtfnBwR8CAHC9sveg==} + engines: {node: '>=6.0'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sharp@0.35.2: + resolution: {integrity: sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==} + engines: {node: '>=20.9.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - dependencies: - ansi-colors: 4.1.3 - arrify: 2.0.1 - escape-string-regexp: 2.0.0 - fancy-log: 1.3.3 - group-array: 1.0.0 - plugin-error: 1.0.1 - stream-to-array: 2.3.0 - through2: 3.0.2 - dev: false - /gulp-jsbeautifier@3.0.1: - resolution: {integrity: sha512-zSXsXQy0/s6qjhhtTun+/ZfC/q8cz/fZpZmxoGPKpmxjuP7/F+oGpV/LHqtOAaWNo+WjcxLVey0cFoNrPZiHWg==} - engines: {node: '>=4'} - dependencies: - ansi-colors: 4.1.3 - cosmiconfig: 5.2.1 - fancy-log: 1.3.3 - js-beautify: 1.15.1 - lodash.mergewith: 4.6.2 - plugin-error: 1.0.1 - through2: 3.0.2 - dev: false + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} - /gulp-json-editor@2.6.0: - resolution: {integrity: sha512-Ni0ZUpNrhesHiTlHQth/Nv1rXCn0LUicEvzA5XuGy186C4PVeNoRjfuAIQrbmt3scKv8dgGbCs0hd77ScTw7hA==} - dependencies: - deepmerge: 4.3.1 - detect-indent: 6.1.0 - js-beautify: 1.15.1 - plugin-error: 2.0.1 - through2: 4.0.2 - dev: false + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - /gulp-markdown-to-json@1.1.0: - resolution: {integrity: sha512-TklAN9m6Ug/gS/W391cDoOmpesmWPoZXSPdcbwe3FABZ3mf9fl0JRDkmlQH+cg0RNpQtsVaDM5I94q5KfMrOhg==} - engines: {node: '>=4.4.7'} - dependencies: - expand-hash: 0.2.2 - front-matter: 2.3.0 - istextorbinary: 2.6.0 - list-stream: 1.0.1 - lodash.assign: 4.2.0 - plugin-error: 1.0.1 - sort-object: 0.0.6 - through2: 2.0.5 - util-extend: 1.0.3 - vinyl: 2.2.1 - dev: false + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} - /gulp-match@1.1.0: - resolution: {integrity: sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==} - dependencies: - minimatch: 3.1.2 - dev: false + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - /gulp-newer@1.4.0: - resolution: {integrity: sha512-h79fGO55S/P9eAADbLAP9aTtVYpLSR1ONj08VPaSdVVNVYhTS8p1CO1TW7kEMu+hC+sytmCqcUr5LesvZEtDoQ==} - dependencies: - glob: 7.2.3 - kew: 0.7.0 - plugin-error: 0.1.2 - dev: false + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} - /gulp-nunjucks-render@2.2.3: - resolution: {integrity: sha512-YHrmwiwPw2DN16WJVj8S2tgUanB1ssZE8e5rRF6rH1T41mhO7r59iAqw92Yz5WSZXYB9G+uYXDTCODgixYPIRw==} - engines: {node: '>=0.10.0'} - dependencies: - lodash: 4.17.21 - nunjucks: 3.2.4 - plugin-error: 1.0.1 - replace-ext: 1.0.1 - through2: 2.0.5 - transitivePeerDependencies: - - chokidar - dev: false + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} - /gulp-plugin-extras@1.0.0: - resolution: {integrity: sha512-YXizWkBgb2030JBuHZ9DQFTkphnKgzwknL+ozSoCKdv8Zt1S8EpVAPo+MwGxqSsd/DtFFM+kThZe6UJvM5DFsw==} + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} - dependencies: - '@types/vinyl': 2.0.12 - chalk: 5.3.0 - easy-transform-stream: 1.0.1 - dev: false - /gulp-plumber@1.2.1: - resolution: {integrity: sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ==} - engines: {node: '>=0.10', npm: '>=1.2.10'} - dependencies: - chalk: 1.1.3 - fancy-log: 1.3.3 - plugin-error: 0.1.2 - through2: 2.0.5 - dev: false + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} - /gulp-postcss@10.0.0(postcss@8.4.38): - resolution: {integrity: sha512-z1RF2RJEX/BvFsKN11PXai8lRmihZTiHnlJf7Zu8uHaA/Q7Om4IeN8z1NtMAW5OiLwUY02H0DIFl9tHl0CNSgA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - fancy-log: 2.0.0 - plugin-error: 2.0.1 - postcss: 8.4.38 - postcss-load-config: 5.1.0(postcss@8.4.38) - vinyl-sourcemaps-apply: 0.2.1 - transitivePeerDependencies: - - jiti - - tsx - dev: false + sliced@1.0.1: + resolution: {integrity: sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==} + deprecated: Unsupported - /gulp-purgecss@6.0.0: - resolution: {integrity: sha512-NZS8GQ8Yga/exoI0Coq6VOvjP5DL13NwcFc6K70zIWM3ZVsyr4KgoepeYaOqH5gOCMv7vbzX0q4TeCNmi1687w==} - dependencies: - glob: 10.3.15 - plugin-error: 2.0.1 - purgecss: 6.0.0 - through2: 4.0.2 - vinyl-sourcemaps-apply: 0.2.1 - dev: false + socket.io-adapter@2.5.8: + resolution: {integrity: sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw==} + + socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.6: + resolution: {integrity: sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==} + engines: {node: '>=10.0.0'} - /gulp-rename@2.0.0: - resolution: {integrity: sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==} - engines: {node: '>=4'} - dev: false + socket.io@4.8.3: + resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} + engines: {node: '>=10.2.0'} - /gulp-replace@1.1.4: - resolution: {integrity: sha512-SVSF7ikuWKhpAW4l4wapAqPPSToJoiNKsbDoUnRrSgwZHH7lH8pbPeQj1aOVYQrbZKhfSVBxVW+Py7vtulRktw==} - engines: {node: '>=10'} - dependencies: - '@types/node': 20.12.12 - '@types/vinyl': 2.0.12 - istextorbinary: 3.3.0 - replacestream: 4.0.3 - yargs-parser: 21.1.1 - dev: false + sort-keys@6.0.1: + resolution: {integrity: sha512-w7xWRu8U9MneKNna8ptG194jp9PLtbd/Rl6gwrmbK4yUeKbE66a64rHgl0iKTBBDr/hpanx7zMGP1Qo8MRkc/w==} + engines: {node: '>=20'} - /gulp-rev-delete-original@0.2.3: - resolution: {integrity: sha512-x1iXZdtnpu7xubu73+joDv0SvdiFyuEMDjmoCAy0LYsdc/4llWpR/X0yAhlP61+cw3cI9evezevFnmClgXHZRQ==} - dependencies: - rimraf: 2.7.1 - through2: 0.6.5 - dev: false + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} - /gulp-rev-replace@0.4.4: - resolution: {integrity: sha512-2yiDel/TGamn/HgHyo8H1rYEEL2zLsOYODerItoX8batOo0gPAe7uX7t6NlaqB7FEHpS5tGzUr5CKUEmrgdHyQ==} + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} - dependencies: - plugin-error: 0.1.2 - through2: 2.0.5 - dev: false - /gulp-rev-rewrite@5.0.0: - resolution: {integrity: sha512-uB9hOCAFspiBP4V2FDu/xRwuTVPle/6qC9OuDuYds8Vno2cqSf9P4Xmm3lUHJVa9NrsE9Rdo9cY3UEuwsrX5ww==} - engines: {node: '>=12'} - dependencies: - lodash.escaperegexp: 4.1.2 - plugin-error: 1.0.1 - through2: 4.0.2 - dev: false + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} - /gulp-rev@10.0.0(gulp@4.0.2): - resolution: {integrity: sha512-5mP6oOGp1DUzBQuiy9IrtyAWHWUOz2n1qLUHfo7LU0p111t7sTkUhKW01b70B2MsDWgScTdz6sGLg76KCbqclw==} - engines: {node: '>=16'} - peerDependencies: - gulp: '>=4' - peerDependenciesMeta: - gulp: - optional: true - dependencies: - easy-transform-stream: 1.0.1 - gulp: 4.0.2 - modify-filename: 2.0.0 - plugin-error: 2.0.1 - rev-hash: 4.1.0 - rev-path: 3.0.0 - sort-keys: 5.0.0 - vinyl: 3.0.0 - vinyl-file: 5.0.0 - dev: false + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - /gulp-sass-glob@1.1.0: - resolution: {integrity: sha512-BYDCjb68iMAxLGt2uuw7jaZ51cnWxAbQ4EtFDOOsMXOc0Ul+SFW1iiMOSI/efpO27ycmX9U8Eb4Clerww5Tf5Q==} - dependencies: - glob: 7.2.3 - minimatch: 3.1.2 - slash: 3.0.0 - through2: 3.0.2 - dev: false + sparkles@2.1.0: + resolution: {integrity: sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==} + engines: {node: '>= 10.13.0'} - /gulp-sass@5.1.0: - resolution: {integrity: sha512-7VT0uaF+VZCmkNBglfe1b34bxn/AfcssquLKVDYnCDJ3xNBaW7cUuI3p3BQmoKcoKFrs9jdzUxyb+u+NGfL4OQ==} - engines: {node: '>=12'} - dependencies: - lodash.clonedeep: 4.5.0 - picocolors: 1.0.1 - plugin-error: 1.0.1 - replace-ext: 2.0.0 - strip-ansi: 6.0.1 - vinyl-sourcemaps-apply: 0.2.1 - dev: false + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - /gulp-sri-hash@2.2.1: - resolution: {integrity: sha512-nPcrs3lUBKZeC6E2Fi0Qz8WzP4hUlX3qraTfpCcKNJ49QpchBMu73xFRYtXqXBvhJPwDcIswAQQuVi6NhKh5JQ==} - engines: {node: '>= 8.x', npm: '>= 6.x'} - dependencies: - cheerio: 1.0.0-rc.12 - plugin-error: 1.0.1 - through2: 3.0.2 - dev: false + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - /gulp-todo@7.1.1: - resolution: {integrity: sha512-aM9HFU0PdMXZld/As4fGA5DcpneNoQiHXVPLlhm5xRQpvLTeTyDRuFWQOdokEoDdvquPjD2bTD40Yol4DNqN3Q==} - engines: {node: '>=6.0.0'} - dependencies: - ansi-colors: 3.2.4 - fancy-log: 1.3.3 - leasot: 7.5.0 - lodash.defaults: 4.2.0 - plugin-error: 1.0.1 - through2: 3.0.2 - vinyl: 2.2.1 - transitivePeerDependencies: - - supports-color - dev: false + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - /gulp-uglify@3.0.2: - resolution: {integrity: sha512-gk1dhB74AkV2kzqPMQBLA3jPoIAPd/nlNzP2XMDSG8XZrqnlCiDGAqC+rZOumzFvB5zOphlFh6yr3lgcAb/OOg==} - dependencies: - array-each: 1.0.1 - extend-shallow: 3.0.2 - gulplog: 1.0.0 - has-gulplog: 0.1.0 - isobject: 3.0.1 - make-error-cause: 1.2.2 - safe-buffer: 5.2.1 - through2: 2.0.5 - uglify-js: 3.17.4 - vinyl-sourcemaps-apply: 0.2.1 - dev: false + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - /gulp-upng@1.0.3: - resolution: {integrity: sha512-zrDxz3etKrU88mZkQimaK3AmzOulnJmqZzYkANFo9nRIkcxj5362KKEpuWYpD9brsbEKgHMO+rzBcl5jbLjTUQ==} - dependencies: - gulp: 3.9.1 - gulp-util: 3.0.8 - through2: 2.0.5 - upng-js: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - /gulp-util@3.0.8: - resolution: {integrity: sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==} - engines: {node: '>=0.10'} - deprecated: gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5 - dependencies: - array-differ: 1.0.0 - array-uniq: 1.0.3 - beeper: 1.1.1 - chalk: 1.1.3 - dateformat: 2.2.0 - fancy-log: 1.3.3 - gulplog: 1.0.0 - has-gulplog: 0.1.0 - lodash._reescape: 3.0.0 - lodash._reevaluate: 3.0.0 - lodash._reinterpolate: 3.0.0 - lodash.template: 3.6.2 - minimist: 1.2.8 - multipipe: 0.1.2 - object-assign: 3.0.0 - replace-ext: 0.0.1 - through2: 2.0.5 - vinyl: 0.5.3 - dev: false + split-string@6.1.0: + resolution: {integrity: sha512-9UBdnmnvx2NLLd4bMs7CEKK+wSzbujVv3ONyorkP1o8M3pVJQtXDO1cN19xD1JJs6ltOrtPrkUND0HzLSinUcA==} + engines: {node: '>=8.6'} - /gulp@3.9.1: - resolution: {integrity: sha512-6FHNdR+VG1LcPz6gZGGqgvimWWGtl4x3FvshAdK/UnAjU7aFOyzft3Fjp35r0Y3ZF4u8vND0S4nGsIB/sxTqzQ==} - engines: {node: '>= 0.9'} - hasBin: true - dependencies: - deprecated: 0.0.1 - archy: 1.0.0 - chalk: 1.1.3 - gulp-util: 3.0.8 - interpret: 1.4.0 - liftoff: 2.5.0 - minimist: 1.2.8 - orchestrator: 0.3.8 - pretty-hrtime: 1.0.3 - semver: 4.3.6 - tildify: 1.2.0 - v8flags: 2.1.1 - vinyl-fs: 0.3.14 - transitivePeerDependencies: - - supports-color - dev: false + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - /gulp@4.0.2: - resolution: {integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==} - engines: {node: '>= 0.10'} - hasBin: true - dependencies: - glob-watcher: 5.0.5 - gulp-cli: 2.3.0 - undertaker: 1.3.0 - vinyl-fs: 3.0.3 - transitivePeerDependencies: - - supports-color - dev: false + srcset@5.0.3: + resolution: {integrity: sha512-AZswtOXIsu0LeHdo6YY7d0r2pCH2Rl1D8ae1utvXUX4GxG3RggsVUAOFX1r8RI4YHFMYb4g89+UBPBv3mNUU2g==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /gulplog@1.0.0: - resolution: {integrity: sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==} - engines: {node: '>= 0.10'} - dependencies: - glogg: 1.0.2 - dev: false + statuses@1.3.1: + resolution: {integrity: sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==} + engines: {node: '>= 0.6'} - /handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.17.4 - dev: true + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} - /has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: false + stream-composer@1.0.2: + resolution: {integrity: sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + stream-exhaust@1.0.2: + resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + stream-throttle@0.1.3: + resolution: {integrity: sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==} + engines: {node: '>= 0.10.0'} + hasBin: true - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} - /has-gulplog@0.1.0: - resolution: {integrity: sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==} - engines: {node: '>= 0.10'} - dependencies: - sparkles: 1.0.1 - dev: false + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - dependencies: - es-define-property: 1.0.0 + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} - /has-symbol-support-x@1.4.2: - resolution: {integrity: sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==} - dev: false + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} - /has-to-string-tag-x@1.4.1: - resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==} - dependencies: - has-symbol-support-x: 1.4.2 - dev: false + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true + string-width@8.2.1: + resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} + engines: {node: '>=20'} - /has-value@0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} - dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 - dev: false + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - /has-value@1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} - dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - dev: false + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - /has-values@0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} - dev: false + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - /has-values@1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 - dev: false + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: false + strip-bom-buf@3.0.1: + resolution: {integrity: sha512-iJaWw2WroigLHzQysdc5WWeUc99p7ea7AEgB6JkY8CMyiO1yTVAA1gIlJJgORElUIR+lcZJkNl1OGChMhvc2Cw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + strip-bom-stream@5.0.0: + resolution: {integrity: sha512-Yo472mU+3smhzqeKlIxClre4s4pwtYZEvDNQvY/sJpnChdaxmKuwU28UVx/v1ORKNMxkmj1GBuvxJQyBk6wYMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} - dependencies: - parse-passwd: 1.0.0 - dev: false - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + stylehacks@8.0.1: + resolution: {integrity: sha512-Gv095oTD0N+BdJALNFDsxZpETHZLTxbOl5RyIO7y6VAE6sR3z0MnV3Nix7N0IATNldNTrkvSASp2KR1Yt526HA==} + engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} + peerDependencies: + postcss: ^8.5.15 - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true + stylelint-config-recommended-scss@14.1.0: + resolution: {integrity: sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==} + engines: {node: '>=18.12.0'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^16.6.1 + peerDependenciesMeta: + postcss: + optional: true - /hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - lru-cache: 10.2.2 - dev: true + stylelint-config-recommended-scss@17.0.1: + resolution: {integrity: sha512-x5DVehzJudcwF0od3sGpgkln2PLLranFE7twwbp7dqDINCyZvwzFkMc6TLhNOvazRiVBJYATQLouJY0xPGB8WA==} + engines: {node: '>=20'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^17.0.0 + peerDependenciesMeta: + postcss: + optional: true - /html-minifier@3.5.21: - resolution: {integrity: sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==} - engines: {node: '>=4'} - hasBin: true - dependencies: - camel-case: 3.0.0 - clean-css: 4.2.4 - commander: 2.17.1 - he: 1.2.0 - param-case: 2.1.1 - relateurl: 0.2.7 - uglify-js: 3.4.10 - dev: false - - /html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - dev: true + stylelint-config-recommended@14.0.1: + resolution: {integrity: sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 - /html-validate@8.18.2: - resolution: {integrity: sha512-X/ahjDnTZe1VjoPz+w7zGe5I5/os8PLQ+c5C9ak6etV0nNK9gPbwbGaP9BQoSQuQx0mszw5khDjP1ffnXx+1OA==} - engines: {node: '>= 16.14'} - hasBin: true + stylelint-config-recommended@18.0.0: + resolution: {integrity: sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==} + engines: {node: '>=20.19.0'} + peerDependencies: + stylelint: ^17.0.0 + + stylelint-config-standard-scss@13.1.0: + resolution: {integrity: sha512-Eo5w7/XvwGHWkeGLtdm2FZLOMYoZl1omP2/jgFCXyl2x5yNz7/8vv4Tj6slHvMSSUNTaGoam/GAZ0ZhukvalfA==} + engines: {node: '>=18.12.0'} peerDependencies: - jest: ^27.1 || ^28.1.3 || ^29.0.3 - jest-diff: ^27.1 || ^28.1.3 || ^29.0.3 - jest-snapshot: ^27.1 || ^28.1.3 || ^29.0.3 - vitest: ^0.34 || ^1 + postcss: ^8.3.3 + stylelint: ^16.3.1 peerDependenciesMeta: - jest: - optional: true - jest-diff: - optional: true - jest-snapshot: + postcss: optional: true - vitest: + + stylelint-config-standard-scss@17.0.0: + resolution: {integrity: sha512-uLJS6xgOCBw5EMsDW7Ukji8l28qRoMnkRch15s0qwZpskXvWt9oPzMmcYM307m9GN4MxuWLsQh4I6hU9yI53cQ==} + engines: {node: '>=20'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^17.0.0 + peerDependenciesMeta: + postcss: optional: true - dependencies: - '@babel/code-frame': 7.24.2 - '@html-validate/stylish': 4.2.0 - '@sidvind/better-ajv-errors': 2.1.3(ajv@8.13.0) - ajv: 8.13.0 - deepmerge: 4.3.1 - glob: 10.3.15 - ignore: 5.3.1 - kleur: 4.1.5 - minimist: 1.2.8 - prompts: 2.4.2 - semver: 7.6.2 - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - dev: false + stylelint-config-standard@36.0.1: + resolution: {integrity: sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 - /http-cache-semantics@3.8.1: - resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==} - dev: false + stylelint-config-standard@40.0.0: + resolution: {integrity: sha512-EznGJxOUhtWck2r6dJpbgAdPATIzvpLdK9+i5qPd4Lx70es66TkBPljSg4wN3Qnc6c4h2n+WbUrUynQ3fanjHw==} + engines: {node: '>=20.19.0'} + peerDependencies: + stylelint: ^17.0.0 - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true + stylelint-high-performance-animation@2.0.0: + resolution: {integrity: sha512-wzxxfxJFyL7UKc91427EHmi6gNRXB0cBdsyCfIuXZFRb6Xv1qw8elNbF61e/tJRoRcavAGsZICivVsHCD3Mhug==} + peerDependencies: + stylelint: ^17.0.0 - /http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.4.0 - dev: false + stylelint-order@6.0.4: + resolution: {integrity: sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==} + peerDependencies: + stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: false + stylelint-scss@6.14.0: + resolution: {integrity: sha512-ZKmHMZolxeuYsnB+PCYrTpFce0/QWX9i9gh0hPXzp73WjuIMqUpzdQaBCrKoLWh6XtCFSaNDErkMPqdjy1/8aA==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.8.2 - /http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.1 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true + stylelint-scss@7.2.0: + resolution: {integrity: sha512-6E79Bachv0Iz0gqRUZgdqdXCsiq26DWBWIBNHYtjTmAp3wJu6cp/I37VfW7BPntmh2puF3bY09XWl4HZGrLhzw==} + engines: {node: '>=20.19.0'} + peerDependencies: + stylelint: ^16.8.2 || ^17.0.0 - /http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.6 - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - dev: false + stylelint-selector-bem-pattern@5.0.0: + resolution: {integrity: sha512-nXcfLw2mZkNCyTLYPESavGLfWhY1RrjzsjVufbpKsMTH65WeOYGwouB3yqyV8l4WtKMVniz29LlELJcJ0d660A==} + engines: {node: '>=24.13.0'} + peerDependencies: + stylelint: ^17.0.0 - /http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - dev: true + stylelint@17.14.0: + resolution: {integrity: sha512-8xkHPpdqYryeIsOgfsYTmr6cIeC4nLYWk5S8BPxpodq8mIuepggkMljsHewWfuAjj/+qpRKou2QerhjMH3iasg==} + engines: {node: '>=20.19.0'} + hasBin: true - /https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.1 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + supports-hyperlinks@4.5.0: + resolution: {integrity: sha512-ZW2OvfeCXrNTbLakPUzjQG922EeGCOteFSVoek5DKStTh898wf7zgtuFlzQN8HfZCxC3Eh02yJVrRW51hADf+w==} + engines: {node: '>=20'} - /human-signals@3.0.1: - resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} - engines: {node: '>=12.20.0'} - dev: false + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true + sver@1.8.4: + resolution: {integrity: sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA==} - /husky@9.0.11: - resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} - engines: {node: '>=18'} - hasBin: true - dev: true + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 + svgo@4.0.1: + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} + engines: {node: '>=16'} + hasBin: true - /identifier-regex@1.0.0: - resolution: {integrity: sha512-Rcy5cjBOM9iTR+Vwy0Llyip9u0cA99T1yiWOhDW/+PDaTQhyski0tMovsipQ/FRNDkudjLWusJ/IMVIlG5WZnQ==} - engines: {node: '>=18'} - dependencies: - reserved-identifiers: 1.0.0 - dev: false + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - /ignore@4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} - engines: {node: '>= 4'} - dev: false + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - /imagemin-gifsicle@7.0.0: - resolution: {integrity: sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA==} - engines: {node: '>=10'} - requiresBuild: true - dependencies: - execa: 1.0.0 - gifsicle: 5.3.0 - is-gif: 3.0.0 - dev: false - optional: true + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - /imagemin-mozjpeg@10.0.0: - resolution: {integrity: sha512-DK85QNOjS3/GzWYfNB3CACMZD10sIQgFDv1+WTOnZljgltQTEyATjdyUVyjKu5q4sCESQdwvwq7WEZzJ5fFjlg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - execa: 6.1.0 - is-jpg: 3.0.0 - mozjpeg: 8.0.0 - dev: false + through2@3.0.2: + resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} - /imagemin-optipng@8.0.0: - resolution: {integrity: sha512-CUGfhfwqlPjAC0rm8Fy+R2DJDBGjzy2SkfyT09L8rasnF9jSoHFqJ1xxSZWK6HVPZBMhGPMxCTL70OgTHlLF5A==} - engines: {node: '>=10'} - requiresBuild: true - dependencies: - exec-buffer: 3.2.0 - is-png: 2.0.0 - optipng-bin: 7.0.1 - dev: false - optional: true + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - /imagemin-svgo@10.0.1: - resolution: {integrity: sha512-v27/UTGkb3vrm5jvjsMGQ2oxaDfSOTBfJOgmFO2fYepx05bY1IqWCK13aDytVR+l9w9eOlq0NMCLbxJlghYb2g==} - engines: {node: '>=12.20'} - requiresBuild: true - dependencies: - is-svg: 4.4.0 - svgo: 2.8.0 - dev: false - optional: true + time-stamp@1.1.0: + resolution: {integrity: sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==} + engines: {node: '>=0.10.0'} - /imagemin@9.0.0: - resolution: {integrity: sha512-oFlmioXTIrDCNYiKUVPjzUzm8M/7X74WEO6v8NFjn3ZtxjArdVJiRRdbPpq/OG4BdwaHMUz8ej9Fp4AcaDzMnA==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} - dependencies: - change-file-extension: 0.1.1 - environment: 1.1.0 - file-type: 19.0.0 - globby: 14.0.1 - junk: 4.0.1 - ow: 2.0.0 - p-pipe: 4.0.0 - slash: 5.1.0 - uint8array-extras: 1.1.0 - dev: false - /immutable@3.8.2: - resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==} - engines: {node: '>=0.10.0'} - dev: false + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} - /immutable@4.3.6: - resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} - dev: false + title-case@4.3.2: + resolution: {integrity: sha512-I/nkcBo73mO42Idfv08jhInV61IMb61OdIFxk+B4Gu1oBjWBPOLmhZdsli+oJCVaD+86pYQA93cJfFt224ZFAA==} - /import-fresh@2.0.0: - resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} - engines: {node: '>=4'} - dependencies: - caller-path: 2.0.0 - resolve-from: 3.0.0 - dev: false + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true + to-through@3.0.0: + resolution: {integrity: sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==} + engines: {node: '>=10.13.0'} - /import-lazy@3.1.0: - resolution: {integrity: sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==} - engines: {node: '>=6'} - dev: false + to-valid-identifier@1.0.0: + resolution: {integrity: sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==} + engines: {node: '>=20'} - /import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - dev: true + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} - /import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - dev: true + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} - /inherits@1.0.2: - resolution: {integrity: sha512-Al67oatbRSo3RV5hRqIoln6Y5yMVbJSIn4jEJNL7VCImzq/kLr7vvb6sFRJXqr8rpHc/2kJOM+y0sPKN47VdzA==} - dev: false + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: false + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} + hasBin: true - /ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - dev: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - /ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true - /ini@4.1.2: - resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} - /inquirer@9.2.19: - resolution: {integrity: sha512-WpxOT71HGsFya6/mj5PUue0sWwbpbiPfAR+332zLj/siB0QA1PZM8v3GepegFV1Op189UxHUCF6y8AySdtOMVA==} - engines: {node: '>=18'} - dependencies: - '@inquirer/figures': 1.0.1 - '@ljharb/through': 2.3.13 - ansi-escapes: 4.3.2 - chalk: 5.3.0 - cli-cursor: 3.1.0 - cli-width: 4.1.0 - external-editor: 3.1.0 - lodash: 4.17.21 - mute-stream: 1.0.0 - ora: 5.4.1 - run-async: 3.0.0 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: true + undertaker-registry@2.0.0: + resolution: {integrity: sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew==} + engines: {node: '>= 10.13.0'} - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - dev: true + undertaker@2.0.0: + resolution: {integrity: sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ==} + engines: {node: '>=10.13.0'} - /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - /into-stream@3.1.0: - resolution: {integrity: sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==} - engines: {node: '>=4'} - dependencies: - from2: 2.3.0 - p-is-promise: 1.1.0 - dev: false + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} - /invert-kv@1.0.0: - resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} - engines: {node: '>=0.10.0'} - dev: false + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + engines: {node: '>=20.18.1'} - /ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - dev: true + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} - /ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} - dev: true + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} - /irregular-plurals@3.5.0: - resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} - engines: {node: '>=8'} - dev: false + unified-args@11.0.1: + resolution: {integrity: sha512-WEQghE91+0s3xPVs0YW6a5zUduNLjmANswX7YbBfksHNDGMjHxaWCql4SR7c9q0yov/XiIEdk6r/LqfPjaYGcw==} - /is-absolute-url@2.1.0: - resolution: {integrity: sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==} - engines: {node: '>=0.10.0'} - dev: true + unified-engine@11.2.2: + resolution: {integrity: sha512-15g/gWE7qQl9tQ3nAEbMd5h9HV1EACtFs6N9xaRBZICoCwnNGbal1kOs++ICf4aiTdItZxU2s/kYWhW7htlqJg==} - /is-absolute@1.0.0: - resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} - engines: {node: '>=0.10.0'} - dependencies: - is-relative: 1.0.0 - is-windows: 1.0.2 - dev: false + unified-lint-rule@1.0.6: + resolution: {integrity: sha512-YPK15YBFwnsVorDFG/u0cVVQN5G2a3V8zv5/N6KN3TCG+ajKtaALcy7u14DCSrJI+gZeyYquFL9cioJXOGXSvg==} - /is-accessor-descriptor@1.0.1: - resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} - engines: {node: '>= 0.10'} - dependencies: - hasown: 2.0.2 - dev: false + unified-lint-rule@3.0.1: + resolution: {integrity: sha512-HxIeQOmwL19DGsxHXbeyzKHBsoSCFO7UtRVUvT2v61ptw/G+GbysWcrpHdfs5jqbIFDA11MoKngIhQK0BeTVjA==} - /is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - dev: true + unified-message-control@5.0.0: + resolution: {integrity: sha512-B2cSAkpuMVVmPP90KCfKdBhm1e9KYJ+zK3x5BCa0N65zpq1Ybkc9C77+M5qwR8FWO7RF3LM5QRRPZtgjW6DUCw==} - /is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - dev: true + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: true + union-value@2.0.1: + resolution: {integrity: sha512-NmcRHHhUy1qWmp6yYWsaURV2qwfS24TmTtO9S9x0L41wCNNVBQFD3toOzO0cd8SsNrFhbw/O0iYO5uffXGYocw==} + engines: {node: '>=6'} - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - dev: true + unist-util-inspect@8.1.0: + resolution: {integrity: sha512-mOlg8Mp33pR0eeFpo5d2902ojqFFOKMMG2hF8bmH7ZlhnmjFgh0NI3/ZDwdaBJNbvrS7LZFVrBVtIE9KZ9s7vQ==} - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + unist-util-is@3.0.0: + resolution: {integrity: sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==} - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: false + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - /is-binary-path@1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} - engines: {node: '>=0.10.0'} - dependencies: - binary-extensions: 1.13.1 - dev: false + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.3.0 + unist-util-visit-parents@2.1.2: + resolution: {integrity: sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==} - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: true + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@1.4.1: + resolution: {integrity: sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==} - /is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: false + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - dependencies: - builtin-modules: 3.3.0 - dev: true + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} - /is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true - dependencies: - ci-info: 3.9.0 - dev: true + peerDependencies: + browserslist: '>= 4.21.0' - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.2 + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - /is-data-descriptor@1.0.1: - resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} - engines: {node: '>= 0.4'} - dependencies: - hasown: 2.0.2 - dev: false + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - dependencies: - is-typed-array: 1.1.13 - dev: true + util-extend@1.0.3: + resolution: {integrity: sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==} - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: true + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} - /is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - dev: true + v8flags@4.0.1: + resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==} + engines: {node: '>= 10.13.0'} - /is-descriptor@0.1.7: - resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} - engines: {node: '>= 0.4'} - dependencies: - is-accessor-descriptor: 1.0.1 - is-data-descriptor: 1.0.1 - dev: false + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - /is-descriptor@1.0.3: - resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} - engines: {node: '>= 0.4'} - dependencies: - is-accessor-descriptor: 1.0.1 - is-data-descriptor: 1.0.1 - dev: false + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - /is-directory@0.3.1: - resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} - engines: {node: '>=0.10.0'} - dev: false + value-or-function@4.0.0: + resolution: {integrity: sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==} + engines: {node: '>= 10.13.0'} - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: true + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} - /is-empty@1.2.0: - resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} - dev: true + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: false + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} - /is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - dependencies: - is-plain-object: 2.0.4 - dev: false + vfile-reporter@8.1.1: + resolution: {integrity: sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + vfile-sort@4.0.0: + resolution: {integrity: sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==} - /is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} - dependencies: - number-is-nan: 1.0.1 - dev: false + vfile-statistics@3.0.0: + resolution: {integrity: sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true + vinyl-contents@2.0.0: + resolution: {integrity: sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==} + engines: {node: '>=10.13.0'} - /is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} - dependencies: - get-east-asian-width: 1.2.0 - dev: true + vinyl-file@5.0.0: + resolution: {integrity: sha512-MvkPF/yA1EX7c6p+juVIvp9+Lxp70YUfNKzEWeHMKpUNVSnTZh2coaOqLxI0pmOe2V9nB+OkgFaMDkodaJUyGw==} + engines: {node: '>=14.16'} - /is-gif@3.0.0: - resolution: {integrity: sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==} - engines: {node: '>=6'} - requiresBuild: true - dependencies: - file-type: 10.11.0 - dev: false - optional: true + vinyl-fs@4.0.2: + resolution: {integrity: sha512-XRFwBLLTl8lRAOYiBqxY279wY46tVxLaRhSwo3GzKEuLz1giffsOquWWboD/haGf5lx+JyTigCFfe7DWHoARIA==} + engines: {node: '>=10.13.0'} - /is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: false + vinyl-sourcemap@2.0.0: + resolution: {integrity: sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==} + engines: {node: '>=10.13.0'} - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 + vinyl-sourcemaps-apply@0.2.1: + resolution: {integrity: sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==} - /is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - dev: true + vinyl@3.0.1: + resolution: {integrity: sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==} + engines: {node: '>=10.13.0'} + + walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - /is-identifier@1.0.0: - resolution: {integrity: sha512-DKRLe7IyxafGKlI6VdPnarF/nZNfvlNJmYAzRVsN2TBJk93qnw6XXvslQ8Nv7MngoMByoyI6tMzSI3M1y/pBKw==} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} - dependencies: - identifier-regex: 1.0.0 - super-regex: 1.0.0 - dev: false + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - /is-in-ci@0.1.0: - resolution: {integrity: sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==} + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true - dev: true - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true - dependencies: - is-docker: 3.0.0 - dev: true - /is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} - dependencies: - global-dirs: 3.0.1 - is-path-inside: 3.0.3 - dev: true + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} - /is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - dev: true + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@10.0.0: + resolution: {integrity: sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==} + engines: {node: '>=20'} - /is-ip@3.1.0: - resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} - dependencies: - ip-regex: 4.3.0 - dev: true - /is-jpg@3.0.0: - resolution: {integrity: sha512-Vcd67KWHZblEKEBrtP25qLZ8wN9ICoAhl1pKUqD7SM7hf2qtuRl7loDgP5Zigh2oN/+7uj+KVyC0eRJvgOEFeQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - dev: true + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} - /is-natural-number@4.0.1: - resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} - dev: false + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} - /is-negated-glob@1.0.0: - resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} - engines: {node: '>=0.10.0'} - dev: false + wrapped@1.0.1: + resolution: {integrity: sha512-ZTKuqiTu3WXtL72UKCCnQLRax2IScKH7oQ+mvjbpvNE+NJxIWIemDqqM2GxNr4N16NCjOYpIgpin5pStM7kM5g==} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /is-npm@6.0.0: - resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + write-file-atomic@7.0.1: + resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} + engines: {node: ^20.17.0 || >=22.9.0} - /is-number-like@1.0.8: - resolution: {integrity: sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==} - dependencies: - lodash.isfinite: 3.3.2 - dev: false + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: true + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} - /is-number@3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: false + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} - /is-number@4.0.0: - resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} - engines: {node: '>=0.10.0'} - dev: false + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} - /is-object@1.0.2: - resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} - dev: false + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true - /is-online@8.5.1: - resolution: {integrity: sha512-RKyTQx/rJqw2QOXHwy7TmXdlkpe0Hhj7GBsr6TQJaj4ebNOfameZCMspU5vYbwBBzJ2brWArdSvNVox6T6oCTQ==} - engines: {node: '>=8'} - dependencies: - got: 9.6.0 - p-any: 2.1.0 - p-timeout: 3.2.0 - public-ip: 4.0.4 - dev: true + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + yargs@16.2.2: + resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} + engines: {node: '>=10'} + + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: false + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} - /is-png@2.0.0: - resolution: {integrity: sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==} - engines: {node: '>=8'} - requiresBuild: true - dev: false - optional: true + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: true + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - /is-relative-url@2.0.0: - resolution: {integrity: sha512-UMyEi3F+Rvjpc29IAQQ5OuMoKylt8npO0eQdXPQ2M3A5iFvh1qG+MtiLQR2tyHcVVsqwWrQiztjPAe9hnSHYeQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-absolute-url: 2.1.0 - dev: true +snapshots: - /is-relative@1.0.0: - resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} - engines: {node: '>=0.10.0'} + '@axe-core/playwright@4.12.1(playwright-core@1.61.1)': dependencies: - is-unc-path: 1.0.0 - dev: false + axe-core: 4.12.1 + playwright-core: 1.61.1 - /is-retry-allowed@1.2.0: - resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} - engines: {node: '>=0.10.0'} - dev: false - - /is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - dev: true - - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + '@babel/code-frame@7.29.7': dependencies: - call-bind: 1.0.7 - dev: true + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 - /is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + '@babel/generator@7.29.7': dependencies: - protocols: 2.0.1 - dev: true + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: false + '@babel/helper-globals@7.29.7': {} - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + '@babel/helper-string-parser@7.29.7': {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + '@babel/helper-validator-identifier@7.29.7': {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + '@babel/parser@7.29.7': dependencies: - has-tostringtag: 1.0.2 - dev: true + '@babel/types': 7.29.7 - /is-svg@4.4.0: - resolution: {integrity: sha512-v+AgVwiK5DsGtT9ng+m4mClp6zDAmwrW8nZi6Gg15qzvBnRWWdfWA1TGaXyCDnWq5g5asofIgMVl3PjKxvk1ug==} - engines: {node: '>=6'} - requiresBuild: true + '@babel/template@7.29.7': dependencies: - fast-xml-parser: 4.3.6 - dev: false - optional: true + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + '@babel/traverse@7.29.7': dependencies: - has-symbols: 1.0.3 - dev: true + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color - /is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} + '@babel/types@7.29.7': dependencies: - text-extensions: 2.4.0 - dev: true + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + '@cacheable/memory@2.2.0': dependencies: - which-typed-array: 1.1.15 - dev: true - - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true + '@cacheable/utils': 2.5.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 - /is-unc-path@1.0.0: - resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} - engines: {node: '>=0.10.0'} + '@cacheable/utils@2.5.0': dependencies: - unc-path-regex: 0.1.2 - dev: false - - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true + hashery: 1.5.1 + keyv: 5.6.0 - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: true + '@colordx/core@5.5.0': {} - /is-unicode-supported@2.0.0: - resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} - engines: {node: '>=18'} - dev: true + '@commitlint/cli@21.2.0(@types/node@26.0.1)(typescript@6.0.3)': + dependencies: + '@commitlint/config-conventional': 21.2.0 + '@commitlint/format': 21.2.0 + '@commitlint/lint': 21.2.0 + '@commitlint/load': 21.2.0(@types/node@26.0.1)(typescript@6.0.3) + '@commitlint/read': 21.2.0 + '@commitlint/types': 21.2.0 + tinyexec: 1.2.4 + yargs: 18.0.0 + transitivePeerDependencies: + - '@types/node' + - conventional-commits-filter + - conventional-commits-parser + - typescript - /is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - dev: false + '@commitlint/config-conventional@21.2.0': + dependencies: + '@commitlint/types': 21.2.0 + conventional-changelog-conventionalcommits: 10.2.0 - /is-valid-glob@1.0.0: - resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==} - engines: {node: '>=0.10.0'} - dev: false + '@commitlint/config-validator@21.2.0': + dependencies: + '@commitlint/types': 21.2.0 + ajv: 8.20.0 - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + '@commitlint/ensure@21.2.0': dependencies: - call-bind: 1.0.7 - dev: true + '@commitlint/types': 21.2.0 + es-toolkit: 1.49.0 - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: false + '@commitlint/execute-rule@21.0.1': {} - /is-wsl@1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} - dev: false + '@commitlint/format@21.2.0': + dependencies: + '@commitlint/types': 21.2.0 + picocolors: 1.1.1 - /is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} + '@commitlint/is-ignored@21.2.0': dependencies: - is-inside-container: 1.0.0 - dev: true + '@commitlint/types': 21.2.0 + semver: 7.8.5 - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false + '@commitlint/lint@21.2.0': + dependencies: + '@commitlint/is-ignored': 21.2.0 + '@commitlint/parse': 21.2.0 + '@commitlint/rules': 21.2.0 + '@commitlint/types': 21.2.0 - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: false + '@commitlint/load@21.2.0(@types/node@26.0.1)(typescript@6.0.3)': + dependencies: + '@commitlint/config-validator': 21.2.0 + '@commitlint/execute-rule': 21.0.1 + '@commitlint/resolve-extends': 21.2.0 + '@commitlint/types': 21.2.0 + cosmiconfig: 9.0.2(typescript@6.0.3) + cosmiconfig-typescript-loader: 6.3.0(@types/node@26.0.1)(cosmiconfig@9.0.2(typescript@6.0.3))(typescript@6.0.3) + es-toolkit: 1.49.0 + is-plain-obj: 4.1.0 + picocolors: 1.1.1 + transitivePeerDependencies: + - '@types/node' + - typescript - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + '@commitlint/message@21.2.0': {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + '@commitlint/parse@21.2.0': + dependencies: + '@commitlint/types': 21.2.0 + conventional-changelog-angular: 9.2.0 + conventional-commits-parser: 7.0.0 - /isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} + '@commitlint/read@21.2.0': dependencies: - isarray: 1.0.0 - dev: false + '@commitlint/top-level': 21.2.0 + '@commitlint/types': 21.2.0 + git-raw-commits: 5.0.1 + tinyexec: 1.2.4 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: false + '@commitlint/resolve-extends@21.2.0': + dependencies: + '@commitlint/config-validator': 21.2.0 + '@commitlint/types': 21.2.0 + es-toolkit: 1.49.0 + global-directory: 5.0.0 + resolve-from: 5.0.0 - /issue-parser@7.0.0: - resolution: {integrity: sha512-jgAw78HO3gs9UrKqJNQvfDj9Ouy8Mhu40fbEJ8yXff4MW8+/Fcn9iFjyWUQ6SKbX8ipPk3X5A3AyfYHRu6uVLw==} - engines: {node: ^18.17 || >=20.6.1} + '@commitlint/rules@21.2.0': dependencies: - lodash.capitalize: 4.2.1 - lodash.escaperegexp: 4.1.2 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.uniqby: 4.7.0 - dev: true + '@commitlint/ensure': 21.2.0 + '@commitlint/message': 21.2.0 + '@commitlint/to-lines': 21.0.1 + '@commitlint/types': 21.2.0 - /istextorbinary@2.6.0: - resolution: {integrity: sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==} - engines: {node: '>=0.12'} + '@commitlint/to-lines@21.0.1': {} + + '@commitlint/top-level@21.2.0': dependencies: - binaryextensions: 2.3.0 - editions: 2.3.1 - textextensions: 2.6.0 - dev: false + escalade: 3.2.0 - /istextorbinary@3.3.0: - resolution: {integrity: sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==} - engines: {node: '>=8'} + '@commitlint/types@21.2.0': dependencies: - binaryextensions: 2.3.0 - textextensions: 3.3.0 - dev: false + conventional-commits-parser: 7.0.0 + picocolors: 1.1.1 - /isurl@1.0.0: - resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==} - engines: {node: '>= 4'} + '@conventional-changelog/git-client@2.7.0': dependencies: - has-to-string-tag-x: 1.4.1 - is-object: 1.0.2 - dev: false + '@simple-libs/child-process-utils': 1.0.2 + '@simple-libs/stream-utils': 1.2.0 + semver: 7.8.5 - /iterate-iterator@1.0.2: - resolution: {integrity: sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==} - dev: true + '@conventional-changelog/template@1.2.0': {} - /iterate-value@1.0.2: - resolution: {integrity: sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==} + '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - es-get-iterator: 1.1.3 - iterate-iterator: 1.0.2 - dev: true + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': dependencies: - '@isaacs/cliui': 8.0.2 + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.6(css-tree@3.2.1)': optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + css-tree: 3.2.1 - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: true + '@csstools/css-tokenizer@4.0.0': {} - /js-beautify@1.15.1: - resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} - engines: {node: '>=14'} - hasBin: true + '@csstools/media-query-list-parser@5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - config-chain: 1.1.13 - editorconfig: 1.0.4 - glob: 10.3.15 - js-cookie: 3.0.5 - nopt: 7.2.1 - dev: false + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - /js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} - dev: false + '@csstools/selector-resolve-nested@4.0.0(postcss-selector-parser@7.1.4)': + dependencies: + postcss-selector-parser: 7.1.4 - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + '@csstools/selector-specificity@6.0.0(postcss-selector-parser@7.1.4)': + dependencies: + postcss-selector-parser: 7.1.4 - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + '@emnapi/runtime@1.11.1': dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: false + tslib: 2.8.1 + optional: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + '@epic-web/invariant@1.0.0': {} + + '@es-joy/jsdoccomment@0.87.0': dependencies: - argparse: 2.0.1 - dev: true + '@types/estree': 1.0.9 + '@typescript-eslint/types': 8.62.1 + comment-parser: 1.4.7 + esquery: 1.7.0 + jsdoc-type-pratt-parser: 7.2.0 - /jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - dev: true + '@es-joy/resolve.exports@1.2.0': {} - /jsdoc-type-pratt-parser@4.0.0: - resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} - engines: {node: '>=12.0.0'} - dev: true + '@esbuild/aix-ppc64@0.28.1': + optional: true - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true + '@esbuild/android-arm64@0.28.1': + optional: true - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + '@esbuild/android-arm@0.28.1': + optional: true - /json-buffer@3.0.0: - resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + '@esbuild/android-x64@0.28.1': + optional: true - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + '@esbuild/darwin-arm64@0.28.1': + optional: true - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: false + '@esbuild/darwin-x64@0.28.1': + optional: true - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + '@esbuild/freebsd-arm64@0.28.1': + optional: true - /json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@esbuild/freebsd-x64@0.28.1': + optional: true - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + '@esbuild/linux-arm64@0.28.1': + optional: true - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + '@esbuild/linux-arm@0.28.1': + optional: true - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + '@esbuild/linux-ia32@0.28.1': + optional: true - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true + '@esbuild/linux-loong64@0.28.1': + optional: true - /json2xml@0.1.3: - resolution: {integrity: sha512-yfTe9HnbrE3oRUEQL9mn7BueLd7RCTb7ig/mAFI6xY4RNYOEXF26x0qHFR7mb8ZrKgfE57wxkq0N3TboyFm6UA==} - engines: {node: '>= 0.6.0'} - dev: false + '@esbuild/linux-mips64el@0.28.1': + optional: true - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true + '@esbuild/linux-ppc64@0.28.1': + optional: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + '@esbuild/linux-riscv64@0.28.1': + optional: true - /jsonfile@3.0.1: - resolution: {integrity: sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: false + '@esbuild/linux-s390x@0.28.1': + optional: true - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true + '@esbuild/linux-x64@0.28.1': + optional: true - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + '@esbuild/netbsd-arm64@0.28.1': + optional: true - /junk@4.0.1: - resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} - engines: {node: '>=12.20'} - dev: false + '@esbuild/netbsd-x64@0.28.1': + optional: true - /just-debounce@1.1.0: - resolution: {integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==} - dev: false + '@esbuild/openbsd-arm64@0.28.1': + optional: true - /kew@0.7.0: - resolution: {integrity: sha512-IG6nm0+QtAMdXt9KvbgbGdvY50RSrw+U4sGZg+KlrSKPJEwVE5JVoI3d7RWfSMdBQneRheeAOj3lIjX5VL/9RQ==} - dev: false + '@esbuild/openbsd-x64@0.28.1': + optional: true - /keyv@3.0.0: - resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==} - dependencies: - json-buffer: 3.0.0 - dev: false + '@esbuild/openharmony-arm64@0.28.1': + optional: true + + '@esbuild/sunos-x64@0.28.1': + optional: true + + '@esbuild/win32-arm64@0.28.1': + optional: true + + '@esbuild/win32-ia32@0.28.1': + optional: true + + '@esbuild/win32-x64@0.28.1': + optional: true - /keyv@3.1.0: - resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} + '@eslint-community/eslint-plugin-eslint-comments@4.7.2(eslint@10.6.0(jiti@2.6.1))': dependencies: - json-buffer: 3.0.0 - dev: true + escape-string-regexp: 4.0.0 + eslint: 10.6.0(jiti@2.6.1) + ignore: 7.0.5 - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + '@eslint-community/eslint-utils@4.9.1(eslint@10.6.0(jiti@2.6.1))': dependencies: - json-buffer: 3.0.1 - dev: true + eslint: 10.6.0(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 - /kind-of@1.1.0: - resolution: {integrity: sha512-aUH6ElPnMGon2/YkxRIigV32MOpTVcoXQ1Oo8aYn40s+sJ3j+0gFZsT8HKDcxNy7Fi9zuquWtGaGAahOdv5p/g==} - engines: {node: '>=0.10.0'} - dev: false + '@eslint-community/regexpp@4.12.2': {} - /kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} + '@eslint/config-array@0.23.5': dependencies: - is-buffer: 1.1.6 - dev: false + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color - /kind-of@4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} + '@eslint/config-helpers@0.6.0': dependencies: - is-buffer: 1.1.6 - dev: false + '@eslint/core': 1.2.1 - /kind-of@5.1.0: - resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} - engines: {node: '>=0.10.0'} - dev: false + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + '@eslint/object-schema@3.0.5': {} - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + '@eslint/plugin-kit@0.7.2': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} + '@gulpjs/messages@1.1.0': {} - /known-css-properties@0.26.0: - resolution: {integrity: sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==} - dev: true + '@gulpjs/to-absolute-glob@4.0.0': + dependencies: + is-negated-glob: 1.0.0 - /known-css-properties@0.30.0: - resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} - dev: true + '@html-validate/stylish@6.0.0': {} - /last-run@1.1.1: - resolution: {integrity: sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==} - engines: {node: '>= 0.10'} + '@humanfs/core@0.19.2': dependencies: - default-resolution: 2.0.0 - es6-weak-map: 2.0.3 - dev: false + '@humanfs/types': 0.15.0 - /latest-version@7.0.0: - resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} - engines: {node: '>=14.16'} + '@humanfs/node@0.16.8': dependencies: - package-json: 8.1.1 - dev: true + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 - /lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} - dependencies: - readable-stream: 2.3.8 - dev: false + '@humanfs/types@0.15.0': {} - /lcid@1.0.0: - resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} - engines: {node: '>=0.10.0'} - dependencies: - invert-kv: 1.0.0 - dev: false + '@humanwhocodes/module-importer@1.0.1': {} - /lead@1.0.0: - resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==} - engines: {node: '>= 0.10'} - dependencies: - flush-write-stream: 1.1.1 - dev: false + '@humanwhocodes/retry@0.4.3': {} - /leasot@7.5.0: - resolution: {integrity: sha512-/vFxfV8u6X8BlJzav4ykNSGZDGoGdMYhyad56baCxk1lKIVld4O3z17EeCIKMqErX7ipwO7+H3kFHgjD5AGCHg==} - engines: {node: '>=6.14.4'} - hasBin: true + '@ianvs/prettier-plugin-sort-imports@4.7.1(prettier@3.9.4)': dependencies: - async: 3.2.5 - chalk: 2.4.2 - commander: 2.20.3 - eol: 0.9.1 - get-stdin: 7.0.0 - globby: 9.2.0 - json2xml: 0.1.3 - lodash: 4.17.21 - log-symbols: 3.0.0 - strip-ansi: 5.2.0 - text-table: 0.2.0 + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + prettier: 3.9.4 + semver: 7.8.5 transitivePeerDependencies: - supports-color - dev: false - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true + '@img/colour@1.1.0': {} - /liftoff@2.5.0: - resolution: {integrity: sha512-01zfGFqfORP1CGmZZP2Zn51zsqz4RltDi0RDOhbGoLYdUT5Lw+I2gX6QdwXhPITF6hPOHEOp+At6/L24hIg9WQ==} - engines: {node: '>= 0.8'} - dependencies: - extend: 3.0.2 - findup-sync: 2.0.0 - fined: 1.2.0 - flagged-respawn: 1.0.1 - is-plain-object: 2.0.4 - object.map: 1.0.1 - rechoir: 0.6.2 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: false + '@img/sharp-darwin-arm64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.3.1 + optional: true - /liftoff@3.1.0: - resolution: {integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==} - engines: {node: '>= 0.8'} + '@img/sharp-darwin-x64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.3.1 + optional: true + + '@img/sharp-freebsd-wasm32@0.35.2': dependencies: - extend: 3.0.2 - findup-sync: 3.0.0 - fined: 1.2.0 - flagged-respawn: 1.0.1 - is-plain-object: 2.0.4 - object.map: 1.0.1 - rechoir: 0.6.2 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: false + '@img/sharp-wasm32': 0.35.2 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.3.1': + optional: true + + '@img/sharp-libvips-darwin-x64@1.3.1': + optional: true + + '@img/sharp-libvips-linux-arm64@1.3.1': + optional: true + + '@img/sharp-libvips-linux-arm@1.3.1': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.3.1': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.3.1': + optional: true + + '@img/sharp-libvips-linux-s390x@1.3.1': + optional: true + + '@img/sharp-libvips-linux-x64@1.3.1': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.3.1': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.3.1': + optional: true + + '@img/sharp-linux-arm64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.3.1 + optional: true + + '@img/sharp-linux-arm@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.3.1 + optional: true - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - dev: true + '@img/sharp-linux-ppc64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.3.1 + optional: true - /lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} - engines: {node: '>=14'} - dev: false + '@img/sharp-linux-riscv64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.3.1 + optional: true - /limiter@1.1.5: - resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} - dev: false + '@img/sharp-linux-s390x@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.3.1 + optional: true - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + '@img/sharp-linux-x64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.3.1 + optional: true - /lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + '@img/sharp-linuxmusl-arm64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 + optional: true - /lint-staged@15.2.2: - resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} - engines: {node: '>=18.12.0'} - hasBin: true - dependencies: - chalk: 5.3.0 - commander: 11.1.0 - debug: 4.3.4 - execa: 8.0.1 - lilconfig: 3.0.0 - listr2: 8.0.1 - micromatch: 4.0.5 - pidtree: 0.6.0 - string-argv: 0.3.2 - yaml: 2.3.4 - transitivePeerDependencies: - - supports-color - dev: true + '@img/sharp-linuxmusl-x64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.3.1 + optional: true - /list-stream@1.0.1: - resolution: {integrity: sha512-XheYsTtN+/nay6Co4N9NlTjQzo1ohknNlDJfxTeH0tvvssxBINUXwmjqPtj8+7rYMBwTRb3kO8C8d6ogeRwD1A==} + '@img/sharp-wasm32@0.35.2': dependencies: - readable-stream: 2.0.6 - xtend: 4.0.2 - dev: false + '@emnapi/runtime': 1.11.1 + optional: true - /listr2@8.0.1: - resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} - engines: {node: '>=18.0.0'} + '@img/sharp-webcontainers-wasm32@0.35.2': dependencies: - cli-truncate: 4.0.0 - colorette: 2.0.20 - eventemitter3: 5.0.1 - log-update: 6.0.0 - rfdc: 1.3.1 - wrap-ansi: 9.0.0 - dev: true + '@img/sharp-wasm32': 0.35.2 + optional: true - /load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 2.2.0 - pify: 2.3.0 - pinkie-promise: 2.0.1 - strip-bom: 2.0.0 - dev: false + '@img/sharp-win32-arm64@0.35.2': + optional: true - /load-plugin@6.0.3: - resolution: {integrity: sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==} - dependencies: - '@npmcli/config': 8.3.1 - import-meta-resolve: 4.1.0 - dev: true + '@img/sharp-win32-ia32@0.35.2': + optional: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true + '@img/sharp-win32-x64@0.35.2': + optional: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + '@inquirer/external-editor@1.0.3(@types/node@26.0.1)': dependencies: - p-locate: 5.0.0 - dev: true + chardet: 2.2.0 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 26.0.1 - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-locate: 6.0.0 - dev: true + '@inquirer/figures@1.0.15': {} - /lodash._baseassign@3.2.0: - resolution: {integrity: sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==} + '@isaacs/cliui@8.0.2': dependencies: - lodash._basecopy: 3.0.1 - lodash.keys: 3.1.2 - dev: false + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - /lodash._basecopy@3.0.1: - resolution: {integrity: sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==} - dev: false + '@isaacs/cliui@9.0.0': {} - /lodash._basetostring@3.0.1: - resolution: {integrity: sha512-mTzAr1aNAv/i7W43vOR/uD/aJ4ngbtsRaCubp2BfZhlGU/eORUjg/7F6X0orNMdv33JOrdgGybtvMN/po3EWrA==} - dev: false + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - /lodash._basevalues@3.0.0: - resolution: {integrity: sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg==} - dev: false + '@jridgewell/resolve-uri@3.1.2': {} - /lodash._bindcallback@3.0.1: - resolution: {integrity: sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==} - dev: false + '@jridgewell/sourcemap-codec@1.5.5': {} - /lodash._createassigner@3.1.1: - resolution: {integrity: sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==} + '@jridgewell/trace-mapping@0.3.31': dependencies: - lodash._bindcallback: 3.0.1 - lodash._isiterateecall: 3.0.9 - lodash.restparam: 3.6.1 - dev: false - - /lodash._getnative@3.9.1: - resolution: {integrity: sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==} - dev: false - - /lodash._isiterateecall@3.0.9: - resolution: {integrity: sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==} - dev: false + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - /lodash._reescape@3.0.0: - resolution: {integrity: sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ==} - dev: false + '@keyv/bigmap@1.3.1(keyv@5.6.0)': + dependencies: + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 - /lodash._reevaluate@3.0.0: - resolution: {integrity: sha512-OrPwdDc65iJiBeUe5n/LIjd7Viy99bKwDdk7Z5ljfZg0uFRFlfQaCy9tZ4YMAag9WAZmlVpe1iZrkIMMSMHD3w==} - dev: false + '@keyv/serialize@1.1.1': {} - /lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - dev: false + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 - /lodash._root@3.0.1: - resolution: {integrity: sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==} - dev: false + '@nodelib/fs.stat@2.0.5': {} - /lodash.assign@3.2.0: - resolution: {integrity: sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==} + '@nodelib/fs.walk@1.2.8': dependencies: - lodash._baseassign: 3.2.0 - lodash._createassigner: 3.1.1 - lodash.keys: 3.1.2 - dev: false - - /lodash.assign@4.2.0: - resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} - dev: false + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: true + '@npmcli/config@8.3.4': + dependencies: + '@npmcli/map-workspaces': 3.0.6 + '@npmcli/package-json': 5.2.1 + ci-info: 4.4.0 + ini: 4.1.3 + nopt: 7.2.1 + proc-log: 4.2.0 + semver: 7.8.5 + walk-up-path: 3.0.1 + transitivePeerDependencies: + - bluebird - /lodash.capitalize@4.2.1: - resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} - dev: true + '@npmcli/git@5.0.8': + dependencies: + '@npmcli/promise-spawn': 7.0.2 + ini: 4.1.3 + lru-cache: 10.4.3 + npm-pick-manifest: 9.1.0 + proc-log: 4.2.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.8.5 + which: 4.0.0 + transitivePeerDependencies: + - bluebird - /lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: false + '@npmcli/map-workspaces@3.0.6': + dependencies: + '@npmcli/name-from-folder': 2.0.0 + glob: 10.5.0 + minimatch: 9.0.9 + read-package-json-fast: 3.0.2 - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: true + '@npmcli/name-from-folder@2.0.0': {} - /lodash.defaults@3.1.2: - resolution: {integrity: sha512-X7135IXFQt5JDFnYxOVAzVz+kFvwDn3N8DJYf+nrz/mMWEuSu7+OL6rWqsk3+VR1T4TejFCSu5isBJOLSID2bg==} + '@npmcli/package-json@5.2.1': dependencies: - lodash.assign: 3.2.0 - lodash.restparam: 3.6.1 - dev: false - - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: false + '@npmcli/git': 5.0.8 + glob: 10.5.0 + hosted-git-info: 7.0.2 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 6.0.2 + proc-log: 4.2.0 + semver: 7.8.5 + transitivePeerDependencies: + - bluebird - /lodash.escape@3.2.0: - resolution: {integrity: sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ==} + '@npmcli/promise-spawn@7.0.2': dependencies: - lodash._root: 3.0.1 - dev: false + which: 4.0.0 - /lodash.escaperegexp@4.1.2: - resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + '@one-ini/wasm@0.1.1': {} - /lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - dev: false + '@parcel/watcher-android-arm64@2.5.6': + optional: true - /lodash.isarray@3.0.4: - resolution: {integrity: sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==} - dev: false + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true - /lodash.isfinite@3.3.2: - resolution: {integrity: sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==} - dev: false + '@parcel/watcher-darwin-x64@2.5.6': + optional: true - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: true + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: true + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true - /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: true + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true - /lodash.keys@3.1.2: - resolution: {integrity: sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==} - dependencies: - lodash._getnative: 3.9.1 - lodash.isarguments: 3.1.0 - lodash.isarray: 3.0.4 - dev: false + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: false + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true - /lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true - /lodash.restparam@3.6.1: - resolution: {integrity: sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==} - dev: false + '@parcel/watcher-win32-arm64@2.5.6': + optional: true - /lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - dev: true + '@parcel/watcher-win32-ia32@2.5.6': + optional: true - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: true + '@parcel/watcher-win32-x64@2.5.6': + optional: true - /lodash.template@3.6.2: - resolution: {integrity: sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==} + '@parcel/watcher@2.5.6': dependencies: - lodash._basecopy: 3.0.1 - lodash._basetostring: 3.0.1 - lodash._basevalues: 3.0.0 - lodash._isiterateecall: 3.0.9 - lodash._reinterpolate: 3.0.0 - lodash.escape: 3.2.0 - lodash.keys: 3.1.2 - lodash.restparam: 3.6.1 - lodash.templatesettings: 3.1.1 - dev: false + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.4 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + optional: true - /lodash.templatesettings@3.1.1: - resolution: {integrity: sha512-TcrlEr31tDYnWkHFWDCV3dHYroKEXpJZ2YJYvJdhN+y4AkWMDZ5I4I8XDtUKqSAyG81N7w+I1mFEJtcED+tGqQ==} - dependencies: - lodash._reinterpolate: 3.0.0 - lodash.escape: 3.2.0 - dev: false + '@pkgjs/parseargs@0.11.0': + optional: true - /lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - dev: true + '@playwright/test@1.61.1': + dependencies: + playwright: 1.61.1 - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + '@popperjs/core@2.11.8': {} - /lodash.uniqby@4.7.0: - resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} - dev: true + '@sidvind/better-ajv-errors@7.0.0(ajv@8.20.0)': + dependencies: + ajv: 8.20.0 - /lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - dev: true + '@simple-libs/child-process-utils@1.0.2': + dependencies: + '@simple-libs/stream-utils': 1.2.0 - /lodash@1.0.2: - resolution: {integrity: sha512-0VSEDVec/Me2eATuoiQd8IjyBMMX0fahob8YJ96V1go2RjvCk1m1GxmtfXn8RNSaLaTtop7fsuhhu9oLk3hUgA==} - engines: {'0': node, '1': rhino} - dev: false + '@simple-libs/stream-utils@1.2.0': {} - /lodash@2.2.1: - resolution: {integrity: sha512-rGaKzxe4Biu8YdCPD/tUkBF4/fnAqgj63A6PeAyQnH/NEKNUHgppGZUgYBYOmAZsBKwwAb343Q1Zew0RDB2jIg==} - engines: {'0': node, '1': rhino} - dev: false + '@simple-libs/stream-utils@2.0.0': {} - /lodash@2.4.2: - resolution: {integrity: sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==} - engines: {'0': node, '1': rhino} - dev: false + '@sindresorhus/base62@1.0.0': {} - /lodash@3.10.1: - resolution: {integrity: sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==} - dev: false + '@sindresorhus/merge-streams@2.3.0': {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + '@sindresorhus/merge-streams@4.0.0': {} - /log-symbols@3.0.0: - resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} - engines: {node: '>=8'} - dependencies: - chalk: 2.4.2 - dev: false + '@socket.io/component-emitter@3.1.2': {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + '@types/concat-stream@2.0.3': dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true + '@types/node': 22.20.0 - /log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} + '@types/cors@2.8.19': dependencies: - chalk: 5.3.0 - is-unicode-supported: 1.3.0 - dev: true + '@types/node': 26.0.1 - /log-update@6.0.0: - resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} - engines: {node: '>=18'} + '@types/debug@4.1.13': dependencies: - ansi-escapes: 6.2.1 - cli-cursor: 4.0.0 - slice-ansi: 7.1.0 - strip-ansi: 7.1.0 - wrap-ansi: 9.0.0 - dev: true - - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: true - - /lower-case@1.1.4: - resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - dev: false + '@types/ms': 2.1.0 - /lowercase-keys@1.0.0: - resolution: {integrity: sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==} - engines: {node: '>=0.10.0'} - dev: false - - /lowercase-keys@1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} - - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: true + '@types/esrecurse@4.3.1': {} - /lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.9 - /lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + '@types/estree@1.0.9': {} - /lru-cache@2.7.3: - resolution: {integrity: sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==} - dev: false + '@types/expect@1.20.4': {} - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: false + '@types/fined@1.1.5': {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + '@types/hast@3.0.4': dependencies: - yallist: 3.1.1 + '@types/unist': 3.0.3 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + '@types/inquirer@9.0.10': dependencies: - yallist: 4.0.0 - dev: true + '@types/through': 0.0.33 + rxjs: 7.8.2 - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: true + '@types/is-empty@1.2.3': {} - /macos-release@3.2.0: - resolution: {integrity: sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + '@types/json-schema@7.0.15': {} - /make-dir@1.3.0: - resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} - engines: {node: '>=4'} + '@types/liftoff@4.0.3': dependencies: - pify: 3.0.0 - dev: false + '@types/fined': 1.1.5 + '@types/node': 26.0.1 - /make-error-cause@1.2.2: - resolution: {integrity: sha512-4TO2Y3HkBnis4c0dxhAgD/jprySYLACf7nwN6V0HAHDx59g12WlRpUmFy1bRHamjGUEEBrEvCq6SUpsEE2lhUg==} + '@types/mdast@4.0.4': dependencies: - make-error: 1.3.6 - dev: false + '@types/unist': 3.0.3 - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: false + '@types/ms@2.1.0': {} - /make-iterator@1.0.1: - resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} - engines: {node: '>=0.10.0'} + '@types/node@22.20.0': dependencies: - kind-of: 6.0.3 - dev: false + undici-types: 6.21.0 - /map-age-cleaner@0.1.3: - resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} - engines: {node: '>=6'} + '@types/node@26.0.1': dependencies: - p-defer: 1.0.0 - dev: true + undici-types: 8.3.0 - /map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - dev: false + '@types/picomatch@4.0.3': {} - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + '@types/supports-color@8.1.3': {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + '@types/text-table@0.2.5': {} - /map-visit@1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} + '@types/through@0.0.33': dependencies: - object-visit: 1.0.1 - dev: false + '@types/node': 26.0.1 - /markdown-extensions@2.0.0: - resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} - engines: {node: '>=16'} - dev: true + '@types/unist@2.0.11': {} - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - dev: true - - /marked@0.3.5: - resolution: {integrity: sha512-C2ZEiUZxg7zxh9t8C3q6yW4WucWN+OYkiAV/M5GxvfwYrKxlDcuZ74dHmoRoI+R80Oa/FtHl1w8GT13epnbi+Q==} - hasBin: true - dev: false + '@types/unist@3.0.3': {} - /marked@12.0.2: - resolution: {integrity: sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==} - engines: {node: '>= 18'} - hasBin: true - dev: false + '@types/vinyl@2.0.12': + dependencies: + '@types/expect': 1.20.4 + '@types/node': 26.0.1 - /matchdep@2.0.0: - resolution: {integrity: sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==} - engines: {node: '>= 0.10.0'} + '@types/ws@8.18.1': dependencies: - findup-sync: 2.0.0 - micromatch: 3.1.10 - resolve: 1.22.8 - stack-trace: 0.0.10 - transitivePeerDependencies: - - supports-color - dev: false + '@types/node': 26.0.1 - /mathml-tag-names@2.1.3: - resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} - dev: true + '@typescript-eslint/types@8.62.1': {} - /mdast-comment-marker@3.0.0: - resolution: {integrity: sha512-bt08sLmTNg00/UtVDiqZKocxqvQqqyQZAg1uaRuO/4ysXV5motg7RolF5o5yy/sY1rG0v2XgZEqFWho1+2UquA==} + '@visionappscz/stylelint-config@4.0.0(postcss@8.5.16)(stylelint@17.14.0(typescript@6.0.3))': dependencies: - '@types/mdast': 4.0.4 - mdast-util-mdx-expression: 2.0.0 + stylelint: 17.14.0(typescript@6.0.3) + stylelint-config-standard: 36.0.1(stylelint@17.14.0(typescript@6.0.3)) + stylelint-config-standard-scss: 13.1.0(postcss@8.5.16)(stylelint@17.14.0(typescript@6.0.3)) + stylelint-order: 6.0.4(stylelint@17.14.0(typescript@6.0.3)) transitivePeerDependencies: - - supports-color - dev: true + - postcss - /mdast-util-directive@3.0.0: - resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.4 - unist-util-visit-parents: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true + a-sync-waterfall@1.0.1: {} - /mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} - dependencies: - '@types/mdast': 4.0.4 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + abbrev@2.0.0: {} - /mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + accepts@1.3.8: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true + mime-types: 2.1.35 + negotiator: 0.6.3 - /mdast-util-frontmatter@2.0.1: - resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - micromark-extension-frontmatter: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: true + acorn: 8.17.0 - /mdast-util-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} - dependencies: - '@types/mdast': 4.0.4 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.1.0 - dev: true + acorn@8.17.0: {} - /mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + ajv@6.15.0: dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: true + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 - /mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + ajv@8.20.0: dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: true + fast-deep-equal: 3.1.3 + fast-uri: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 - /mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + ansi-colors@1.1.0: dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: true + ansi-wrap: 0.1.0 - /mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: true + ansi-colors@4.1.3: {} - /mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + ansi-cyan@0.1.1: dependencies: - mdast-util-from-markdown: 2.0.0 - mdast-util-gfm-autolink-literal: 2.0.0 - mdast-util-gfm-footnote: 2.0.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: true + ansi-wrap: 0.1.0 - /mdast-util-heading-style@3.0.0: - resolution: {integrity: sha512-tsUfM9Kj9msjlemA/38Z3pvraQay880E3zP2NgIthMoGcpU9bcPX9oSM6QC/+eFXGGB4ba+VCB1dKAPHB7Veug==} + ansi-escapes@4.3.2: dependencies: - '@types/mdast': 4.0.4 - dev: true + type-fest: 0.21.3 - /mdast-util-mdx-expression@2.0.0: - resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + ansi-escapes@7.3.0: dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: true + environment: 1.1.0 - /mdast-util-mdx-jsx@3.1.2: - resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + ansi-gray@0.1.1: dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.4 - unist-util-remove-position: 5.0.0 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true + ansi-wrap: 0.1.0 - /mdast-util-mdx@3.0.0: - resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + ansi-red@0.1.1: dependencies: - mdast-util-from-markdown: 2.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 - mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: true + ansi-wrap: 0.1.0 - /mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: true + color-convert: 2.0.1 - /mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + ansi-styles@6.2.3: {} + + ansi-wrap@0.1.0: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.0 - dev: true + normalize-path: 3.0.0 + picomatch: 2.3.2 + + are-docs-informative@0.0.2: {} - /mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + argparse@1.0.10: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - dev: true + sprintf-js: 1.0.3 - /mdast-util-to-string@1.1.0: - resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} - dev: true + argparse@2.0.1: {} - /mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + arr-diff@1.1.0: dependencies: - '@types/mdast': 4.0.4 - dev: true + arr-flatten: 1.1.0 + array-slice: 0.2.3 - /mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - requiresBuild: true - dev: false - optional: true + arr-diff@4.0.0: {} - /mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - dev: false + arr-flatten@1.1.0: {} - /mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + arr-union@2.1.0: {} - /mem@4.3.0: - resolution: {integrity: sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==} - engines: {node: '>=6'} - dependencies: - map-age-cleaner: 0.1.3 - mimic-fn: 2.1.0 - p-is-promise: 2.1.0 - dev: true + arr-union@3.1.0: {} - /meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - dev: true + array-each@1.0.1: {} - /meow@13.2.0: - resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} - engines: {node: '>=18'} - dev: true + array-slice@0.2.3: {} - /meow@9.0.0: - resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} - engines: {node: '>=10'} - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize: 1.2.0 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true + array-slice@1.1.0: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + arrify@2.0.1: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + asap@2.0.6: {} - /micromark-core-commonmark@2.0.1: - resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} - dependencies: - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true - - /micromark-extension-frontmatter@2.0.0: - resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} - dependencies: - fault: 2.0.1 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + assign-symbols@1.0.0: {} - /micromark-extension-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} - dependencies: - micromark-util-character: 2.1.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + astral-regex@2.0.0: {} - /micromark-extension-gfm-footnote@2.0.0: - resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true - - /micromark-extension-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + async-done@2.0.0: dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + end-of-stream: 1.4.5 + once: 1.4.0 + stream-exhaust: 1.0.2 - /micromark-extension-gfm-table@2.0.0: - resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + async-each-series@0.1.1: {} + + async-settle@2.0.0: dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + async-done: 2.0.0 - /micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + async@2.6.4: dependencies: - micromark-util-types: 2.0.0 - dev: true + lodash: 4.18.1 - /micromark-extension-gfm-task-list-item@2.0.1: - resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + autoprefixer@10.5.2(postcss@8.5.16): dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + browserslist: 4.28.4 + caniuse-lite: 1.0.30001800 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + axe-core@4.12.1: {} + + b4a@1.8.1: {} + + bach@2.0.1: dependencies: - micromark-extension-gfm-autolink-literal: 2.0.0 - micromark-extension-gfm-footnote: 2.0.0 - micromark-extension-gfm-strikethrough: 2.0.0 - micromark-extension-gfm-table: 2.0.0 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.0.1 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + async-done: 2.0.0 + async-settle: 2.0.0 + now-and-later: 3.0.0 + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} - /micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + bare-events@2.9.1: {} + + base64-js@1.5.1: {} + + base64id@2.0.0: {} + + baseline-browser-mapping@2.10.40: {} + + batch@0.6.1: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 - /micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + bl@5.1.0: dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 - /micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + boolbase@1.0.0: {} + + bootstrap@5.3.8(@popperjs/core@2.11.8): dependencies: - micromark-util-character: 2.1.0 - micromark-util-types: 2.0.0 - dev: true + '@popperjs/core': 2.11.8 - /micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + brace-expansion@1.1.15: dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + balanced-match: 1.0.2 + concat-map: 0.0.1 - /micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + brace-expansion@2.1.1: dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + balanced-match: 1.0.2 - /micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + brace-expansion@5.0.7: dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + balanced-match: 4.0.4 - /micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + braces@3.0.3: dependencies: - micromark-util-symbol: 2.0.0 - dev: true + fill-range: 7.1.1 - /micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + browser-sync-client@3.0.4: dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + etag: 1.8.1 + fresh: 0.5.2 + mitt: 1.2.0 - /micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + browser-sync-ui@3.0.4: dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + async-each-series: 0.1.1 + chalk: 4.1.2 + connect-history-api-fallback: 1.6.0 + immutable: 3.8.3 + server-destroy: 1.0.1 + socket.io-client: 4.8.3 + stream-throttle: 0.1.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + browser-sync@3.0.4: dependencies: - micromark-util-symbol: 2.0.0 - dev: true + browser-sync-client: 3.0.4 + browser-sync-ui: 3.0.4 + bs-recipes: 1.3.4 + chalk: 4.1.2 + chokidar: 3.6.0 + connect: 3.6.6 + connect-history-api-fallback: 1.6.0 + dev-ip: 1.0.1 + easy-extender: 2.3.4 + eazy-logger: 4.1.0 + etag: 1.8.1 + fresh: 0.5.2 + fs-extra: 3.0.1 + http-proxy: 1.18.1 + immutable: 3.8.3 + micromatch: 4.0.8 + opn: 5.3.0 + portscanner: 2.2.0 + raw-body: 2.5.3 + resp-modifier: 6.0.2 + rx: 4.1.0 + send: 0.19.2 + serve-index: 1.9.2 + serve-static: 1.16.3 + server-destroy: 1.0.1 + socket.io: 4.8.3 + ua-parser-js: 1.0.41 + yargs: 17.7.3 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate - /micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + browserslist@4.28.4: dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 - dev: true + baseline-browser-mapping: 2.10.40 + caniuse-lite: 1.0.30001800 + electron-to-chromium: 1.5.383 + node-releases: 2.0.50 + update-browserslist-db: 1.2.3(browserslist@4.28.4) - /micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - dev: true + bs-recipes@1.3.4: {} - /micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - dev: true + buffer-from@1.1.2: {} - /micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + buffer@5.7.1: dependencies: - micromark-util-symbol: 2.0.0 - dev: true + base64-js: 1.5.1 + ieee754: 1.2.1 - /micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + buffer@6.0.3: dependencies: - micromark-util-types: 2.0.0 - dev: true + base64-js: 1.5.1 + ieee754: 1.2.1 - /micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + bytes@3.1.2: {} + + cacheable@2.5.0: dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 - dev: true + '@cacheable/memory': 2.2.0 + '@cacheable/utils': 2.5.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.10.1 - /micromark-util-subtokenize@2.0.1: - resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + caller-callsite@2.0.0: dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + callsites: 2.0.0 - /micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - dev: true + caller-path@2.0.0: + dependencies: + caller-callsite: 2.0.0 - /micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - dev: true + callsites@2.0.0: {} - /micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - dependencies: - '@types/debug': 4.1.12 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: true + callsites@3.1.0: {} - /micromatch@3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} + caniuse-api@4.0.0: dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4 - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: false + browserslist: 4.28.4 + caniuse-lite: 1.0.30001800 - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 + caniuse-lite@1.0.30001800: {} - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + ccount@2.0.1: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + chalk@4.1.2: dependencies: - mime-db: 1.52.0 - - /mime@1.4.1: - resolution: {integrity: sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==} - hasBin: true - dev: false + ansi-styles: 4.3.0 + supports-color: 7.2.0 - /mimic-fn@1.2.0: - resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} - engines: {node: '>=4'} - dev: true + chalk@5.6.2: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + change-case@5.4.4: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + character-entities-html4@2.1.0: {} - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} + character-entities-legacy@3.0.0: {} - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true + character-entities@2.0.2: {} - /mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + character-reference-invalid@2.0.1: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + chardet@2.2.0: {} - /minimatch@0.2.14: - resolution: {integrity: sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA==} - deprecated: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue + cheerio-select@2.1.0: dependencies: - lru-cache: 2.7.3 - sigmund: 1.0.1 - dev: false + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 - /minimatch@2.0.10: - resolution: {integrity: sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==} - deprecated: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue + cheerio@1.2.0: dependencies: - brace-expansion: 1.1.11 - dev: false + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 10.1.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 7.28.0 + whatwg-mimetype: 4.0.0 - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + chokidar@3.6.0: dependencies: - brace-expansion: 1.1.11 + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 - /minimatch@9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} - engines: {node: '>=16 || 14 >=14.17'} + chokidar@5.0.0: dependencies: - brace-expansion: 2.0.1 - dev: false + readdirp: 5.0.0 - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} + ci-info@4.4.0: {} + + cli-cursor@3.1.0: dependencies: - brace-expansion: 2.0.1 + restore-cursor: 3.1.0 - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + cli-cursor@5.0.0: dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true + restore-cursor: 5.1.0 - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + cli-spinners@2.9.2: {} - /minipass@7.1.1: - resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} - engines: {node: '>=16 || 14 >=14.17'} + cli-truncate@5.2.0: + dependencies: + slice-ansi: 8.0.0 + string-width: 8.2.1 - /mitt@1.2.0: - resolution: {integrity: sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==} - dev: false + cli-width@4.1.0: {} - /mixin-deep@1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} + cliui@7.0.4: dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 - dev: false + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + cliui@8.0.1: dependencies: - minimist: 1.2.8 - dev: false - - /modify-filename@2.0.0: - resolution: {integrity: sha512-VX9/MdgUN9StpSLImJ0+AyV2dxJJtyojIwRHF/Ja942tW7FTzxXI186jDSTk4k5wj2+59a4bRzFnJUgMSi+ygg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 - /moment-timezone@0.5.45: - resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==} + cliui@9.0.1: dependencies: - moment: 2.30.1 - dev: false - - /moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - dev: false + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 - /mozjpeg@8.0.0: - resolution: {integrity: sha512-Ca2Yhah9hG0Iutgsn8MOrAl37P9ThnKsJatjXoWdUO+8X8GeG/6ahvHZrTyqvbs6leMww1SauWUCao/L9qBuFQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - requiresBuild: true - dependencies: - bin-build: 3.0.0 - bin-wrapper: 4.1.0 - dev: false + clone@1.0.4: {} - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: false + clone@2.1.2: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + co@3.1.0: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + collapse-white-space@2.1.0: {} - /multipipe@0.1.2: - resolution: {integrity: sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q==} + color-convert@2.0.1: dependencies: - duplexer2: 0.0.2 - dev: false + color-name: 1.1.4 - /multipipe@4.0.0: - resolution: {integrity: sha512-jzcEAzFXoWwWwUbvHCNPwBlTz3WCWe/jPcXSmTfbo/VjRwRTfvLZ/bdvtiTdqCe8d4otCSsPCbhGYcX+eggpKQ==} - dependencies: - duplexer2: 0.1.4 - object-assign: 4.1.1 - dev: false + color-name@1.1.4: {} - /mute-stdout@1.0.1: - resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==} - engines: {node: '>= 0.10'} - dev: false + color-support@1.1.3: {} - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + colord@2.9.3: {} - /nan@2.19.0: - resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} - requiresBuild: true - dev: false - optional: true + comma-separated-tokens@2.0.3: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + commander@10.0.1: {} - /nanomatch@1.2.13: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} - 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.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: false + commander@11.1.0: {} - /natives@1.1.6: - resolution: {integrity: sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==} - deprecated: This module relies on Node.js's internals and will break at some point. Do not use it, and update to graceful-fs@4.x. - dev: false + commander@12.1.0: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + commander@2.20.3: {} - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: false + commander@5.1.0: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + comment-parser@1.4.7: {} - /netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - dev: true + concat-map@0.0.1: {} - /new-github-release-url@2.0.0: - resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + concat-stream@2.0.0: dependencies: - type-fest: 2.19.0 - dev: true - - /next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: false - - /nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - requiresBuild: true - dev: false + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 - /no-case@2.3.2: - resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + config-chain@1.1.13: dependencies: - lower-case: 1.1.4 - dev: false + ini: 1.3.8 + proto-list: 1.2.4 - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: true + connect-history-api-fallback@1.6.0: {} - /node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + connect@3.6.6: dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: true - - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + debug: 2.6.9 + finalhandler: 1.1.0 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color - /nopt@7.2.1: - resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + conventional-changelog-angular@9.2.0: dependencies: - abbrev: 2.0.0 + '@conventional-changelog/template': 1.2.0 - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + conventional-changelog-conventionalcommits@10.2.0: dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 + '@conventional-changelog/template': 1.2.0 - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + conventional-commits-parser@7.0.0: dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.13.1 - semver: 7.6.2 - validate-npm-package-license: 3.0.4 - dev: true + '@simple-libs/stream-utils': 2.0.0 + meow: 14.1.0 - /normalize-package-data@6.0.1: - resolution: {integrity: sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - hosted-git-info: 7.0.2 - is-core-module: 2.13.1 - semver: 7.6.2 - validate-npm-package-license: 3.0.4 - dev: true + convert-source-map@2.0.0: {} - /normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} + cookie@0.7.2: {} + + copy-props@4.0.0: dependencies: - remove-trailing-separator: 1.1.0 - dev: false + each-props: 3.0.0 + is-plain-object: 5.0.0 - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + core-util-is@1.0.3: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: false + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 - /normalize-url@2.0.1: - resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==} - engines: {node: '>=4'} + cosmiconfig-typescript-loader@6.3.0(@types/node@26.0.1)(cosmiconfig@9.0.2(typescript@6.0.3))(typescript@6.0.3): dependencies: - prepend-http: 2.0.0 - query-string: 5.1.1 - sort-keys: 2.0.0 - dev: false + '@types/node': 26.0.1 + cosmiconfig: 9.0.2(typescript@6.0.3) + jiti: 2.6.1 + typescript: 6.0.3 - /normalize-url@4.5.1: - resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} - engines: {node: '>=8'} - dev: true + cosmiconfig@5.2.1: + dependencies: + import-fresh: 2.0.0 + is-directory: 0.3.1 + js-yaml: 3.15.0 + parse-json: 4.0.0 - /normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} - engines: {node: '>=14.16'} - dev: true + cosmiconfig@9.0.2(typescript@6.0.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.3.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 6.0.3 - /now-and-later@2.0.1: - resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==} - engines: {node: '>= 0.10'} + cross-env@10.1.0: dependencies: - once: 1.4.0 - dev: false + '@epic-web/invariant': 1.0.0 + cross-spawn: 7.0.6 - /npm-conf@1.1.3: - resolution: {integrity: sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==} - engines: {node: '>=4'} + cross-spawn@7.0.6: dependencies: - config-chain: 1.1.13 - pify: 3.0.0 - dev: false + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - /npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + css-functions-list@3.3.3: {} + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 - /npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} + css-tree@2.2.1: dependencies: - path-key: 2.0.1 - dev: false + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + cssnano-preset-default@8.0.2(postcss@8.5.16): + dependencies: + browserslist: 4.28.4 + cssnano-utils: 6.0.1(postcss@8.5.16) + postcss: 8.5.16 + postcss-calc: 10.1.1(postcss@8.5.16) + postcss-colormin: 8.0.1(postcss@8.5.16) + postcss-convert-values: 8.0.1(postcss@8.5.16) + postcss-discard-comments: 8.0.1(postcss@8.5.16) + postcss-discard-duplicates: 8.0.1(postcss@8.5.16) + postcss-discard-empty: 8.0.1(postcss@8.5.16) + postcss-discard-overridden: 8.0.1(postcss@8.5.16) + postcss-merge-longhand: 8.0.1(postcss@8.5.16) + postcss-merge-rules: 8.0.1(postcss@8.5.16) + postcss-minify-font-values: 8.0.1(postcss@8.5.16) + postcss-minify-gradients: 8.0.1(postcss@8.5.16) + postcss-minify-params: 8.0.1(postcss@8.5.16) + postcss-minify-selectors: 8.0.2(postcss@8.5.16) + postcss-normalize-charset: 8.0.1(postcss@8.5.16) + postcss-normalize-display-values: 8.0.1(postcss@8.5.16) + postcss-normalize-positions: 8.0.1(postcss@8.5.16) + postcss-normalize-repeat-style: 8.0.1(postcss@8.5.16) + postcss-normalize-string: 8.0.1(postcss@8.5.16) + postcss-normalize-timing-functions: 8.0.1(postcss@8.5.16) + postcss-normalize-unicode: 8.0.1(postcss@8.5.16) + postcss-normalize-url: 8.0.1(postcss@8.5.16) + postcss-normalize-whitespace: 8.0.1(postcss@8.5.16) + postcss-ordered-values: 8.0.1(postcss@8.5.16) + postcss-reduce-initial: 8.0.1(postcss@8.5.16) + postcss-reduce-transforms: 8.0.1(postcss@8.5.16) + postcss-svgo: 8.0.1(postcss@8.5.16) + postcss-unique-selectors: 8.0.1(postcss@8.5.16) + + cssnano-utils@6.0.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + + cssnano@8.0.2(postcss@8.5.16): + dependencies: + cssnano-preset-default: 8.0.2(postcss@8.5.16) + lilconfig: 3.1.3 + postcss: 8.5.16 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + debug@2.6.9: dependencies: - path-key: 3.1.1 + ms: 2.0.0 - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + debug@4.4.3: dependencies: - path-key: 4.0.0 + ms: 2.1.3 - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + decode-named-character-reference@1.3.0: dependencies: - boolbase: 1.0.0 - dev: false + character-entities: 2.0.2 - /number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - dev: false + deep-is@0.1.4: {} - /nunjucks-date-filter-locale@1.4.3: - resolution: {integrity: sha512-90wp+89B3hUgkRDvO1LXsb8AZM2cc+1q2iFwacZAvI/eV58fMHQYHiNONJ94f5ILeT2gHieJXISq6QG43TUYxA==} + defaults@1.0.4: dependencies: - moment: 2.30.1 - moment-timezone: 0.5.45 - nunjucks: 3.2.4 - transitivePeerDependencies: - - chokidar - dev: false - bundledDependencies: false + clone: 1.0.4 - /nunjucks-markdown-filter@0.1.0: - resolution: {integrity: sha512-pC9s/4c5VRMD6y+2GNQP7aT9gozt7TIW3UzZ0RfHl/KXLlEyr4vHlW/0m7pC/me7zJReZ1VRgXwgXfERYPQQjA==} + del@8.0.1: dependencies: - marked: 0.3.5 - dev: false + globby: 14.1.0 + is-glob: 4.0.3 + is-path-cwd: 3.0.0 + is-path-inside: 4.0.0 + p-map: 7.0.5 + presentable-error: 0.0.1 + slash: 5.1.0 - /nunjucks@3.2.4: - resolution: {integrity: sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==} - engines: {node: '>= 6.9.0'} - hasBin: true - peerDependencies: - chokidar: ^3.3.0 - peerDependenciesMeta: - chokidar: - optional: true - dependencies: - a-sync-waterfall: 1.0.1 - asap: 2.0.6 - commander: 5.1.0 - dev: false + depd@1.1.2: {} - /object-assign@3.0.0: - resolution: {integrity: sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==} - engines: {node: '>=0.10.0'} - dev: false + depd@2.0.0: {} - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false + dequal@2.0.3: {} - /object-copy@0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} - dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - dev: false + destroy@1.2.0: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true + detect-file@1.0.0: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + detect-libc@2.1.2: {} - /object-visit@1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: false + dev-ip@1.0.1: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + devlop@1.1.0: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 + dequal: 2.0.3 - /object.defaults@1.1.0: - resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} - engines: {node: '>=0.10.0'} - dependencies: - array-each: 1.0.1 - array-slice: 1.1.0 - for-own: 1.0.0 - isobject: 3.0.1 - dev: false + dlv@1.1.3: {} - /object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} + dom-serializer@2.0.0: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: true + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - dev: true + domelementtype@2.3.0: {} - /object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + domhandler@5.0.3: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - dev: true + domelementtype: 2.3.0 - /object.map@1.0.1: - resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==} - engines: {node: '>=0.10.0'} + domutils@3.2.2: dependencies: - for-own: 1.0.0 - make-iterator: 1.0.1 - dev: false + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 - /object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} + each-props@3.0.0: dependencies: - isobject: 3.0.1 - dev: false + is-plain-object: 5.0.0 + object.defaults: 1.1.0 - /object.reduce@1.0.1: - resolution: {integrity: sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==} - engines: {node: '>=0.10.0'} - dependencies: - for-own: 1.0.0 - make-iterator: 1.0.1 - dev: false + eastasianwidth@0.2.0: {} - /object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + easy-extender@2.3.4: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: true + lodash: 4.18.1 - /on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: false + easy-transform-stream@1.0.1: {} - /once@1.3.3: - resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + eazy-logger@4.1.0: dependencies: - wrappy: 1.0.2 - dev: false + chalk: 4.1.2 - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + editorconfig@1.0.7: dependencies: - wrappy: 1.0.2 + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.9 + semver: 7.8.5 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 + ee-first@1.1.1: {} - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 + electron-to-chromium@1.5.383: {} - /open@10.1.0: - resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} - engines: {node: '>=18'} - dependencies: - default-browser: 5.2.1 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 3.1.0 - dev: true + emoji-regex@10.6.0: {} - /opn@5.3.0: - resolution: {integrity: sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==} - engines: {node: '>=4'} - dependencies: - is-wsl: 1.1.0 - dev: false + emoji-regex@8.0.0: {} - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - dev: true + emoji-regex@9.2.2: {} - /optipng-bin@7.0.1: - resolution: {integrity: sha512-W99mpdW7Nt2PpFiaO+74pkht7KEqkXkeRomdWXfEz3SALZ6hns81y/pm1dsGZ6ItUIfchiNIP6ORDr1zETU1jA==} - engines: {node: '>=10'} - hasBin: true - requiresBuild: true - dependencies: - bin-build: 3.0.0 - bin-wrapper: 4.1.0 - dev: false - optional: true + encodeurl@1.0.2: {} - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + encodeurl@2.0.0: {} + + encoding-sniffer@0.2.1: dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 - /ora@8.0.1: - resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} - engines: {node: '>=18'} + end-of-stream@1.4.5: dependencies: - chalk: 5.3.0 - cli-cursor: 4.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.0.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.1.0 - strip-ansi: 7.1.0 - dev: true + once: 1.4.0 - /orchestrator@0.3.8: - resolution: {integrity: sha512-DrQ43ngaJ0e36j2CHyoDoIg1K4zbc78GnTQESebK9vu6hj4W5/pvfSFO/kgM620Yd0YnhseSNYsLK3/SszZ5NQ==} + engine.io-client@6.6.6: dependencies: - end-of-stream: 0.1.5 - sequencify: 0.0.7 - stream-consume: 0.1.1 - dev: false + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-parser: 5.2.3 + ws: 8.21.0 + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - /ordered-read-streams@0.1.0: - resolution: {integrity: sha512-PMX5ehiNri4+lgk9fl09xuPeciGmyPyVUSBwwPT4C/3EHGxoVf7UdgKDE3SLBD4pUDmlzrg1L1cK5igrp+Tyuw==} - dev: false + engine.io-parser@5.2.3: {} - /ordered-read-streams@1.0.1: - resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==} + engine.io@6.6.9: dependencies: - readable-stream: 2.3.8 - dev: false + '@types/cors': 2.8.19 + '@types/node': 26.0.1 + '@types/ws': 8.18.1 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.6 + debug: 4.4.3 + engine.io-parser: 5.2.3 + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - /os-filter-obj@2.0.0: - resolution: {integrity: sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==} - engines: {node: '>=4'} - dependencies: - arch: 2.2.0 - dev: false + entities@4.5.0: {} - /os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} - engines: {node: '>=0.10.0'} - dev: false + entities@6.0.1: {} - /os-locale@1.4.0: - resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} - engines: {node: '>=0.10.0'} - dependencies: - lcid: 1.0.0 - dev: false + entities@7.0.1: {} - /os-name@5.1.0: - resolution: {integrity: sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + env-paths@2.2.1: {} + + environment@1.1.0: {} + + err-code@2.0.3: {} + + error-ex@1.3.4: dependencies: - macos-release: 3.2.0 - windows-release: 5.1.1 - dev: true + is-arrayish: 0.2.1 - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true + es-errors@1.3.0: {} - /ow@2.0.0: - resolution: {integrity: sha512-ESUigmGrdhUZ2nQSFNkeKSl6ZRPupXzprMs3yF9DYlNVpJ8XAjM/fI9RUZxA7PI1K9HQDCCvBo1jr/GEIo9joQ==} - engines: {node: '>=18'} + es-toolkit@1.49.0: {} + + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@10.1.8(eslint@10.6.0(jiti@2.6.1)): + dependencies: + eslint: 10.6.0(jiti@2.6.1) + + eslint-plugin-jsdoc@63.0.10(eslint@10.6.0(jiti@2.6.1)): + dependencies: + '@es-joy/jsdoccomment': 0.87.0 + '@es-joy/resolve.exports': 1.2.0 + are-docs-informative: 0.0.2 + comment-parser: 1.4.7 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint: 10.6.0(jiti@2.6.1) + espree: 11.2.0 + esquery: 1.7.0 + html-entities: 2.6.0 + object-deep-merge: 2.0.1 + parse-imports-exports: 0.2.4 + semver: 7.8.5 + spdx-expression-parse: 4.0.0 + to-valid-identifier: 1.0.0 + transitivePeerDependencies: + - supports-color + + eslint-plugin-regexp@3.1.1(eslint@10.6.0(jiti@2.6.1)): dependencies: - '@sindresorhus/is': 6.3.0 - callsites: 4.1.0 - dot-prop: 8.0.2 - environment: 1.1.0 - fast-equals: 5.0.1 - is-identifier: 1.0.0 - dev: false + '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + comment-parser: 1.4.7 + eslint: 10.6.0(jiti@2.6.1) + jsdoc-type-pratt-parser: 7.2.0 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + scslre: 0.3.0 - /p-any@2.1.0: - resolution: {integrity: sha512-JAERcaMBLYKMq+voYw36+x5Dgh47+/o7yuv2oQYuSSUml4YeqJEFznBrY2UeEkoSHqBua6hz518n/PsowTYLLg==} - engines: {node: '>=8'} + eslint-plugin-unused-imports@4.4.1(eslint@10.6.0(jiti@2.6.1)): dependencies: - p-cancelable: 2.1.1 - p-some: 4.1.0 - type-fest: 0.3.1 - dev: true + eslint: 10.6.0(jiti@2.6.1) - /p-cancelable@0.3.0: - resolution: {integrity: sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==} - engines: {node: '>=4'} - dev: false + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 - /p-cancelable@0.4.1: - resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==} - engines: {node: '>=4'} - dev: false + eslint-visitor-keys@3.4.3: {} - /p-cancelable@1.1.0: - resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} - engines: {node: '>=6'} - dev: true + eslint-visitor-keys@5.0.1: {} - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: true + eslint@10.6.0(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color - /p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} - dev: true + espree@11.2.0: + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 5.0.1 - /p-defer@1.0.0: - resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} - engines: {node: '>=4'} - dev: true + esprima@4.0.1: {} - /p-event@1.3.0: - resolution: {integrity: sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==} - engines: {node: '>=4'} + esquery@1.7.0: dependencies: - p-timeout: 1.2.1 - dev: false + estraverse: 5.3.0 - /p-event@2.3.1: - resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==} - engines: {node: '>=6'} + esrecurse@4.3.0: dependencies: - p-timeout: 2.0.1 - dev: false + estraverse: 5.3.0 - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} + estraverse@5.3.0: {} - /p-is-promise@1.1.0: - resolution: {integrity: sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==} - engines: {node: '>=4'} - dev: false + esutils@2.0.3: {} - /p-is-promise@2.1.0: - resolution: {integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==} - engines: {node: '>=6'} - dev: true + etag@1.8.1: {} - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + eventemitter3@4.0.7: {} + + eventemitter3@5.0.4: {} + + events-universal@1.0.1: dependencies: - p-try: 2.2.0 - dev: true + bare-events: 2.9.1 + transitivePeerDependencies: + - bare-abort-controller - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + expand-tilde@2.0.2: dependencies: - yocto-queue: 0.1.0 - dev: true + homedir-polyfill: 1.0.3 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + extend-shallow@1.1.4: dependencies: - yocto-queue: 1.0.0 - dev: true + kind-of: 1.1.0 - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + extend-shallow@2.0.1: dependencies: - p-limit: 2.3.0 - dev: true + is-extendable: 0.1.1 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + extend-shallow@3.0.2: dependencies: - p-limit: 3.1.0 - dev: true + assign-symbols: 1.0.0 + is-extendable: 1.0.1 - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + extend@3.0.2: {} + + fancy-log@1.3.3: dependencies: - p-limit: 4.0.0 - dev: true + ansi-gray: 0.1.1 + color-support: 1.1.3 + parse-node-version: 1.0.1 + time-stamp: 1.1.0 - /p-map-series@1.0.0: - resolution: {integrity: sha512-4k9LlvY6Bo/1FcIdV33wqZQES0Py+iKISU9Uc8p8AjWoZPnFKMpVIVD3s0EYn4jzLh1I+WeUZkJ0Yoa4Qfw3Kg==} - engines: {node: '>=4'} + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.3: dependencies: - p-reduce: 1.0.0 - dev: false + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: true + fast-json-stable-stringify@2.1.0: {} - /p-memoize@2.1.0: - resolution: {integrity: sha512-c6+a2iV4JyX0r4+i2IBJYO0r6LZAT2fg/tcB6GQbv1uzZsfsmKT7Ej5DRT1G6Wi7XUJSV2ZiP9+YEtluvhCmkg==} - engines: {node: '>=6'} + fast-levenshtein@2.0.6: {} + + fast-levenshtein@3.0.0: dependencies: - mem: 4.3.0 - mimic-fn: 1.2.0 - dev: true + fastest-levenshtein: 1.0.16 - /p-pipe@4.0.0: - resolution: {integrity: sha512-HkPfFklpZQPUKBFXzKFB6ihLriIHxnmuQdK9WmLDwe4hf2PdhhfWT/FJa+pc3bA1ywvKXtedxIRmd4Y7BTXE4w==} - engines: {node: '>=12'} - dev: false + fast-uri@3.1.3: {} - /p-reduce@1.0.0: - resolution: {integrity: sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==} - engines: {node: '>=4'} - dev: false + fastest-levenshtein@1.0.16: {} - /p-some@4.1.0: - resolution: {integrity: sha512-MF/HIbq6GeBqTrTIl5OJubzkGU+qfFhAFi0gnTAK6rgEIJIknEiABHOTtQu4e6JiXjIwuMPMUFQzyHh5QjCl1g==} - engines: {node: '>=8'} + fastq@1.20.1: dependencies: - aggregate-error: 3.1.0 - p-cancelable: 2.1.1 - dev: true + reusify: 1.1.0 - /p-timeout@1.2.1: - resolution: {integrity: sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==} - engines: {node: '>=4'} + fault@2.0.1: dependencies: - p-finally: 1.0.0 - dev: false + format: 0.2.2 - /p-timeout@2.0.1: - resolution: {integrity: sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==} - engines: {node: '>=4'} + favicons@7.3.0: dependencies: - p-finally: 1.0.0 - dev: false + escape-html: 1.0.3 + sharp: 0.35.2 + xml2js: 0.6.2 - /p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-entry-cache@11.1.5: dependencies: - p-finally: 1.0.0 - dev: true + flat-cache: 6.1.23 - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /pac-proxy-agent@7.0.1: - resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} - engines: {node: '>= 14'} - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.1 - debug: 4.3.4 - get-uri: 6.0.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.3 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.1.0: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.3.1 + unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + findup-sync@5.0.0: dependencies: - degenerator: 5.0.1 - netmask: 2.0.2 - dev: true + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.8 + resolve-dir: 1.0.1 - /package-json@8.1.1: - resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} - engines: {node: '>=14.16'} + fined@2.0.0: dependencies: - got: 12.6.1 - registry-auth-token: 5.0.2 - registry-url: 6.0.1 - semver: 7.6.0 - dev: true + expand-tilde: 2.0.2 + is-plain-object: 5.0.0 + object.defaults: 1.1.0 + object.pick: 1.3.0 + parse-filepath: 1.0.2 - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: false + first-chunk-stream@5.0.0: {} - /parallel-transform@1.2.0: - resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} - dependencies: - cyclist: 1.0.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: false + flagged-respawn@2.0.0: {} - /param-case@2.1.1: - resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + flat-cache@4.0.1: dependencies: - no-case: 2.3.2 - dev: false + flatted: 3.4.2 + keyv: 4.5.4 - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + flat-cache@6.1.23: dependencies: - callsites: 3.1.0 - dev: true + cacheable: 2.5.0 + flatted: 3.4.2 + hookified: 1.15.1 - /parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} - dependencies: - '@types/unist': 2.0.10 - character-entities: 2.0.2 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - dev: true + flatted@3.4.2: {} - /parse-filepath@1.0.2: - resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} - engines: {node: '>=0.8'} - dependencies: - is-absolute: 1.0.0 - map-cache: 0.2.2 - path-root: 0.1.1 - dev: false + follow-redirects@1.16.0: {} - /parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} - dependencies: - error-ex: 1.3.2 - dev: false + for-in@1.0.2: {} - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + for-own@1.0.0: dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: false + for-in: 1.0.2 - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + foreground-child@3.3.1: dependencies: - '@babel/code-frame': 7.24.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true + cross-spawn: 7.0.6 + signal-exit: 4.1.0 - /parse-json@7.1.1: - resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} - engines: {node: '>=16'} - dependencies: - '@babel/code-frame': 7.24.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 3.0.2 - lines-and-columns: 2.0.4 - type-fest: 3.13.1 - dev: true + format@0.2.2: {} - /parse-node-version@1.0.1: - resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} - engines: {node: '>= 0.10'} - dev: false + fraction.js@5.3.4: {} - /parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - dev: false + fresh@0.5.2: {} - /parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + fs-extra@3.0.1: dependencies: - protocols: 2.0.1 - dev: true + graceful-fs: 4.2.11 + jsonfile: 3.0.1 + universalify: 0.1.2 - /parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + fs-mkdirp-stream@2.0.1: dependencies: - parse-path: 7.0.0 - dev: true + graceful-fs: 4.2.11 + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} - dependencies: - domhandler: 5.0.3 - parse5: 7.1.2 - dev: false + fsevents@2.3.2: + optional: true - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: false + fsevents@2.3.3: + optional: true - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: false + function-bind@1.1.2: {} - /pascalcase@0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} - engines: {node: '>=0.10.0'} - dev: false + get-caller-file@2.0.5: {} - /path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - dev: false + get-east-asian-width@1.6.0: {} - /path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} + get-value@3.0.1: dependencies: - pinkie-promise: 2.0.1 - dev: false - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - requiresBuild: true - dev: false + isobject: 3.0.1 - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + git-raw-commits@5.0.1: + dependencies: + '@conventional-changelog/git-client': 2.7.0 + meow: 13.2.0 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + github-slugger@2.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 - /path-root-regex@0.1.2: - resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} - engines: {node: '>=0.10.0'} - dev: false + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 - /path-root@0.1.1: - resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} - engines: {node: '>=0.10.0'} + glob-stream@8.0.3: dependencies: - path-root-regex: 0.1.2 - dev: false + '@gulpjs/to-absolute-glob': 4.0.0 + anymatch: 3.1.3 + fastq: 1.20.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + is-negated-glob: 1.0.0 + normalize-path: 3.0.0 + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + glob-watcher@6.0.0: dependencies: - lru-cache: 10.2.2 - minipass: 7.1.1 + async-done: 2.0.0 + chokidar: 3.6.0 - /path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} + glob@10.5.0: dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - pinkie-promise: 2.0.1 - dev: false + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + glob@11.1.0: dependencies: - pify: 3.0.0 - dev: false + foreground-child: 3.3.1 + jackspeak: 4.2.3 + minimatch: 10.2.5 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.2 - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 - /path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} + global-directory@5.0.0: + dependencies: + ini: 6.0.0 - /peek-readable@5.0.0: - resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} - engines: {node: '>=14.16'} - dev: false + global-modules@1.0.0: + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: false + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + global-prefix@1.0.2: + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + globals@17.7.0: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: false + globby@14.1.0: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: false + globby@16.2.0: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + is-path-inside: 4.0.0 + slash: 5.1.0 + unicorn-magic: 0.4.0 - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: false + globjoin@0.1.4: {} - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} + glogg@2.2.0: dependencies: - pinkie: 2.0.4 - dev: false + sparkles: 2.1.0 - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: false + graceful-fs@4.2.11: {} - /plugin-error@0.1.2: - resolution: {integrity: sha512-WzZHcm4+GO34sjFMxQMqZbsz3xiNEgonCskQ9v+IroMmYgk/tas8dG+Hr2D6IbRPybZ12oWpzE/w3cGJ6FJzOw==} - engines: {node: '>=0.10.0'} + gray-matter@4.0.3: dependencies: - ansi-cyan: 0.1.1 - ansi-red: 0.1.1 - arr-diff: 1.1.0 - arr-union: 2.1.0 - extend-shallow: 1.1.4 - dev: false + js-yaml: 3.15.0 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 - /plugin-error@1.0.1: - resolution: {integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==} - engines: {node: '>= 0.10'} + group-array@1.0.0: dependencies: - ansi-colors: 1.1.0 - arr-diff: 4.0.0 - arr-union: 3.1.0 - extend-shallow: 3.0.2 - dev: false + arr-flatten: 1.1.0 + for-own: 1.0.0 + get-value: 3.0.1 + kind-of: 6.0.3 + split-string: 6.1.0 + union-value: 2.0.1 - /plugin-error@2.0.1: - resolution: {integrity: sha512-zMakqvIDyY40xHOvzXka0kUvf40nYIuwRE8dWhti2WtjQZ31xAgBZBhxsK7vK3QbRXS1Xms/LO7B5cuAsfB2Gg==} - engines: {node: '>=10.13.0'} + gulp-cli@3.1.0: dependencies: - ansi-colors: 1.1.0 - dev: false + '@gulpjs/messages': 1.1.0 + chalk: 4.1.2 + copy-props: 4.0.0 + gulplog: 2.2.0 + interpret: 3.1.1 + liftoff: 5.0.1 + mute-stdout: 2.0.0 + replace-homedir: 2.0.0 + semver-greatest-satisfied-range: 2.0.0 + string-width: 4.2.3 + v8flags: 4.0.1 + yargs: 16.2.2 - /plur@5.1.0: - resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + gulp-data@1.3.1: dependencies: - irregular-plurals: 3.5.0 - dev: false - - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true + plugin-error: 0.1.2 + through2: 2.0.5 + util-extend: 1.0.3 - /portscanner@2.2.0: - resolution: {integrity: sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==} - engines: {node: '>=0.4', npm: '>=1.0.0'} + gulp-esbuild@0.15.0(esbuild@0.28.1)(gulp@5.0.1): dependencies: - async: 2.6.4 - is-number-like: 1.0.8 - dev: false - - /posix-character-classes@0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} - engines: {node: '>=0.10.0'} - dev: false - - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: true + esbuild: 0.28.1 + gulp: 5.0.1 + plugin-error: 2.0.1 + vinyl: 3.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /postcss-bem-linter@4.0.1(postcss@8.4.38): - resolution: {integrity: sha512-jTG3uMo6n2YyxLBPLsRN+5R9djNJZ3mirAugvnYbZaZOwPmLb/MaQ2uql0fSdVYegjZBmX8tW5B0mfZigiXZ9Q==} - peerDependencies: - postcss: ^8.4.21 + gulp-inject@5.0.5: dependencies: - minimatch: 3.1.2 - postcss: 8.4.38 - postcss-resolve-nested-selector: 0.1.1 - dev: true + ansi-colors: 4.1.3 + arrify: 2.0.1 + escape-string-regexp: 2.0.0 + fancy-log: 1.3.3 + group-array: 1.0.0 + plugin-error: 1.0.1 + stream-to-array: 2.3.0 + through2: 3.0.2 - /postcss-calc@10.0.0(postcss@8.4.38): - resolution: {integrity: sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==} - engines: {node: ^18.12 || ^20.9 || >=22.0} - peerDependencies: - postcss: ^8.4.38 + gulp-jsbeautifier@3.0.1: dependencies: - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 - postcss-value-parser: 4.2.0 - dev: false + ansi-colors: 4.1.3 + cosmiconfig: 5.2.1 + fancy-log: 1.3.3 + js-beautify: 1.15.4 + lodash.mergewith: 4.6.2 + plugin-error: 1.0.1 + through2: 3.0.2 - /postcss-colormin@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-5CN6fqtsEtEtwf3mFV3B4UaZnlYljPpzmGeDB4yCK067PnAtfLe9uX2aFZaEwxHE7HopG5rUkW8gyHrNAesHEg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + gulp-nunjucks-render@2.2.3(chokidar@3.6.0): dependencies: - browserslist: 4.23.0 - caniuse-api: 3.0.0 - colord: 2.9.3 - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + lodash: 4.18.1 + nunjucks: 3.2.4(chokidar@3.6.0) + plugin-error: 1.0.1 + replace-ext: 1.0.1 + through2: 2.0.5 + transitivePeerDependencies: + - chokidar - /postcss-convert-values@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-bMuzDgXBbFbByPgj+/r6va8zNuIDUaIIbvAFgdO1t3zdgJZ77BZvu6dfWyd6gHEJnYzmeVr9ayUsAQL3/qLJ0w==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + gulp-plugin-extras@1.1.0: dependencies: - browserslist: 4.23.0 - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + '@types/vinyl': 2.0.12 + chalk: 5.6.2 + easy-transform-stream: 1.0.1 - /postcss-discard-comments@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-xpSdzRqYmy4YIVmjfGyYXKaI1SRnK6CTr+4Zmvyof8ANwvgfZgGdVtmgAvzh59gJm808mJCWQC9tFN0KF5dEXA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + gulp-purgecss@8.0.0: dependencies: - postcss: 8.4.38 - dev: false + fast-glob: 3.3.3 + plugin-error: 2.0.1 + purgecss: 8.0.0 + through2: 4.0.2 + vinyl-sourcemaps-apply: 0.2.1 - /postcss-discard-duplicates@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + gulp-rev-rewrite@6.0.0: dependencies: - postcss: 8.4.38 - dev: false + escape-string-regexp: 5.0.0 + plugin-error: 2.0.1 - /postcss-discard-empty@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + gulp-rev@12.0.0(gulp@5.0.1): dependencies: - postcss: 8.4.38 - dev: false + gulp-plugin-extras: 1.1.0 + modify-filename: 2.0.0 + rev-hash: 4.1.0 + rev-path: 3.0.0 + sort-keys: 6.0.1 + vinyl: 3.0.1 + vinyl-file: 5.0.0 + optionalDependencies: + gulp: 5.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /postcss-discard-overridden@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + gulp-sri-hash@2.2.1: dependencies: - postcss: 8.4.38 - dev: false + cheerio: 1.2.0 + plugin-error: 1.0.1 + through2: 3.0.2 - /postcss-load-config@5.1.0(postcss@8.4.38): - resolution: {integrity: sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true + gulp@5.0.1: dependencies: - lilconfig: 3.1.1 - postcss: 8.4.38 - yaml: 2.4.2 - dev: false + glob-watcher: 6.0.0 + gulp-cli: 3.1.0 + undertaker: 2.0.0 + vinyl-fs: 4.0.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /postcss-media-query-parser@0.2.3: - resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} - dev: true + gulplog@2.2.0: + dependencies: + glogg: 2.2.0 - /postcss-merge-longhand@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-0X8I4/9+G03X5/5NnrfopG/YEln2XU8heDh7YqBaiq2SeaKIG3n66ShZPjIolmVuLBQ0BEm3yS8o1mlCLHdW7A==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + handlebars@4.7.9: dependencies: - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - stylehacks: 7.0.0(postcss@8.4.38) - dev: false + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-flag@4.0.0: {} - /postcss-merge-rules@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-Zty3VlOsD6VSjBMu6PiHCVpLegtBT/qtZRVBcSeyEZ6q1iU5qTYT0WtEoLRV+YubZZguS5/ycfP+NRiKfjv6aw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - dependencies: - browserslist: 4.23.0 - caniuse-api: 3.0.0 - cssnano-utils: 5.0.0(postcss@8.4.38) - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 - dev: false + has-flag@5.0.1: {} - /postcss-minify-font-values@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + hashery@1.5.1: dependencies: - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + hookified: 1.15.1 - /postcss-minify-gradients@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + hasown@2.0.4: dependencies: - colord: 2.9.3 - cssnano-utils: 5.0.0(postcss@8.4.38) - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + function-bind: 1.1.2 - /postcss-minify-params@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-XOJAuX8Q/9GT1sGxlUvaFEe2H9n50bniLZblXXsAT/BwSfFYvzSZeFG7uupwc0KbKpTnflnQ7aMwGzX6JUWliQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + homedir-polyfill@1.0.3: dependencies: - browserslist: 4.23.0 - cssnano-utils: 5.0.0(postcss@8.4.38) - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + parse-passwd: 1.0.0 - /postcss-minify-selectors@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-f00CExZhD6lNw2vTZbcnmfxVgaVKzUw6IRsIFX3JTT8GdsoABc1WnhhGwL1i8YPJ3sSWw39fv7XPtvLb+3Uitw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - dependencies: - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 - dev: false + hookified@1.15.1: {} - /postcss-normalize-charset@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - dependencies: - postcss: 8.4.38 - dev: false + hookified@2.2.0: {} - /postcss-normalize-display-values@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + hosted-git-info@7.0.2: dependencies: - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + lru-cache: 10.4.3 - /postcss-normalize-positions@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + html-entities@2.6.0: {} + + html-tags@5.1.0: {} + + html-validate@11.5.5: dependencies: - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + '@html-validate/stylish': 6.0.0 + '@sidvind/better-ajv-errors': 7.0.0(ajv@8.20.0) + ajv: 8.20.0 + kleur: 4.1.5 + prompts: 2.4.2 + semver: 7.8.5 - /postcss-normalize-repeat-style@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + htmlparser2@10.1.0: dependencies: - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 - /postcss-normalize-string@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + http-errors@1.8.1: dependencies: - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 - /postcss-normalize-timing-functions@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + http-errors@2.0.1: dependencies: - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 - /postcss-normalize-unicode@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-OnKV52/VFFDAim4n0pdI+JAhsolLBdnCKxE6VV5lW5Q/JeVGFN8UM8ur6/A3EAMLsT1ZRm3fDHh/rBoBQpqi2w==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + http-proxy@1.18.1: dependencies: - browserslist: 4.23.0 - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + eventemitter3: 4.0.7 + follow-redirects: 1.16.0 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug - /postcss-normalize-url@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + iconv-lite@0.4.24: dependencies: - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + safer-buffer: 2.1.2 - /postcss-normalize-whitespace@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + iconv-lite@0.6.3: dependencies: - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + safer-buffer: 2.1.2 - /postcss-ordered-values@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-KROvC63A8UQW1eYDljQe1dtwc1E/M+mMwDT6z7khV/weHYLWTghaLRLunU7x1xw85lWFwVZOAGakxekYvKV+0w==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + iconv-lite@0.7.2: dependencies: - cssnano-utils: 5.0.0(postcss@8.4.38) - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + safer-buffer: 2.1.2 - /postcss-reduce-initial@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-iqGgmBxY9LrblZ0BKLjmrA1mC/cf9A/wYCCqSmD6tMi+xAyVl0+DfixZIHSVDMbCPRPjNmVF0DFGth/IDGelFQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + ignore@6.0.2: {} + + ignore@7.0.5: {} + + immutable@3.8.3: {} + + immutable@5.1.9: {} + + import-fresh@2.0.0: dependencies: - browserslist: 4.23.0 - caniuse-api: 3.0.0 - postcss: 8.4.38 - dev: false + caller-path: 2.0.0 + resolve-from: 3.0.0 - /postcss-reduce-transforms@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + import-fresh@3.3.1: dependencies: - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - dev: false + parent-module: 1.0.1 + resolve-from: 4.0.0 - /postcss-resolve-nested-selector@0.1.1: - resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==} - dev: true + import-meta-resolve@4.2.0: {} - /postcss-safe-parser@6.0.0(postcss@8.4.38): - resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.3.3 - dependencies: - postcss: 8.4.38 - dev: true + imurmurhash@0.1.4: {} - /postcss-safe-parser@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==} - engines: {node: '>=18.0'} - peerDependencies: - postcss: ^8.4.31 + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@4.1.3: {} + + ini@6.0.0: {} + + inquirer@9.3.8(@types/node@26.0.1): dependencies: - postcss: 8.4.38 - dev: true + '@inquirer/external-editor': 1.0.3(@types/node@26.0.1) + '@inquirer/figures': 1.0.15 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + transitivePeerDependencies: + - '@types/node' - /postcss-scss@4.0.9(postcss@8.4.38): - resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.4.29 + interpret@3.1.1: {} + + is-absolute@1.0.0: dependencies: - postcss: 8.4.38 + is-relative: 1.0.0 + is-windows: 1.0.2 - /postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} - engines: {node: '>=4'} + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 - /postcss-sorting@7.0.1(postcss@8.4.38): - resolution: {integrity: sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g==} - peerDependencies: - postcss: ^8.3.9 + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: dependencies: - postcss: 8.4.38 - dev: true + binary-extensions: 2.3.0 - /postcss-svgo@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-Xj5DRdvA97yRy3wjbCH2NKXtDUwEnph6EHr5ZXszsBVKCNrKXYBjzAXqav7/Afz5WwJ/1peZoTguCEJIg7ytmA==} - engines: {node: ^18.12.0 || ^20.9.0 || >= 18} - peerDependencies: - postcss: ^8.4.31 + is-core-module@2.16.2: dependencies: - postcss: 8.4.38 - postcss-value-parser: 4.2.0 - svgo: 3.3.2 - dev: false + hasown: 2.0.4 - /postcss-unique-selectors@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-NYFqcft7vVQMZlQPsMdMPy+qU/zDpy95Malpw4GeA9ZZjM6dVXDshXtDmLc0m4WCD6XeZCJqjTfPT1USsdt+rA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + is-decimal@2.0.1: {} + + is-directory@0.3.1: {} + + is-empty@1.2.0: {} + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: dependencies: - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 - dev: false + is-plain-object: 2.0.4 - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + is-extglob@2.1.1: {} - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@5.1.0: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + get-east-asian-width: 1.6.0 - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 - /prepend-http@1.0.4: - resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} - engines: {node: '>=0.10.0'} - dev: false + is-hexadecimal@2.0.1: {} - /prepend-http@2.0.0: - resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} - engines: {node: '>=4'} + is-interactive@1.0.0: {} - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + is-negated-glob@1.0.0: {} + + is-number-like@1.0.8: dependencies: - fast-diff: 1.3.0 - dev: true + lodash.isfinite: 3.3.2 - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true + is-number@7.0.0: {} - /pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} - dev: false + is-path-cwd@3.0.0: {} - /pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} - dev: false + is-path-inside@4.0.0: {} - /proc-log@4.2.0: - resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + is-plain-obj@4.1.0: {} - /process-nextick-args@1.0.7: - resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} - dev: false + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: false + is-plain-object@5.0.0: {} - /promise.allsettled@1.0.7: - resolution: {integrity: sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA==} - engines: {node: '>= 0.4'} + is-relative@1.0.0: dependencies: - array.prototype.map: 1.0.7 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - get-intrinsic: 1.2.4 - iterate-value: 1.0.2 - dev: true + is-unc-path: 1.0.0 - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + is-unc-path@1.0.0: dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 + unc-path-regex: 0.1.2 - /proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + is-unicode-supported@0.1.0: {} - /protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - dev: true - - /proxy-agent@6.4.0: - resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.1 - debug: 4.3.4 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.3 - transitivePeerDependencies: - - supports-color - dev: true + is-utf8@0.2.1: {} - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true + is-valid-glob@1.0.0: {} - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: false + is-windows@1.0.2: {} - /public-ip@4.0.4: - resolution: {integrity: sha512-EJ0VMV2vF6Cu7BIPo3IMW1Maq6ME+fbR0NcPmqDfpfNGIRPue1X8QrGjrg/rfjDkOsIkKHIf2S5FlEa48hFMTA==} - engines: {node: '>=8'} - dependencies: - dns-socket: 4.2.2 - got: 9.6.0 - is-ip: 3.1.0 - dev: true + is-wsl@1.1.0: {} - /pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: false + isarray@1.0.0: {} + + isbinaryfile@5.0.7: {} + + isexe@2.0.0: {} + + isexe@3.1.5: {} - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + isobject@3.0.1: {} + + jackspeak@3.4.3: dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 - /pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + jackspeak@4.2.3: dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - dev: false + '@isaacs/cliui': 9.0.0 - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + jiti@2.6.1: {} - /pupa@3.1.0: - resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} - engines: {node: '>=12.20'} + js-beautify@1.15.4: dependencies: - escape-goat: 4.0.0 - dev: true + config-chain: 1.1.13 + editorconfig: 1.0.7 + glob: 10.5.0 + js-cookie: 3.0.8 + nopt: 7.2.1 - /purgecss@6.0.0: - resolution: {integrity: sha512-s3EBxg5RSWmpqd0KGzNqPiaBbWDz1/As+2MzoYVGMqgDqRTLBhJW6sywfTBek7OwNfoS/6pS0xdtvChNhFj2cw==} - hasBin: true + js-cookie@3.0.8: {} + + js-tokens@4.0.0: {} + + js-yaml@3.15.0: dependencies: - commander: 12.0.0 - glob: 10.3.15 - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 - dev: false + argparse: 1.0.10 + esprima: 4.0.1 - /query-string@5.1.1: - resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} - engines: {node: '>=0.10.0'} + js-yaml@4.3.0: dependencies: - decode-uri-component: 0.2.2 - object-assign: 4.1.1 - strict-uri-encode: 1.1.0 - dev: false + argparse: 2.0.1 - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + jsdoc-type-pratt-parser@7.2.0: {} - /queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - dev: false + jsesc@3.1.0: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true + json-buffer@3.0.1: {} - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: true + json-parse-better-errors@1.0.2: {} - /quotation@2.0.3: - resolution: {integrity: sha512-yEc24TEgCFLXx7D4JHJJkK4JFVtatO8fziwUxY4nB/Jbea9o9CVS3gt22mA0W7rPYAGW2fWzYDSOtD94PwOyqA==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: false + json-parse-even-better-errors@3.0.2: {} - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: false + json-schema-traverse@0.4.1: {} - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: true + json-schema-traverse@1.0.0: {} - /rcfinder@0.1.9: - resolution: {integrity: sha512-rhSo812VIVaX7cxl33KkllHRwfLvjZL3lQedWEpQ27YlMFKZbFZsiVdCcQn/Z0FauLWxIpKrNREGuHbJFSi0Lw==} - engines: {node: '>=0.10'} - dependencies: - lodash.clonedeep: 4.5.0 - dev: false + json-stable-stringify-without-jsonify@1.0.1: {} - /rcloader@0.1.4: - resolution: {integrity: sha512-yO55pqRfpdrXV5JhgSNSH+OIu0webqeBGlxmzT1fL1qckiqoRoPBtYkKT7pALsKFPZoE5ZZnRCyEUnC1z/xEcg==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - lodash: 3.10.1 - rcfinder: 0.1.9 - dev: false + json5@2.2.3: {} - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - json-parse-even-better-errors: 3.0.2 - npm-normalize-package-bin: 3.0.1 - dev: true + jsonfile@3.0.1: + optionalDependencies: + graceful-fs: 4.2.11 - /read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} + keyv@4.5.4: dependencies: - find-up: 1.1.2 - read-pkg: 1.1.0 - dev: false + json-buffer: 3.0.1 - /read-pkg-up@10.1.0: - resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} - engines: {node: '>=16'} + keyv@5.6.0: dependencies: - find-up: 6.3.0 - read-pkg: 8.1.0 - type-fest: 4.18.2 - dev: true + '@keyv/serialize': 1.1.1 - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true + kind-of@1.1.0: {} - /read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} - dependencies: - load-json-file: 1.1.0 - normalize-package-data: 2.5.0 - path-type: 1.1.0 - dev: false + kind-of@6.0.3: {} - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true + kleur@3.0.3: {} - /read-pkg@8.1.0: - resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} - engines: {node: '>=16'} - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.1 - parse-json: 7.1.1 - type-fest: 4.18.2 - dev: true + kleur@4.1.5: {} + + known-css-properties@0.37.0: {} - /readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + last-run@2.0.0: {} + + lead@4.0.0: {} + + lefthook-darwin-arm64@2.1.9: + optional: true + + lefthook-darwin-x64@2.1.9: + optional: true + + lefthook-freebsd-arm64@2.1.9: + optional: true + + lefthook-freebsd-x64@2.1.9: + optional: true + + lefthook-linux-arm64@2.1.9: + optional: true + + lefthook-linux-x64@2.1.9: + optional: true + + lefthook-openbsd-arm64@2.1.9: + optional: true + + lefthook-openbsd-x64@2.1.9: + optional: true + + lefthook-windows-arm64@2.1.9: + optional: true + + lefthook-windows-x64@2.1.9: + optional: true + + lefthook@2.1.9: + optionalDependencies: + lefthook-darwin-arm64: 2.1.9 + lefthook-darwin-x64: 2.1.9 + lefthook-freebsd-arm64: 2.1.9 + lefthook-freebsd-x64: 2.1.9 + lefthook-linux-arm64: 2.1.9 + lefthook-linux-x64: 2.1.9 + lefthook-openbsd-arm64: 2.1.9 + lefthook-openbsd-x64: 2.1.9 + lefthook-windows-arm64: 2.1.9 + lefthook-windows-x64: 2.1.9 + + levn@0.4.1: dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - dev: false + prelude-ls: 1.2.1 + type-check: 0.4.0 - /readable-stream@1.1.14: - resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + liftoff@5.0.1: dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - dev: false + extend: 3.0.2 + findup-sync: 5.0.0 + fined: 2.0.0 + flagged-respawn: 2.0.0 + is-plain-object: 5.0.0 + rechoir: 0.8.0 + resolve: 1.22.12 + + lilconfig@3.1.3: {} - /readable-stream@2.0.6: - resolution: {integrity: sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 1.0.7 - string_decoder: 0.10.31 - util-deprecate: 1.0.2 - dev: false + limiter@1.1.5: {} - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + lines-and-columns@1.2.4: {} + + lines-and-columns@2.0.4: {} + + linkify-it@5.0.1: dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: false + uc.micro: 2.1.0 - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + linkinator@7.6.1: dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 + chalk: 5.6.2 + escape-html: 1.0.3 + glob: 13.0.6 + htmlparser2: 10.1.0 + marked: 17.0.6 + marked-gfm-heading-id: 4.1.4(marked@17.0.6) + meow: 14.1.0 + mime: 4.1.0 + srcset: 5.0.3 + undici: 7.28.0 + + lint-staged@17.0.8: + dependencies: + listr2: 10.2.2 + picomatch: 4.0.4 + string-argv: 0.3.2 + tinyexec: 1.2.4 + optionalDependencies: + yaml: 2.9.0 - /readable-web-to-node-stream@3.0.2: - resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} - engines: {node: '>=8'} + listr2@10.2.2: dependencies: - readable-stream: 3.6.2 - dev: false + cli-truncate: 5.2.0 + eventemitter3: 5.0.4 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 10.0.0 - /readdirp@2.2.1: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} + load-plugin@6.0.3: dependencies: - graceful-fs: 4.2.11 - micromatch: 3.1.10 - readable-stream: 2.3.8 + '@npmcli/config': 8.3.4 + import-meta-resolve: 4.2.0 transitivePeerDependencies: - - supports-color - dev: false + - bluebird - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + locate-path@6.0.0: dependencies: - picomatch: 2.3.1 + p-locate: 5.0.0 - /rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - dependencies: - resolve: 1.22.8 + lodash.isfinite@3.3.2: {} - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true + lodash.mergewith@4.6.2: {} - /refa@0.12.1: - resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + lodash.truncate@4.4.2: {} + + lodash@4.18.1: {} + + log-symbols@4.1.0: dependencies: - '@eslint-community/regexpp': 4.10.0 - dev: true + chalk: 4.1.2 + is-unicode-supported: 0.1.0 - /regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} - engines: {node: '>=4'} + log-update@6.1.0: dependencies: - regenerate: 1.4.2 - dev: true + ansi-escapes: 7.3.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: true + longest-streak@3.1.0: {} - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: true + lru-cache@10.4.3: {} - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - dependencies: - '@babel/runtime': 7.24.5 - dev: true + lru-cache@11.5.1: {} - /regex-not@1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} + map-cache@0.2.2: {} + + markdown-extensions@2.0.0: {} + + markdown-it@14.2.0: dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - dev: false + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.1 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 - /regexp-ast-analysis@0.7.1: - resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + markdown-table@3.0.4: {} + + marked-gfm-heading-id@4.1.4(marked@17.0.6): dependencies: - '@eslint-community/regexpp': 4.10.0 - refa: 0.12.1 - dev: true + github-slugger: 2.0.0 + marked: 17.0.6 - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + marked@17.0.6: {} + + mathml-tag-names@4.0.0: {} + + mdast-comment-marker@3.0.0: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - dev: true + '@types/mdast': 4.0.4 + mdast-util-mdx-expression: 2.0.1 + transitivePeerDependencies: + - supports-color - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} + mdast-util-directive@3.1.0: dependencies: - '@babel/regjsgen': 0.8.0 - regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 - regjsparser: 0.9.1 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - dev: true + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.2 + transitivePeerDependencies: + - supports-color - /registry-auth-token@5.0.2: - resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} - engines: {node: '>=14'} + mdast-util-find-and-replace@3.0.2: dependencies: - '@pnpm/npm-conf': 2.2.2 - dev: true + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 - /registry-url@6.0.1: - resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} - engines: {node: '>=12'} + mdast-util-from-markdown@2.0.3: dependencies: - rc: 1.2.8 - dev: true + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true + mdast-util-frontmatter@2.0.1: dependencies: - jsesc: 0.5.0 - dev: true + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color - /relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - dev: false + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 - /release-it@17.2.1(typescript@5.4.5): - resolution: {integrity: sha512-zBOpaHyjrXC3g/9rHyQlvuDw9yCn9AGphrlL+t3gWNEhbZKEQ62WNY45JxllcJMNx9orQUxBZ3o7pVCqkeuTbg==} - engines: {node: ^18.18.0 || ^20.8.0 || ^21.0.0} - hasBin: true + mdast-util-gfm-footnote@2.1.0: dependencies: - '@iarna/toml': 2.2.5 - '@octokit/rest': 20.1.0 - async-retry: 1.3.3 - chalk: 5.3.0 - cosmiconfig: 9.0.0(typescript@5.4.5) - execa: 8.0.1 - git-url-parse: 14.0.0 - globby: 14.0.1 - got: 13.0.0 - inquirer: 9.2.19 - is-ci: 3.0.1 - issue-parser: 7.0.0 - lodash: 4.17.21 - mime-types: 2.1.35 - new-github-release-url: 2.0.0 - node-fetch: 3.3.2 - open: 10.1.0 - ora: 8.0.1 - os-name: 5.1.0 - promise.allsettled: 1.0.7 - proxy-agent: 6.4.0 - semver: 7.6.0 - shelljs: 0.8.5 - update-notifier: 7.0.0 - url-join: 5.0.0 - wildcard-match: 5.1.3 - yargs-parser: 21.1.1 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color - - typescript - dev: true - /remark-cli@12.0.1: - resolution: {integrity: sha512-2NAEOACoTgo+e+YAaCTODqbrWyhMVmlUyjxNCkTrDRHHQvH6+NbrnqVvQaLH/Q8Ket3v90A43dgAJmXv8y5Tkw==} - hasBin: true + mdast-util-gfm-strikethrough@2.0.0: dependencies: - import-meta-resolve: 4.1.0 - markdown-extensions: 2.0.0 - remark: 15.0.1 - unified-args: 11.0.1 + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - dev: true - /remark-frontmatter@5.0.0: - resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + mdast-util-gfm-table@2.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-frontmatter: 2.0.1 - micromark-extension-frontmatter: 2.0.0 - unified: 11.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - dev: true - /remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + mdast-util-gfm-task-list-item@2.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-gfm: 3.0.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - dev: true - /remark-lint-blockquote-indentation@4.0.0: - resolution: {integrity: sha512-hdUvn+KsJbBKpY9jLY01PmfpJ/WGhLu9GJMXQGU8ADXJc+F5DWSgKAr6GQ1IUKqvGYdEML/KZ61WomWFUuecVA==} + mdast-util-heading-style@3.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - dev: true - /remark-lint-checkbox-character-style@5.0.0: - resolution: {integrity: sha512-K0G/Nok59fb2q5KUxcemBVt+ymnhTkDVLJAatZ4PAh9At8y0DGctHdU27jWsuvO0Fs7Zy62Usk7IJE2VO89p1w==} + mdast-util-mdx-expression@2.0.1: dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - /remark-lint-code-block-style@4.0.0: - resolution: {integrity: sha512-LKBKMVruEO0tzDnnnqi1TfUcnwY6Mo7cVtZM4E4pKt3KMhtvgU2wD68/MxDOEJd0pmnLrEgIadv74bY0gWhZpg==} + mdast-util-mdx-jsx@3.2.0: dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color - /remark-lint-code@2.0.0: - resolution: {integrity: sha512-2U2OAPJM1vm9SGNPFKWQQ7gO85XdF990k7WGQ/GasDq/J0q5euY2PTco3tf1RWmDc/LFDWBM4UC6p3fzuDlkog==} + mdast-util-mdx@3.0.0: dependencies: - unified-lint-rule: 1.0.6 - unist-util-visit: 1.4.1 - dev: true + mdast-util-from-markdown: 2.0.3 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - /remark-lint-definition-case@4.0.0: - resolution: {integrity: sha512-XBmMmj8ii0KZUuJf7ZaVXDGp2+DWE02re9qn/6mV23rBpsDmpz7U1lQWRlwFQIE5q5bxIxP5pX7hDeTH0Egy9Q==} + mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - unified-lint-rule: 3.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + unist-util-is: 6.0.1 - /remark-lint-definition-spacing@4.0.0: - resolution: {integrity: sha512-t6nP8unz6z/DLBTWeOmDFHPFbX3E2PbNgt2fTazRbVnMC6z3o25hBzg5hI6DL0MPt2ZTRX++rJsGRjb+vgh/tQ==} + mdast-util-to-markdown@2.1.2: dependencies: '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@1.1.0: {} - /remark-lint-emphasis-marker@4.0.0: - resolution: {integrity: sha512-xIRiB4PFWUOyIslN/UOPL6Lh+J0VD4R11+jo+W4hpGMNsg58l+2SgtdbinlXzDeoBxmaaka9n/sYpJ7cJWEIPQ==} + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true - /remark-lint-fenced-code-flag@4.0.0: - resolution: {integrity: sha512-Zs0wJd4nRvBo/9NWQVfWg5Ykapbo0Zzw/SyZc3f0h73S1gTZZcfeU+bA5oDivlBdcUgLBsyHRE0QaoaVvN3/Wg==} + mdn-data@2.0.28: {} + + mdn-data@2.27.1: {} + + mdn-data@2.28.1: {} + + mdurl@2.0.0: {} + + meow@13.2.0: {} + + meow@14.1.0: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: dependencies: - '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - quotation: 2.0.3 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-fenced-code-marker@4.0.0: - resolution: {integrity: sha512-WFN88Rx78m4/HSbW3Kx2XAYbVfzYns4bJd9qpwDD90DA3nc59zciYd01xi6Bk3n9vSs5gIlmG7xkwxVHHJ8KCA==} + micromark-extension-gfm-autolink-literal@2.1.0: dependencies: - '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-file-extension@3.0.0: - resolution: {integrity: sha512-wrOKiGvcl/ftB7FkeX2/l13ALvhKXV77HGR8AXo86cVY2pD+K0WdOC52DV3ldgpUXpWzE9kcgF8bbkxwzKpFFg==} + micromark-extension-gfm-footnote@2.1.0: dependencies: - '@types/mdast': 4.0.4 - quotation: 2.0.3 - unified-lint-rule: 3.0.0 - dev: true + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-final-definition@4.0.1: - resolution: {integrity: sha512-51T9oSdA7wuhjSdgGo0snO1BY39Igt9cJQi7XpgtgFsbfQk8zSSAUAc/rLabY6+YCTpcPs6qmwvLXZ4mPX6Qlg==} + micromark-extension-gfm-strikethrough@2.1.0: dependencies: - '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-mdx: 3.0.0 - mdast-util-phrasing: 4.1.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-final-newline@3.0.0: - resolution: {integrity: sha512-NaPyn6FiOn3IV/6gIcwWfJmgraPT2IaVLjhakfPglZkKVfn/FrOfETyY8Bp+HLoSRI9967OH0yRDnK7/pPIWeQ==} + micromark-extension-gfm-table@2.1.1: dependencies: - '@types/mdast': 4.0.4 devlop: 1.1.0 - unified-lint-rule: 3.0.0 - vfile-location: 5.0.2 - dev: true + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-hard-break-spaces@4.0.0: - resolution: {integrity: sha512-zCTq7/xfM0ZL3bMopXse9DH2nk38wE1LrxmYwnTrqASBLnEAJWE2U2//tRGVMEBfSAnNvmIo96twz6zkLWjbGA==} + micromark-extension-gfm-tagfilter@2.0.0: dependencies: - '@types/mdast': 4.0.4 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - dev: true + micromark-util-types: 2.0.2 - /remark-lint-heading-increment@4.0.0: - resolution: {integrity: sha512-TARnsjXWzY/yLwxh/y4+KnDSXO3Koue8Crp55T8G9pjj3vw+XgTAG35zSpIIY9HmGiQ2a3R0SOj2pAxATpnckg==} + micromark-extension-gfm-task-list-item@2.1.0: dependencies: - '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-mdx: 3.0.0 - unified-lint-rule: 3.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-heading-style@4.0.0: - resolution: {integrity: sha512-dQ6Jul5K0+aNUvrq4W7H0+osSoC9hsmwHZqBFq000+eMP/hWJqI8tuudw1rap8HHYuOsKLRbB5q+Fr7G+3Vw+Q==} + micromark-extension-gfm@3.0.0: dependencies: - '@types/mdast': 4.0.4 - mdast-util-heading-style: 3.0.0 - mdast-util-phrasing: 4.1.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-heading-whitespace@1.0.0: - resolution: {integrity: sha512-DykoBIXNbkihg64D+mztSOv3l82RTH4tIZW/HUB4QM4NpIEB+pVIPQpCYD0K4pTgvKiwoqsj4NY8qJ1EhNHAmQ==} + micromark-factory-destination@2.0.1: dependencies: - mdast-util-to-string: 1.1.0 - unified-lint-rule: 1.0.6 - unist-util-visit: 1.4.1 - dev: true + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-link-title-style@4.0.0: - resolution: {integrity: sha512-cihTO5dkhjMj/evYIDAvRdQHD82OQeF4fNAq8FLb81HmFKo77VlSF6CK55H1bvlZogfJG58uN/5d1tSsOdcEbg==} + micromark-factory-label@2.0.1: dependencies: - '@types/mdast': 4.0.4 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-list-item-bullet-indent@5.0.0: - resolution: {integrity: sha512-qq22QaxsDjfsL7aWGIPmP3P0N99CJBQQW1+iSrhYAMCDzqVlw6I3wPNAeR6s8mcoeHT8YlT6eQH3V8xJ0SlW6w==} + micromark-factory-space@2.0.1: dependencies: - '@types/mdast': 4.0.4 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - dev: true + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 - /remark-lint-list-item-content-indent@4.0.0: - resolution: {integrity: sha512-L4GZgWQQ54qWKbnDle3dbEOtnq+qdmZJ70lpM3yMFEMHs4xejqPKsIoiYeUtIV0rYHHCWS7IlLzcgYUK9vENQw==} + micromark-factory-title@2.0.1: dependencies: - '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-list-item-indent@4.0.0: - resolution: {integrity: sha512-Yd6/g8CH9e4vlPAPNgl7F575uKhP+pTo/qwGkE61GOcgEVNJ/529hjumUhyQ4sOAX0YAPAjxvq6fJvb4AhVOOA==} + micromark-factory-whitespace@2.0.1: dependencies: - '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-list-item-spacing@5.0.0: - resolution: {integrity: sha512-d6p+1tcwNE+Pp6Tu2DwiKlyC1zYY3f1igL6AlcBIH0RmROVEfZR4IDFH/LcVyTkzqh1lPMFAJXWK4bpScpcO3g==} + micromark-util-character@2.1.1: dependencies: - '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-match-punctuation@0.2.1: - resolution: {integrity: sha512-XgarnmpBHMsCNRnhTNLf/8dDe5/gXdA/mQnBDPG/XZFNMebS6GFnWQpuL3cyzLmuWD62I1A5ouZczRZcrWYrTQ==} + micromark-util-chunked@2.0.1: dependencies: - unified-lint-rule: 1.0.6 - unist-util-to-list-of-char: 0.1.3 - dev: true + micromark-util-symbol: 2.0.1 - /remark-lint-maximum-heading-length@4.0.0: - resolution: {integrity: sha512-UCQxUd0zZyi6RUbpoK5KsxC50ppVqVk0hSgrSPot4wB6PHRgYMALU2fDkEcAjLDc/Y2TayG3IaZEKdqe+84Cwg==} + micromark-util-classify-character@2.0.1: dependencies: - '@types/mdast': 4.0.4 - mdast-util-mdx: 3.0.0 - mdast-util-to-string: 4.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-maximum-line-length@4.0.1: - resolution: {integrity: sha512-hQlh8UrRfhkO4FU7z7t1Bu5ethj1y2iBncO5AOWF38RAmlHaZdB2lQxNA8IvUZITGJYpT1aThdFTEf+58lv08Q==} + micromark-util-combine-extensions@2.0.1: dependencies: - '@types/mdast': 4.0.4 - mdast-util-mdx: 3.0.0 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - transitivePeerDependencies: - - supports-color - dev: true + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 - /remark-lint-no-blockquote-without-marker@6.0.0: - resolution: {integrity: sha512-fBhoTpkWcl5tG4FdwPdJIyb8XLrdr6MdLk1+K2BQ6Rom3rRsIYvuox4ohxOunNrXuth8xyw8kC6wDmODR44oFw==} + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: dependencies: - '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-directive: 3.0.0 - mdast-util-phrasing: 4.1.0 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-location: 5.0.2 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color - dev: true - /remark-lint-no-consecutive-blank-lines@5.0.0: - resolution: {integrity: sha512-HsDZbFlelBVO3mEJDXd9v4z0HLB8pqxWnsV+I4ILYFp5lKYf6NxJaLBWFtP1gAg1+95WxityGLkGtYqmicDjpg==} + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mime@4.1.0: {} + + mimic-fn@2.1.0: {} + + mimic-function@5.0.1: {} + + minimatch@10.2.5: dependencies: - '@types/mdast': 4.0.4 - mdast-util-directive: 3.0.0 - mdast-util-mdx: 3.0.0 - mdast-util-phrasing: 4.1.0 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true + brace-expansion: 5.0.7 - /remark-lint-no-dead-urls@1.1.0: - resolution: {integrity: sha512-it3EZmMQ+hwGhUf60NkXN0mMIFuFkS0cxdbgEbhZ/Fj1PlUBpe3gDBtWJ/sqNwSNvQlNSzpvMQkNHSoAhlsVjA==} - engines: {node: '>=6'} + minimatch@3.1.5: dependencies: - check-links: 1.1.8 - is-online: 8.5.1 - unified-lint-rule: 1.0.6 - unist-util-visit: 2.0.3 - dev: true + brace-expansion: 1.1.15 - /remark-lint-no-duplicate-definitions@4.0.0: - resolution: {integrity: sha512-21fcOACkCyhNsHkedKlpvqIywYx+5zGR507bW8e59gzdGhTbnBwQ9du4ACmN9jxPTfIBhUVMz0bWezkGrHE7Bg==} + minimatch@9.0.9: dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-phrasing: 4.1.0 - unified-lint-rule: 3.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + brace-expansion: 2.1.1 + + minimist@1.2.8: {} - /remark-lint-no-duplicate-headings@4.0.0: - resolution: {integrity: sha512-FgBU/JCdR5MitHM+hnOcgBGO5ZCNV8epzuHIglFlJeb8ow23YhhNgmGvyk7RGrZrYuU5R9uQq23N4dF0g9atCA==} + minipass@7.1.3: {} + + mitt@1.2.0: {} + + modify-filename@2.0.0: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + mute-stdout@2.0.0: {} + + mute-stream@1.0.0: {} + + nanoid@3.3.15: {} + + nanospinner@1.2.2: dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-mdx: 3.0.0 - mdast-util-to-string: 4.0.0 - unified-lint-rule: 3.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 + picocolors: 1.1.1 + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + node-addon-api@7.1.1: + optional: true + + node-plop@0.32.3(@types/node@26.0.1): + dependencies: + '@types/inquirer': 9.0.10 + '@types/picomatch': 4.0.3 + change-case: 5.4.4 + dlv: 1.1.3 + handlebars: 4.7.9 + inquirer: 9.3.8(@types/node@26.0.1) + isbinaryfile: 5.0.7 + resolve: 1.22.12 + tinyglobby: 0.2.17 + title-case: 4.3.2 transitivePeerDependencies: - - supports-color - dev: true + - '@types/node' - /remark-lint-no-emphasis-as-heading@4.0.0: - resolution: {integrity: sha512-JViGYbuO/xzZThK+qVTNjtLM0v1xMTWFTWt2OJzAkDaGS6T9ZB5ZtRVSBFEMG0SF3dvpJwxe+3ABTsuPBdlYsA==} + node-releases@2.0.50: {} + + nopt@7.2.1: dependencies: - '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - unified-lint-rule: 3.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + abbrev: 2.0.0 - /remark-lint-no-file-name-articles@3.0.0: - resolution: {integrity: sha512-il4IseupahbV2TVfFjfDVL/EQw7jBWVlMVsv4K2cgl5uPIjiCjFGQypqKnWl6pZDN0oNOs/DE8gBdyuDjldJaA==} + normalize-package-data@6.0.2: dependencies: - '@types/mdast': 4.0.4 - unified-lint-rule: 3.0.0 - dev: true + hosted-git-info: 7.0.2 + semver: 7.8.5 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} - /remark-lint-no-file-name-consecutive-dashes@3.0.0: - resolution: {integrity: sha512-3vSI1LOQlu8NSCpWLsKELa8dS9HU+YVZE0U43/DNkdEcnZmlJLpTHQjBTMZUHQipRgoOO+TOSyXFyN/H+2lbuQ==} + now-and-later@3.0.0: dependencies: - '@types/mdast': 4.0.4 - unified-lint-rule: 3.0.0 - dev: true + once: 1.4.0 - /remark-lint-no-file-name-irregular-characters@3.0.0: - resolution: {integrity: sha512-DhGreliHNU7lLTARQujsaLAn8fUPY0V+H0LSmOUuowBZPtIRWeNdQhunSp96RvsuYdqAdERXe0WuH58i3pRqrg==} + npm-install-checks@6.3.0: dependencies: - '@types/mdast': 4.0.4 - unified-lint-rule: 3.0.0 - dev: true + semver: 7.8.5 + + npm-normalize-package-bin@3.0.1: {} - /remark-lint-no-file-name-mixed-case@3.0.0: - resolution: {integrity: sha512-MXXNHdGB6P46itkf8gRP0kxQL85KfAj9YOOBqNtGsgI/8J5rsyM/rz1Ac20Xe+5C5oGi71+7EO/TExKu/+7dfw==} + npm-package-arg@11.0.3: dependencies: - '@types/mdast': 4.0.4 - unified-lint-rule: 3.0.0 - dev: true + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.8.5 + validate-npm-package-name: 5.0.1 - /remark-lint-no-file-name-outer-dashes@3.0.0: - resolution: {integrity: sha512-3kgamCp39mdlCtqF/+JLwwS4VpSj5wvVwRythUfrpW7993I9kF67dBsaU545aEzWSK+UJZqjb40i0m2VfnBRfQ==} + npm-pick-manifest@9.1.0: dependencies: - '@types/mdast': 4.0.4 - unified-lint-rule: 3.0.0 - dev: true + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 11.0.3 + semver: 7.8.5 - /remark-lint-no-heading-content-indent@5.0.0: - resolution: {integrity: sha512-psYSlD2BjcVkgpeXOLwPcYFBrbtJWp8E8JX1J4vSfoHPeY6aIxgYxXkf57cjGTApfRL8xawBmMDiF1FgQvpZYg==} + nth-check@2.1.1: dependencies: - '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + boolbase: 1.0.0 - /remark-lint-no-heading-punctuation@4.0.0: - resolution: {integrity: sha512-7V23C3Q4yX9zEOLZdbv6o8wVxxeWB/F+h9by55zPyk2AwbqF2t2xevnAmN3XFmKZABDTqLwjQxtK6bCVv/S1PQ==} + nunjucklinter@1.3.0: dependencies: - '@types/mdast': 4.0.4 - mdast-util-mdx: 3.0.0 - mdast-util-to-string: 4.0.0 - unified-lint-rule: 3.0.0 - unist-util-visit-parents: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true + chalk: 5.6.2 + glob: 11.1.0 - /remark-lint-no-literal-urls@4.0.0: - resolution: {integrity: sha512-rl/3Ai4Ax9IH/fRpOJZuXk1HgYX6oFTauhmBOilpqbq/YT2kN3FuXaneXdRfKv1bgMdHaLKxHWxGj/mDyA2n8w==} + nunjucks@3.2.4(chokidar@3.6.0): dependencies: - '@types/mdast': 4.0.4 - mdast-util-to-string: 4.0.0 - micromark-util-character: 2.1.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + a-sync-waterfall: 1.0.1 + asap: 2.0.6 + commander: 5.1.0 + optionalDependencies: + chokidar: 3.6.0 + + object-assign@4.1.1: {} - /remark-lint-no-multiple-toplevel-headings@4.0.0: - resolution: {integrity: sha512-JW11iYxza7asDdhQuKfr8SH1u4NBOCQ4U7Ru0HrKCPcT4y/AB1C1il5uMQzbcervgYPBq69xzyQ24+AJeL0t3A==} + object-deep-merge@2.0.1: {} + + object.defaults@1.1.0: dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-mdx: 3.0.0 - unified-lint-rule: 3.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 - /remark-lint-no-shell-dollars@4.0.0: - resolution: {integrity: sha512-ye2h8FzjsgqqQV0HHN2g9N4FqI3eD9Gpgu7tU5ADIJyQ3mUJdwBoFn7IlGnpmumR1fb/l6u/AhRavIZxXYqG+Q==} + object.pick@1.3.0: dependencies: - '@types/mdast': 4.0.4 - collapse-white-space: 2.1.0 - mdast-util-phrasing: 4.1.0 - unified-lint-rule: 3.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + isobject: 3.0.1 - /remark-lint-no-shortcut-reference-image@4.0.0: - resolution: {integrity: sha512-YEiCpW5F/8/LZyxlOuVK2L/n0NJ1AB0AJK7oP39OVyEk3Xl7w+JQi6nZ3KiH6REh+PWGqKn6M0KEPL9cT/iAOw==} + on-finished@2.3.0: dependencies: - '@types/mdast': 4.0.4 - unified-lint-rule: 3.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + ee-first: 1.1.1 - /remark-lint-no-shortcut-reference-link@4.0.0: - resolution: {integrity: sha512-6jka2Zz3I6G2MvDcKrwADYhTOxHMFMK854u1cfBEIH5/XnCCXROtoqiiDtbZw+NJqbmwsBKvGL4t2gnmEJUmgg==} + on-finished@2.4.1: dependencies: - '@types/mdast': 4.0.4 - unified-lint-rule: 3.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + ee-first: 1.1.1 - /remark-lint-no-table-indentation@5.0.0: - resolution: {integrity: sha512-MaLmnzgirpnRiRjWwrsyOX0RmP2eG4YAv169MtsxTVa6O3CpUDwTuTzivudE9L0kVvTlyF9DXEmdyjm85LDyVA==} + once@1.4.0: dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-phrasing: 4.1.0 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-location: 5.0.2 - dev: true + wrappy: 1.0.2 - /remark-lint-no-undefined-references@5.0.0: - resolution: {integrity: sha512-O0q8bHpRHK1T85oqO+uep4BkvQnZZp3y+wahDeeLLq9dCJfF56sq6Tt5OOTt1BAOZlpobS3OPQHUiJWYP6hX1w==} + onetime@5.1.2: dependencies: - '@types/mdast': 4.0.4 - collapse-white-space: 2.1.0 - devlop: 1.1.0 - micromark-util-normalize-identifier: 2.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-location: 5.0.2 - dev: true + mimic-fn: 2.1.0 - /remark-lint-no-unused-definitions@4.0.0: - resolution: {integrity: sha512-YCZ6k575NCTx7mnN+9ls0G6YgMsZHi0LYQqfLW8MNVHBtbpTBvfmk8I39bmsvuKWeBD98weZoXSDqIiIGg+Q/g==} + onetime@7.0.0: dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - unified-lint-rule: 3.0.0 - unist-util-visit: 5.0.0 - dev: true + mimic-function: 5.0.1 - /remark-lint-ordered-list-marker-style@4.0.0: - resolution: {integrity: sha512-xZ7Xppy5fzACH4b9h1b4lTzVtNY2AlUkNTfl1Oe6cIKN8tk3juFxN0wL2RpktPtSZ7iRIabzFmg6l8WPhlASJA==} + opn@5.3.0: dependencies: - '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - micromark-util-character: 2.1.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + is-wsl: 1.1.0 - /remark-lint-ordered-list-marker-value@4.0.0: - resolution: {integrity: sha512-7UjNU2Nv9LGEONTU9GPmTVoNoGKD5aL1X2xHzMbSJiTc50bfcazYqZawO+qj1pQ04WPhto1qHnl0HRB5wwSVwA==} + optionator@0.9.4: dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-phrasing: 4.1.0 - micromark-util-character: 2.1.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 - /remark-lint-rule-style@4.0.0: - resolution: {integrity: sha512-Kt7IHMB5IbLgRFKaFUmB895sV3PTD0MBgN9CvXKxr1wHFF43S6tabjFIBSoQqyJRlhH0S3rK6Lvopofa009gLg==} + ora@5.4.1: dependencies: - '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 - /remark-lint-strong-marker@4.0.0: - resolution: {integrity: sha512-YcvuzakYhQWdCH+1E30sUY+wyvq+PNa77NZAMAYO/cS/pZczFB+q4Ccttw4Q+No/chX8oMfe0GYtm8dDWLei/g==} + p-limit@3.1.0: dependencies: - '@types/mdast': 4.0.4 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + yocto-queue: 0.1.0 - /remark-lint-table-cell-padding@5.0.0: - resolution: {integrity: sha512-LNyiHDQZBIOqcQGG1tYsZHW7g0v8OyRmRgDrD5WEsMaAYfM6EiECUokN/Q4py9h4oM/2KUSrdZbtfuZmy87/kA==} + p-locate@5.0.0: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 - devlop: 1.1.0 - mdast-util-phrasing: 4.1.0 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + p-limit: 3.1.0 + + p-map@7.0.5: {} + + package-json-from-dist@1.0.1: {} - /remark-lint-table-pipe-alignment@4.0.0: - resolution: {integrity: sha512-nx+xpEIWQRLOcq9hIbUIvhSE1NYRmDJmCY3cMoHJ1sIW7dRXMHyWfpWTgu7mpREKwSQdE0q4qnzk8McQQSkIcg==} + parent-module@1.0.1: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 - devlop: 1.1.0 - mdast-util-phrasing: 4.1.0 - pluralize: 8.0.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + callsites: 3.1.0 - /remark-lint-table-pipes@5.0.0: - resolution: {integrity: sha512-e7jzAScDrt5+eMomh099TZJBN2K9ldDxBu9iYhNu5C0YsdAvnckJkgilsuClxFpmx4LCVYaX0EGbt/hQ3LB3xg==} + parse-entities@4.0.2: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 - mdast-util-phrasing: 4.1.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - dev: true + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 - /remark-lint-unordered-list-marker-style@4.0.0: - resolution: {integrity: sha512-XlP4Wr4KJNovyWVv0H5axfUlF23iE9Kt2SxaVq4+ieum5YcMmKE6KsL+aqt3kiJb60SH1u6a0bxKFvdM/9riOA==} + parse-filepath@1.0.2: dependencies: - '@types/mdast': 4.0.4 - mdast-util-phrasing: 4.1.0 - unified-lint-rule: 3.0.0 - unist-util-position: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile-message: 4.0.2 - dev: true + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 - /remark-lint@10.0.0: - resolution: {integrity: sha512-E8yHHDOJ8b+qI0G49BRu24pe8t0fNNBWv8ENQJpCGNrVeTeyBIGEbaUe1yuF7OG8faA6PVpcN/pqWjzW9fcBWQ==} + parse-imports-exports@0.2.4: dependencies: - '@types/mdast': 4.0.4 - remark-message-control: 8.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: true + parse-statements: 1.0.11 - /remark-message-control@8.0.0: - resolution: {integrity: sha512-brpzOO+jdyE/mLqvqqvbogmhGxKygjpCUCG/PwSCU43+JZQ+RM+sSzkCWBcYvgF3KIAVNIoPsvXjBkzO7EdsYQ==} + parse-json@4.0.0: dependencies: - '@types/mdast': 4.0.4 - mdast-comment-marker: 3.0.0 - unified-message-control: 5.0.0 - vfile: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true + error-ex: 1.3.4 + json-parse-better-errors: 1.0.2 - /remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + parse-json@5.2.0: dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.0 - micromark-util-types: 2.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /remark-preset-lint-consistent@6.0.0: - resolution: {integrity: sha512-W3fwxajdietwjnFyTH5x2le63hxWGVOXxIs7KjRqU+5wkkN6ZQyuwPeeomblmS9wQr50fkidhXNHNDyCXtqgxQ==} - dependencies: - remark-lint: 10.0.0 - remark-lint-blockquote-indentation: 4.0.0 - remark-lint-checkbox-character-style: 5.0.0 - remark-lint-code-block-style: 4.0.0 - remark-lint-emphasis-marker: 4.0.0 - remark-lint-fenced-code-marker: 4.0.0 - remark-lint-heading-style: 4.0.0 - remark-lint-link-title-style: 4.0.0 - remark-lint-list-item-content-indent: 4.0.0 - remark-lint-ordered-list-marker-style: 4.0.0 - remark-lint-ordered-list-marker-value: 4.0.0 - remark-lint-rule-style: 4.0.0 - remark-lint-strong-marker: 4.0.0 - remark-lint-table-cell-padding: 5.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /remark-preset-lint-markdown-style-guide@6.0.0: - resolution: {integrity: sha512-izsfNTHeqrRP64VWV6OdJnSUDwKFSthMKiiDcu14ODpPV0t7YiotCQWzgc7L4eW9Ctcp4aB4nHNLSuDmwhEWrQ==} - dependencies: - remark-lint: 10.0.0 - remark-lint-blockquote-indentation: 4.0.0 - remark-lint-code-block-style: 4.0.0 - remark-lint-definition-case: 4.0.0 - remark-lint-definition-spacing: 4.0.0 - remark-lint-emphasis-marker: 4.0.0 - remark-lint-fenced-code-flag: 4.0.0 - remark-lint-fenced-code-marker: 4.0.0 - remark-lint-file-extension: 3.0.0 - remark-lint-final-definition: 4.0.1 - remark-lint-hard-break-spaces: 4.0.0 - remark-lint-heading-increment: 4.0.0 - remark-lint-heading-style: 4.0.0 - remark-lint-link-title-style: 4.0.0 - remark-lint-list-item-content-indent: 4.0.0 - remark-lint-list-item-indent: 4.0.0 - remark-lint-list-item-spacing: 5.0.0 - remark-lint-maximum-heading-length: 4.0.0 - remark-lint-maximum-line-length: 4.0.1 - remark-lint-no-blockquote-without-marker: 6.0.0 - remark-lint-no-consecutive-blank-lines: 5.0.0 - remark-lint-no-duplicate-headings: 4.0.0 - remark-lint-no-emphasis-as-heading: 4.0.0 - remark-lint-no-file-name-articles: 3.0.0 - remark-lint-no-file-name-consecutive-dashes: 3.0.0 - remark-lint-no-file-name-irregular-characters: 3.0.0 - remark-lint-no-file-name-mixed-case: 3.0.0 - remark-lint-no-file-name-outer-dashes: 3.0.0 - remark-lint-no-heading-punctuation: 4.0.0 - remark-lint-no-literal-urls: 4.0.0 - remark-lint-no-multiple-toplevel-headings: 4.0.0 - remark-lint-no-shell-dollars: 4.0.0 - remark-lint-no-shortcut-reference-image: 4.0.0 - remark-lint-no-shortcut-reference-link: 4.0.0 - remark-lint-no-table-indentation: 5.0.0 - remark-lint-ordered-list-marker-style: 4.0.0 - remark-lint-ordered-list-marker-value: 4.0.0 - remark-lint-rule-style: 4.0.0 - remark-lint-strong-marker: 4.0.0 - remark-lint-table-cell-padding: 5.0.0 - remark-lint-table-pipe-alignment: 4.0.0 - remark-lint-table-pipes: 5.0.0 - remark-lint-unordered-list-marker-style: 4.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /remark-preset-lint-recommended@7.0.0: - resolution: {integrity: sha512-A9aPDL78OO12xG2a83DVd+M2QzdBMjn545fbXj40BFJdpt9t//MADkPAwRfpMCBkKi+iECPUTFCb3Jm8SsFG2w==} - dependencies: - remark-lint: 10.0.0 - remark-lint-final-newline: 3.0.0 - remark-lint-hard-break-spaces: 4.0.0 - remark-lint-list-item-bullet-indent: 5.0.0 - remark-lint-list-item-indent: 4.0.0 - remark-lint-no-blockquote-without-marker: 6.0.0 - remark-lint-no-duplicate-definitions: 4.0.0 - remark-lint-no-heading-content-indent: 5.0.0 - remark-lint-no-literal-urls: 4.0.0 - remark-lint-no-shortcut-reference-image: 4.0.0 - remark-lint-no-shortcut-reference-link: 4.0.0 - remark-lint-no-undefined-references: 5.0.0 - remark-lint-no-unused-definitions: 4.0.0 - remark-lint-ordered-list-marker-style: 4.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 - /remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + parse-json@7.1.1: dependencies: - '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 - dev: true + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 3.0.2 + lines-and-columns: 2.0.4 + type-fest: 3.13.1 - /remark@15.0.1: - resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + parse-node-version@1.0.1: {} + + parse-passwd@1.0.0: {} + + parse-statements@1.0.11: {} + + parse5-htmlparser2-tree-adapter@7.1.0: dependencies: - '@types/mdast': 4.0.4 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: true + domhandler: 5.0.3 + parse5: 7.3.0 - /remove-bom-buffer@3.0.0: - resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} - engines: {node: '>=0.10.0'} + parse5-parser-stream@7.1.2: dependencies: - is-buffer: 1.1.6 - is-utf8: 0.2.1 - dev: false + parse5: 7.3.0 - /remove-bom-stream@1.2.0: - resolution: {integrity: sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==} - engines: {node: '>= 0.10'} + parse5@7.3.0: dependencies: - remove-bom-buffer: 3.0.0 - safe-buffer: 5.2.1 - through2: 2.0.5 - dev: false + entities: 6.0.1 - /remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - dev: false + parseurl@1.3.3: {} - /repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - dev: false + path-exists@4.0.0: {} - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - dev: false + path-key@3.1.1: {} - /replace-ext@0.0.1: - resolution: {integrity: sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==} - engines: {node: '>= 0.4'} - dev: false + path-parse@1.0.7: {} - /replace-ext@1.0.1: - resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} - engines: {node: '>= 0.10'} - dev: false + path-root-regex@0.1.2: {} - /replace-ext@2.0.0: - resolution: {integrity: sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==} - engines: {node: '>= 10'} - dev: false + path-root@0.1.1: + dependencies: + path-root-regex: 0.1.2 - /replace-homedir@1.0.0: - resolution: {integrity: sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==} - engines: {node: '>= 0.10'} + path-scurry@1.11.1: dependencies: - homedir-polyfill: 1.0.3 - is-absolute: 1.0.0 - remove-trailing-separator: 1.1.0 - dev: false + lru-cache: 10.4.3 + minipass: 7.1.3 - /replacestream@4.0.3: - resolution: {integrity: sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==} + path-scurry@2.0.2: dependencies: - escape-string-regexp: 1.0.5 - object-assign: 4.1.1 - readable-stream: 2.3.8 - dev: false + lru-cache: 11.5.1 + minipass: 7.1.3 - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + path-type@6.0.0: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + picocolors@1.1.1: {} - /require-main-filename@1.0.1: - resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} - dev: false + picomatch@2.3.2: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false + picomatch@4.0.4: {} - /reserved-identifiers@1.0.0: - resolution: {integrity: sha512-h0bP2Katmvf3hv4Z3WtDl4+6xt/OglQ2Xa6TnhZ/Rm9/7IH1crXQqMwD4J2ngKBonVv+fB55zfGgNDAmsevLVQ==} - engines: {node: '>=18'} - dev: false + playwright-core@1.61.1: {} - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: true + playwright@1.61.1: + dependencies: + playwright-core: 1.61.1 + optionalDependencies: + fsevents: 2.3.2 - /resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} + plop@4.0.5(@types/node@26.0.1): dependencies: - expand-tilde: 2.0.2 - global-modules: 1.0.0 - dev: false + '@types/liftoff': 4.0.3 + interpret: 3.1.1 + liftoff: 5.0.1 + nanospinner: 1.2.2 + node-plop: 0.32.3(@types/node@26.0.1) + picocolors: 1.1.1 + v8flags: 4.0.1 + transitivePeerDependencies: + - '@types/node' - /resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} - dev: false + plugin-error@0.1.2: + dependencies: + ansi-cyan: 0.1.1 + ansi-red: 0.1.1 + arr-diff: 1.1.0 + arr-union: 2.1.0 + extend-shallow: 1.1.4 - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + plugin-error@1.0.1: + dependencies: + ansi-colors: 1.1.0 + arr-diff: 4.0.0 + arr-union: 3.1.0 + extend-shallow: 3.0.2 - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + plugin-error@2.0.1: + dependencies: + ansi-colors: 1.1.0 - /resolve-options@1.1.0: - resolution: {integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==} - engines: {node: '>= 0.10'} + pluralize@8.0.0: {} + + portscanner@2.2.0: dependencies: - value-or-function: 3.0.0 - dev: false + async: 2.6.4 + is-number-like: 1.0.8 - /resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - dev: false + postcss-bem-linter@4.0.1(postcss@8.5.16): + dependencies: + minimatch: 3.1.5 + postcss: 8.5.16 + postcss-resolve-nested-selector: 0.1.6 - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + postcss-calc@10.1.1(postcss@8.5.16): dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + postcss: 8.5.16 + postcss-selector-parser: 7.1.4 + postcss-value-parser: 4.2.0 - /resp-modifier@6.0.2: - resolution: {integrity: sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==} - engines: {node: '>= 0.8.0'} + postcss-colormin@8.0.1(postcss@8.5.16): dependencies: - debug: 2.6.9 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: false + '@colordx/core': 5.5.0 + browserslist: 4.28.4 + caniuse-api: 4.0.0 + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /responselike@1.0.2: - resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + postcss-convert-values@8.0.1(postcss@8.5.16): dependencies: - lowercase-keys: 1.0.1 + browserslist: 4.28.4 + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} + postcss-discard-comments@8.0.1(postcss@8.5.16): dependencies: - lowercase-keys: 3.0.0 - dev: true + postcss: 8.5.16 + postcss-selector-parser: 7.1.4 - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + postcss-discard-duplicates@8.0.1(postcss@8.5.16): dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true + postcss: 8.5.16 - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + postcss-discard-empty@8.0.1(postcss@8.5.16): dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true + postcss: 8.5.16 - /ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - dev: false + postcss-discard-overridden@8.0.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: true + postcss-media-query-parser@0.2.3: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + postcss-merge-longhand@8.0.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + stylehacks: 8.0.1(postcss@8.5.16) - /rev-hash@4.1.0: - resolution: {integrity: sha512-e0EGnaveLY2IYpYwHNdh43WZ2M84KgW3Z/T4F6+Z/BlZI/T1ZbxTWj36xgYgUPOieGXYo2q225jTeUXn+LWYjw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false + postcss-merge-rules@8.0.1(postcss@8.5.16): + dependencies: + browserslist: 4.28.4 + caniuse-api: 4.0.0 + cssnano-utils: 6.0.1(postcss@8.5.16) + postcss: 8.5.16 + postcss-selector-parser: 7.1.4 - /rev-path@3.0.0: - resolution: {integrity: sha512-2fUuv6IC7Z+Vj+DXEunJYJDZuwSsaJJHeLar3n2PGvHSH7j5+Xpd/Xh7PenekH4WQhxFuHtsGwd1dCh/HvT6Gw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + postcss-minify-font-values@8.0.1(postcss@8.5.16): dependencies: - modify-filename: 2.0.0 - dev: false + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: true + postcss-minify-gradients@8.0.1(postcss@8.5.16): + dependencies: + '@colordx/core': 5.5.0 + cssnano-utils: 6.0.1(postcss@8.5.16) + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true + postcss-minify-params@8.0.1(postcss@8.5.16): dependencies: - glob: 7.2.3 - dev: false + browserslist: 4.28.4 + cssnano-utils: 6.0.1(postcss@8.5.16) + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + postcss-minify-selectors@8.0.2(postcss@8.5.16): dependencies: - glob: 7.2.3 - dev: true + browserslist: 4.28.4 + caniuse-api: 4.0.0 + cssesc: 3.0.0 + postcss: 8.5.16 + postcss-selector-parser: 7.1.4 - /run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} - engines: {node: '>=18'} - dev: true + postcss-normalize-charset@8.0.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 - /run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} - dev: true + postcss-normalize-display-values@8.0.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + postcss-normalize-positions@8.0.1(postcss@8.5.16): dependencies: - queue-microtask: 1.2.3 + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /rx@4.1.0: - resolution: {integrity: sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==} - dev: false + postcss-normalize-repeat-style@8.0.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + postcss-normalize-string@8.0.1(postcss@8.5.16): dependencies: - tslib: 2.6.2 - dev: true + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + postcss-normalize-timing-functions@8.0.1(postcss@8.5.16): dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false + postcss-normalize-unicode@8.0.1(postcss@8.5.16): + dependencies: + browserslist: 4.28.4 + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + postcss-normalize-url@8.0.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + postcss-normalize-whitespace@8.0.1(postcss@8.5.16): dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - dev: true + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /safe-regex@1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + postcss-ordered-values@8.0.1(postcss@8.5.16): dependencies: - ret: 0.1.15 - dev: false + cssnano-utils: 6.0.1(postcss@8.5.16) + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + postcss-reduce-initial@8.0.1(postcss@8.5.16): + dependencies: + browserslist: 4.28.4 + caniuse-api: 4.0.0 + postcss: 8.5.16 - /sass@1.77.1: - resolution: {integrity: sha512-OMEyfirt9XEfyvocduUIOlUSkWOXS/LAt6oblR/ISXCTukyavjex+zQNm51pPCOiFKY1QpWvEH1EeCkgyV3I6w==} - engines: {node: '>=14.0.0'} - hasBin: true + postcss-reduce-transforms@8.0.1(postcss@8.5.16): dependencies: - chokidar: 3.6.0 - immutable: 4.3.6 - source-map-js: 1.2.0 - dev: false + postcss: 8.5.16 + postcss-value-parser: 4.2.0 - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - dev: false + postcss-resolve-nested-selector@0.1.6: {} - /scslre@0.3.0: - resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} - engines: {node: ^14.0.0 || >=16.0.0} + postcss-safe-parser@7.0.1(postcss@8.5.16): dependencies: - '@eslint-community/regexpp': 4.10.0 - refa: 0.12.1 - regexp-ast-analysis: 0.7.1 - dev: true + postcss: 8.5.16 - /seek-bzip@1.0.6: - resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} - hasBin: true + postcss-scss@4.0.9(postcss@8.5.16): dependencies: - commander: 2.20.3 - dev: false + postcss: 8.5.16 - /semver-diff@4.0.0: - resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} - engines: {node: '>=12'} + postcss-selector-parser@7.1.4: dependencies: - semver: 7.6.0 - dev: true + cssesc: 3.0.0 + util-deprecate: 1.0.2 - /semver-greatest-satisfied-range@1.1.0: - resolution: {integrity: sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==} - engines: {node: '>= 0.10'} + postcss-sorting@8.0.2(postcss@8.5.16): dependencies: - sver-compat: 1.5.0 - dev: false + postcss: 8.5.16 - /semver-regex@2.0.0: - resolution: {integrity: sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==} - engines: {node: '>=6'} - dev: false + postcss-svgo@8.0.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + svgo: 4.0.1 - /semver-truncate@1.1.2: - resolution: {integrity: sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==} - engines: {node: '>=0.10.0'} + postcss-unique-selectors@8.0.1(postcss@8.5.16): dependencies: - semver: 5.7.2 - dev: false + postcss: 8.5.16 + postcss-selector-parser: 7.1.4 - /semver@4.3.6: - resolution: {integrity: sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==} - hasBin: true - dev: false + postcss-value-parser@4.2.0: {} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true + postcss@8.5.16: + dependencies: + nanoid: 3.3.15 + picocolors: 1.1.1 + source-map-js: 1.2.1 - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + prelude-ls@1.2.1: {} - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + presentable-error@0.0.1: {} + + prettier-plugin-jinja-template@2.2.0(prettier@3.9.4): dependencies: - lru-cache: 6.0.0 - dev: true + prettier: 3.9.4 - /semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true + prettier@3.9.4: {} - /send@0.16.2: - resolution: {integrity: sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - depd: 1.1.2 - destroy: 1.0.4 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 1.6.3 - mime: 1.4.1 - ms: 2.0.0 - on-finished: 2.3.0 - range-parser: 1.2.1 - statuses: 1.4.0 - transitivePeerDependencies: - - supports-color - dev: false + proc-log@4.2.0: {} - /sequencify@0.0.7: - resolution: {integrity: sha512-YL8BPm0tp6SlXef/VqYpA/ijmTsDP2ZEXzsnqjkaWS7NP7Bfvw18NboL0O8WCIjy67sOCG3MYSK1PB4GC9XdtQ==} - engines: {node: '>= 0.4'} - dev: false + process-nextick-args@2.0.1: {} - /serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} + promise-inflight@1.0.1: {} + + promise-retry@2.0.1: dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color - dev: false + err-code: 2.0.3 + retry: 0.12.0 - /serve-static@1.13.2: - resolution: {integrity: sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==} - engines: {node: '>= 0.8.0'} + prompts@2.4.2: dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.16.2 - transitivePeerDependencies: - - supports-color - dev: false + kleur: 3.0.3 + sisteransi: 1.0.5 - /server-destroy@1.0.1: - resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} - dev: false + proto-list@1.2.4: {} - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: false + punycode.js@2.3.1: {} - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 + punycode@2.3.1: {} - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + purgecss@8.0.0: dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - dev: true + commander: 12.1.0 + fast-glob: 3.3.3 + postcss: 8.5.16 + postcss-selector-parser: 7.1.4 - /set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} + qified@0.10.1: dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - dev: false + hookified: 2.2.0 - /set-value@3.0.3: - resolution: {integrity: sha512-Xsn/XSatoVOGBbp5hs3UylFDs5Bi9i+ArpVJKdHPniZHoEgRniXTqHWrWrGQ0PbEClVT6WtfnBwR8CAHC9sveg==} - engines: {node: '>=6.0'} - dependencies: - is-plain-object: 2.0.4 - dev: false + queue-microtask@1.2.3: {} - /setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: false + range-parser@1.2.1: {} - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: false + raw-body@2.5.3: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 - /sharp@0.33.3: - resolution: {integrity: sha512-vHUeXJU1UvlO/BNwTpT0x/r53WkLUVxrmb5JTgW92fdFCFk0ispLMAeu/jPO2vjkXM1fYUi3K7/qcLF47pwM1A==} - engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} - requiresBuild: true + read-package-json-fast@3.0.2: dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.6.2 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.3 - '@img/sharp-darwin-x64': 0.33.3 - '@img/sharp-libvips-darwin-arm64': 1.0.2 - '@img/sharp-libvips-darwin-x64': 1.0.2 - '@img/sharp-libvips-linux-arm': 1.0.2 - '@img/sharp-libvips-linux-arm64': 1.0.2 - '@img/sharp-libvips-linux-s390x': 1.0.2 - '@img/sharp-libvips-linux-x64': 1.0.2 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 - '@img/sharp-linux-arm': 0.33.3 - '@img/sharp-linux-arm64': 0.33.3 - '@img/sharp-linux-s390x': 0.33.3 - '@img/sharp-linux-x64': 0.33.3 - '@img/sharp-linuxmusl-arm64': 0.33.3 - '@img/sharp-linuxmusl-x64': 0.33.3 - '@img/sharp-wasm32': 0.33.3 - '@img/sharp-win32-ia32': 0.33.3 - '@img/sharp-win32-x64': 0.33.3 - dev: false - - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + json-parse-even-better-errors: 3.0.2 + npm-normalize-package-bin: 3.0.1 + + readable-stream@2.3.8: dependencies: - shebang-regex: 1.0.0 - dev: false + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + readable-stream@3.6.2: dependencies: - shebang-regex: 3.0.0 + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - requiresBuild: true - dev: false + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + readdirp@5.0.0: {} - /shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true + rechoir@0.8.0: dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - dev: true + resolve: 1.22.12 - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + refa@0.12.1: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - dev: true + '@eslint-community/regexpp': 4.12.2 - /sigmund@1.0.1: - resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} - dev: false + regexp-ast-analysis@0.7.1: + dependencies: + '@eslint-community/regexpp': 4.12.2 + refa: 0.12.1 - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + remark-cli@12.0.1: + dependencies: + import-meta-resolve: 4.2.0 + markdown-extensions: 2.0.0 + remark: 15.0.1 + unified-args: 11.0.1 + transitivePeerDependencies: + - bluebird + - supports-color - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + remark-gfm@4.0.1: dependencies: - is-arrayish: 0.3.2 - dev: false + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + remark-lint-blockquote-indentation@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-phrasing: 4.1.0 + pluralize: 8.0.0 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 - /slash@2.0.0: - resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} - engines: {node: '>=6'} - dev: false + remark-lint-checkbox-character-style@5.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-phrasing: 4.1.0 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + remark-lint-code-block-style@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-phrasing: 4.1.0 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} + remark-lint-code@2.0.0: + dependencies: + unified-lint-rule: 1.0.6 + unist-util-visit: 1.4.1 - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} + remark-lint-emphasis-marker@4.0.1: dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true + '@types/mdast': 4.0.4 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + remark-lint-fenced-code-marker@4.0.1: dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - dev: true + '@types/mdast': 4.0.4 + mdast-util-phrasing: 4.1.0 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} + remark-lint-final-newline@3.0.1: dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.0.0 - dev: true + '@types/mdast': 4.0.4 + devlop: 1.1.0 + unified-lint-rule: 3.0.1 + vfile-location: 5.0.3 - /sliced@1.0.1: - resolution: {integrity: sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==} - dev: true + remark-lint-hard-break-spaces@4.1.1: + dependencies: + '@types/mdast': 4.0.4 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: true + remark-lint-heading-style@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-heading-style: 3.0.0 + mdast-util-phrasing: 4.1.0 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /snapdragon-node@2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} + remark-lint-heading-whitespace@1.0.0: dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - dev: false + mdast-util-to-string: 1.1.0 + unified-lint-rule: 1.0.6 + unist-util-visit: 1.4.1 - /snapdragon-util@3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} + remark-lint-link-title-style@4.0.1: dependencies: - kind-of: 3.2.2 - dev: false + '@types/mdast': 4.0.4 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /snapdragon@0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} + remark-lint-list-item-bullet-indent@5.0.1: dependencies: - base: 0.11.2 - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: false + '@types/mdast': 4.0.4 + pluralize: 8.0.0 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 - /socket.io-adapter@2.5.4: - resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==} + remark-lint-list-item-content-indent@4.0.1: dependencies: - debug: 4.3.4 - ws: 8.11.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false + '@types/mdast': 4.0.4 + mdast-util-phrasing: 4.1.0 + pluralize: 8.0.0 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /socket.io-client@4.7.5: - resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} - engines: {node: '>=10.0.0'} + remark-lint-list-item-indent@4.0.1: dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4 - engine.io-client: 6.5.3 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false + '@types/mdast': 4.0.4 + mdast-util-phrasing: 4.1.0 + pluralize: 8.0.0 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 - /socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} + remark-lint-no-blockquote-without-marker@6.0.1: dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-directive: 3.1.0 + mdast-util-phrasing: 4.1.0 + pluralize: 8.0.0 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-location: 5.0.3 transitivePeerDependencies: - supports-color - dev: false - /socket.io@4.7.5: - resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} - engines: {node: '>=10.2.0'} + remark-lint-no-duplicate-definitions@4.0.1: dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - cors: 2.8.5 - debug: 4.3.4 - engine.io: 6.5.4 - socket.io-adapter: 2.5.4 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-phrasing: 4.1.0 + unified-lint-rule: 3.0.1 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /socks-proxy-agent@8.0.3: - resolution: {integrity: sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==} - engines: {node: '>= 14'} + remark-lint-no-duplicate-headings@4.0.1: dependencies: - agent-base: 7.1.1 - debug: 4.3.4 - socks: 2.8.3 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-mdx: 3.0.0 + mdast-util-to-string: 4.0.0 + unified-lint-rule: 3.0.1 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 transitivePeerDependencies: - supports-color - dev: true - /socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + remark-lint-no-heading-content-indent@5.0.1: dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - dev: true + '@types/mdast': 4.0.4 + mdast-util-phrasing: 4.1.0 + pluralize: 8.0.0 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 - /sort-keys-length@1.0.1: - resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} - engines: {node: '>=0.10.0'} + remark-lint-no-literal-urls@4.0.1: dependencies: - sort-keys: 1.1.2 - dev: false + '@types/mdast': 4.0.4 + mdast-util-to-string: 4.0.0 + micromark-util-character: 2.1.1 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 - /sort-keys@1.1.2: - resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} - engines: {node: '>=0.10.0'} + remark-lint-no-shortcut-reference-image@4.0.1: dependencies: - is-plain-obj: 1.1.0 - dev: false + '@types/mdast': 4.0.4 + unified-lint-rule: 3.0.1 + unist-util-visit-parents: 6.0.2 - /sort-keys@2.0.0: - resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} - engines: {node: '>=4'} + remark-lint-no-shortcut-reference-link@4.0.1: dependencies: - is-plain-obj: 1.1.0 - dev: false + '@types/mdast': 4.0.4 + unified-lint-rule: 3.0.1 + unist-util-visit-parents: 6.0.2 - /sort-keys@5.0.0: - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} - engines: {node: '>=12'} + remark-lint-no-undefined-references@5.0.2: dependencies: - is-plain-obj: 4.1.0 - dev: false + '@types/mdast': 4.0.4 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + micromark-util-normalize-identifier: 2.0.1 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-location: 5.0.3 - /sort-object@0.0.6: - resolution: {integrity: sha512-hZhnkwm+OnCAM0mIk39b2N9paVG6idNh68y7i9CydEXHTpyJxSwAdGyE2GS3LAvEqSWdFP3OXUKEdJ6kjrA8Vg==} - engines: {node: '>= 0.8.0'} + remark-lint-no-unused-definitions@4.0.2: dependencies: - lodash: 2.2.1 - dev: false - - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} + '@types/mdast': 4.0.4 + devlop: 1.1.0 + unified-lint-rule: 3.0.1 + unist-util-visit-parents: 6.0.2 - /source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated + remark-lint-ordered-list-marker-style@4.0.1: dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.2 - resolve-url: 0.2.1 - source-map-url: 0.4.1 - urix: 0.1.0 - dev: false - - /source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - dev: false - - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: true - - /sparkles@1.0.1: - resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} - engines: {node: '>= 0.10'} - dev: false + '@types/mdast': 4.0.4 + mdast-util-phrasing: 4.1.0 + micromark-util-character: 2.1.1 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + remark-lint-ordered-list-marker-value@4.0.1: dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 - - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-phrasing: 4.1.0 + micromark-util-character: 2.1.1 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + remark-lint-rule-style@4.0.1: dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 + '@types/mdast': 4.0.4 + mdast-util-phrasing: 4.1.0 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + remark-lint-strong-marker@4.0.1: dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - dev: true - - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + '@types/mdast': 4.0.4 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /split-string@3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} + remark-lint-table-cell-padding@5.1.1: dependencies: - extend-shallow: 3.0.2 - dev: false - - /split-string@6.1.0: - resolution: {integrity: sha512-9UBdnmnvx2NLLd4bMs7CEKK+wSzbujVv3ONyorkP1o8M3pVJQtXDO1cN19xD1JJs6ltOrtPrkUND0HzLSinUcA==} - engines: {node: '>=8.6'} - dev: false + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + mdast-util-phrasing: 4.1.0 + pluralize: 8.0.0 + unified-lint-rule: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile-message: 4.0.3 - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: true + remark-lint@10.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-message-control: 8.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: false + remark-message-control@8.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-comment-marker: 3.0.0 + unified-message-control: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color - /sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - dev: true + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - /stable@0.1.8: - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' - requiresBuild: true - dev: false - optional: true + remark-preset-lint-consistent@6.0.1: + dependencies: + remark-lint: 10.0.1 + remark-lint-blockquote-indentation: 4.0.1 + remark-lint-checkbox-character-style: 5.0.1 + remark-lint-code-block-style: 4.0.1 + remark-lint-emphasis-marker: 4.0.1 + remark-lint-fenced-code-marker: 4.0.1 + remark-lint-heading-style: 4.0.1 + remark-lint-link-title-style: 4.0.1 + remark-lint-list-item-content-indent: 4.0.1 + remark-lint-ordered-list-marker-style: 4.0.1 + remark-lint-ordered-list-marker-value: 4.0.1 + remark-lint-rule-style: 4.0.1 + remark-lint-strong-marker: 4.0.1 + remark-lint-table-cell-padding: 5.1.1 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - /stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - dev: false + remark-preset-lint-recommended@7.0.1: + dependencies: + remark-lint: 10.0.1 + remark-lint-final-newline: 3.0.1 + remark-lint-hard-break-spaces: 4.1.1 + remark-lint-list-item-bullet-indent: 5.0.1 + remark-lint-list-item-indent: 4.0.1 + remark-lint-no-blockquote-without-marker: 6.0.1 + remark-lint-no-duplicate-definitions: 4.0.1 + remark-lint-no-heading-content-indent: 5.0.1 + remark-lint-no-literal-urls: 4.0.1 + remark-lint-no-shortcut-reference-image: 4.0.1 + remark-lint-no-shortcut-reference-link: 4.0.1 + remark-lint-no-undefined-references: 5.0.2 + remark-lint-no-unused-definitions: 4.0.2 + remark-lint-ordered-list-marker-style: 4.0.1 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - /static-extend@0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} + remark-stringify@11.0.0: dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - dev: false + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 - /statuses@1.3.1: - resolution: {integrity: sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==} - engines: {node: '>= 0.6'} - dev: false + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - /statuses@1.4.0: - resolution: {integrity: sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==} - engines: {node: '>= 0.6'} - dev: false + remove-trailing-separator@1.1.0: {} - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: false + replace-ext@1.0.1: {} - /stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - dev: true + replace-ext@2.0.0: {} - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - dependencies: - internal-slot: 1.0.7 - dev: true + replace-homedir@2.0.0: {} - /stream-consume@0.1.1: - resolution: {integrity: sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==} - dev: false + require-directory@2.1.1: {} - /stream-exhaust@1.0.2: - resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} - dev: false + require-from-string@2.0.2: {} - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - dev: false + requires-port@1.0.0: {} - /stream-throttle@0.1.3: - resolution: {integrity: sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==} - engines: {node: '>= 0.10.0'} - hasBin: true - dependencies: - commander: 2.20.3 - limiter: 1.1.5 - dev: false + reserved-identifiers@1.2.0: {} - /stream-to-array@2.3.0: - resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + resolve-dir@1.0.1: dependencies: - any-promise: 1.3.0 - dev: false + expand-tilde: 2.0.2 + global-modules: 1.0.0 - /streamx@2.16.1: - resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} - dependencies: - fast-fifo: 1.3.2 - queue-tick: 1.0.1 - optionalDependencies: - bare-events: 2.2.2 - dev: false + resolve-from@3.0.0: {} - /strict-uri-encode@1.1.0: - resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} - engines: {node: '>=0.10.0'} - dev: false + resolve-from@4.0.0: {} - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + resolve-from@5.0.0: {} - /string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} + resolve-options@2.0.0: dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - dev: false + value-or-function: 4.0.0 - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolve@1.22.12: dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + resp-modifier@6.0.2: dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + debug: 2.6.9 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color - /string-width@6.1.0: - resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} - engines: {node: '>=16'} + restore-cursor@3.1.0: dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 10.3.0 - strip-ansi: 7.1.0 - dev: true + onetime: 5.1.2 + signal-exit: 3.0.7 - /string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} - engines: {node: '>=18'} + restore-cursor@5.1.0: dependencies: - emoji-regex: 10.3.0 - get-east-asian-width: 1.2.0 - strip-ansi: 7.1.0 - dev: true + onetime: 7.0.0 + signal-exit: 4.1.0 - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - dev: true + retry@0.12.0: {} - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: true + reusify@1.1.0: {} - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + rev-hash@4.1.0: {} + + rev-path@3.0.0: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: true + modify-filename: 2.0.0 - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false + rfdc@1.4.1: {} - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: false + run-async@3.0.0: {} - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + run-parallel@1.2.0: dependencies: - safe-buffer: 5.2.1 + queue-microtask: 1.2.3 - /stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: true + rx@4.1.0: {} - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} + rxjs@7.8.2: dependencies: - ansi-regex: 2.1.1 - dev: false + tslib: 2.8.1 - /strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} - dependencies: - ansi-regex: 4.1.1 - dev: false + safe-buffer@5.1.2: {} - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 + safe-buffer@5.2.1: {} - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 + safer-buffer@2.1.2: {} - /strip-bom-buf@3.0.1: - resolution: {integrity: sha512-iJaWw2WroigLHzQysdc5WWeUc99p7ea7AEgB6JkY8CMyiO1yTVAA1gIlJJgORElUIR+lcZJkNl1OGChMhvc2Cw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + sass@1.101.0: dependencies: - is-utf8: 0.2.1 - dev: false + chokidar: 5.0.0 + immutable: 5.1.9 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.6 - /strip-bom-stream@5.0.0: - resolution: {integrity: sha512-Yo472mU+3smhzqeKlIxClre4s4pwtYZEvDNQvY/sJpnChdaxmKuwU28UVx/v1ORKNMxkmj1GBuvxJQyBk6wYMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - first-chunk-stream: 5.0.0 - strip-bom-buf: 3.0.1 - dev: false + sax@1.6.0: {} - /strip-bom@1.0.0: - resolution: {integrity: sha512-qVAeAIjblKDp/8Cd0tJdxpe3Iq/HooI7En98alEaMbz4Wedlrcj3WI72dDQSrziRW5IQ0zeBo3JXsmS8RcS9jg==} - engines: {node: '>=0.10.0'} - hasBin: true + scslre@0.3.0: dependencies: - first-chunk-stream: 1.0.0 - is-utf8: 0.2.1 - dev: false + '@eslint-community/regexpp': 4.12.2 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 - /strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} + section-matter@1.0.0: dependencies: - is-utf8: 0.2.1 - dev: false - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + extend-shallow: 2.0.1 + kind-of: 6.0.3 - /strip-dirs@2.1.0: - resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + semver-greatest-satisfied-range@2.0.0: dependencies: - is-natural-number: 4.0.1 - dev: false + sver: 1.8.4 - /strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - dev: false + semver@6.3.1: + optional: true - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + semver@7.8.5: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + serve-index@1.9.2: dependencies: - min-indent: 1.0.1 - dev: true + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.8.1 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + server-destroy@1.0.1: {} - /strip-outer@1.0.1: - resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} - engines: {node: '>=0.10.0'} + set-value@3.0.3: dependencies: - escape-string-regexp: 1.0.5 - dev: false + is-plain-object: 2.0.4 - /strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - requiresBuild: true - dev: false - optional: true + setprototypeof@1.2.0: {} - /strtok3@7.0.0: - resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==} - engines: {node: '>=14.16'} + sharp@0.35.2: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.5 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.35.2 + '@img/sharp-darwin-x64': 0.35.2 + '@img/sharp-freebsd-wasm32': 0.35.2 + '@img/sharp-libvips-darwin-arm64': 1.3.1 + '@img/sharp-libvips-darwin-x64': 1.3.1 + '@img/sharp-libvips-linux-arm': 1.3.1 + '@img/sharp-libvips-linux-arm64': 1.3.1 + '@img/sharp-libvips-linux-ppc64': 1.3.1 + '@img/sharp-libvips-linux-riscv64': 1.3.1 + '@img/sharp-libvips-linux-s390x': 1.3.1 + '@img/sharp-libvips-linux-x64': 1.3.1 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 + '@img/sharp-libvips-linuxmusl-x64': 1.3.1 + '@img/sharp-linux-arm': 0.35.2 + '@img/sharp-linux-arm64': 0.35.2 + '@img/sharp-linux-ppc64': 0.35.2 + '@img/sharp-linux-riscv64': 0.35.2 + '@img/sharp-linux-s390x': 0.35.2 + '@img/sharp-linux-x64': 0.35.2 + '@img/sharp-linuxmusl-arm64': 0.35.2 + '@img/sharp-linuxmusl-x64': 0.35.2 + '@img/sharp-webcontainers-wasm32': 0.35.2 + '@img/sharp-win32-arm64': 0.35.2 + '@img/sharp-win32-ia32': 0.35.2 + '@img/sharp-win32-x64': 0.35.2 + + shebang-command@2.0.0: dependencies: - '@tokenizer/token': 0.3.0 - peek-readable: 5.0.0 - dev: false + shebang-regex: 3.0.0 - /style-search@0.1.0: - resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} - dev: true + shebang-regex@3.0.0: {} - /stylehacks@7.0.0(postcss@8.4.38): - resolution: {integrity: sha512-47Nw4pQ6QJb4CA6dzF2m9810sjQik4dfk4UwAm5wlwhrW3syzZKF8AR4/cfO3Cr6lsFgAoznQq0Wg57qhjTA2A==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - dependencies: - browserslist: 4.23.0 - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 - dev: false + signal-exit@3.0.7: {} - /stylelint-config-recommended-scss@5.0.2(postcss@8.4.38)(stylelint@14.16.1): - resolution: {integrity: sha512-b14BSZjcwW0hqbzm9b0S/ScN2+3CO3O4vcMNOw2KGf8lfVSwJ4p5TbNEXKwKl1+0FMtgRXZj6DqVUe/7nGnuBg==} - peerDependencies: - stylelint: ^14.0.0 - dependencies: - postcss-scss: 4.0.9(postcss@8.4.38) - stylelint: 14.16.1 - stylelint-config-recommended: 6.0.0(stylelint@14.16.1) - stylelint-scss: 4.7.0(stylelint@14.16.1) - transitivePeerDependencies: - - postcss - dev: true + signal-exit@4.1.0: {} - /stylelint-config-recommended@6.0.0(stylelint@14.16.1): - resolution: {integrity: sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw==} - peerDependencies: - stylelint: ^14.0.0 - dependencies: - stylelint: 14.16.1 - dev: true + sisteransi@1.0.5: {} - /stylelint-config-standard-scss@3.0.0(postcss@8.4.38)(stylelint@14.16.1): - resolution: {integrity: sha512-zt3ZbzIbllN1iCmc94e4pDxqpkzeR6CJo5DDXzltshuXr+82B8ylHyMMARNnUYrZH80B7wgY7UkKTYCFM0UUyw==} - peerDependencies: - stylelint: ^14.0.0 - dependencies: - stylelint: 14.16.1 - stylelint-config-recommended-scss: 5.0.2(postcss@8.4.38)(stylelint@14.16.1) - stylelint-config-standard: 24.0.0(stylelint@14.16.1) - transitivePeerDependencies: - - postcss - dev: true + slash@5.1.0: {} - /stylelint-config-standard@24.0.0(stylelint@14.16.1): - resolution: {integrity: sha512-+RtU7fbNT+VlNbdXJvnjc3USNPZRiRVp/d2DxOF/vBDDTi0kH5RX2Ny6errdtZJH3boO+bmqIYEllEmok4jiuw==} - peerDependencies: - stylelint: ^14.0.0 + slice-ansi@4.0.0: dependencies: - stylelint: 14.16.1 - stylelint-config-recommended: 6.0.0(stylelint@14.16.1) - dev: true + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 - /stylelint-high-performance-animation@1.10.0(stylelint@14.16.1): - resolution: {integrity: sha512-YzNI+E6taN8pwgaM0INazRg4tw23VA17KNMKUVdOeohpnpSyJLBnLVT9NkRcaCFLodK/67smS5VZK+Qe4Ohrvw==} - peerDependencies: - stylelint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + slice-ansi@7.1.2: dependencies: - postcss-value-parser: 4.2.0 - stylelint: 14.16.1 - dev: true + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 - /stylelint-order@5.0.0(stylelint@14.16.1): - resolution: {integrity: sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==} - peerDependencies: - stylelint: ^14.0.0 + slice-ansi@8.0.0: dependencies: - postcss: 8.4.38 - postcss-sorting: 7.0.1(postcss@8.4.38) - stylelint: 14.16.1 - dev: true + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 - /stylelint-scss@4.7.0(stylelint@14.16.1): - resolution: {integrity: sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg==} - peerDependencies: - stylelint: ^14.5.1 || ^15.0.0 + sliced@1.0.1: {} + + socket.io-adapter@2.5.8: dependencies: - postcss-media-query-parser: 0.2.3 - postcss-resolve-nested-selector: 0.1.1 - postcss-selector-parser: 6.0.16 - postcss-value-parser: 4.2.0 - stylelint: 14.16.1 - dev: true + debug: 4.4.3 + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - /stylelint-selector-bem-pattern@3.0.1(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-eh0tyyVyS62IOVzyi5oN0BKLJTHnolMWIqzpe0n3Wk26HxZegp/PiVKSUpK7vzVIAdAROemhypfMaH/xZorZrg==} + socket.io-client@4.8.3: dependencies: - eslint-plugin-jest: 27.9.0(eslint@8.57.0)(typescript@5.4.5) - lodash: 4.17.21 - postcss: 8.4.38 - postcss-bem-linter: 4.0.1(postcss@8.4.38) - stylelint: 16.5.0(typescript@5.4.5) + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-client: 6.6.6 + socket.io-parser: 4.2.6 transitivePeerDependencies: - - '@typescript-eslint/eslint-plugin' - - eslint - - jest + - bufferutil - supports-color - - typescript - dev: true + - utf-8-validate - /stylelint@14.16.1: - resolution: {integrity: sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true + socket.io-parser@4.2.6: dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.16) - balanced-match: 2.0.0 - colord: 2.9.3 - cosmiconfig: 7.1.0 - css-functions-list: 3.2.2 - debug: 4.3.4 - fast-glob: 3.3.2 - fastest-levenshtein: 1.0.16 - file-entry-cache: 6.0.1 - global-modules: 2.0.0 - globby: 11.1.0 - globjoin: 0.1.4 - html-tags: 3.3.1 - ignore: 5.3.1 - import-lazy: 4.0.0 - imurmurhash: 0.1.4 - is-plain-object: 5.0.0 - known-css-properties: 0.26.0 - mathml-tag-names: 2.1.3 - meow: 9.0.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - picocolors: 1.0.1 - postcss: 8.4.38 - postcss-media-query-parser: 0.2.3 - postcss-resolve-nested-selector: 0.1.1 - postcss-safe-parser: 6.0.0(postcss@8.4.38) - postcss-selector-parser: 6.0.16 - postcss-value-parser: 4.2.0 - resolve-from: 5.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - style-search: 0.1.0 - supports-hyperlinks: 2.3.0 - svg-tags: 1.0.0 - table: 6.8.2 - v8-compile-cache: 2.4.0 - write-file-atomic: 4.0.2 + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 transitivePeerDependencies: - supports-color - dev: true - /stylelint@16.5.0(typescript@5.4.5): - resolution: {integrity: sha512-IlCBtVrG+qTy3v+tZTk50W8BIomjY/RUuzdrDqdnlCYwVuzXtPbiGfxYqtyYAyOMcb+195zRsuHn6tgfPmFfbw==} - engines: {node: '>=18.12.0'} - hasBin: true + socket.io@4.8.3: dependencies: - '@csstools/css-parser-algorithms': 2.6.3(@csstools/css-tokenizer@2.3.1) - '@csstools/css-tokenizer': 2.3.1 - '@csstools/media-query-list-parser': 2.1.11(@csstools/css-parser-algorithms@2.6.3)(@csstools/css-tokenizer@2.3.1) - '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.0.16) - '@dual-bundle/import-meta-resolve': 4.1.0 - balanced-match: 2.0.0 - colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.4.5) - css-functions-list: 3.2.2 - css-tree: 2.3.1 - debug: 4.3.4 - fast-glob: 3.3.2 - fastest-levenshtein: 1.0.16 - file-entry-cache: 8.0.0 - global-modules: 2.0.0 - globby: 11.1.0 - globjoin: 0.1.4 - html-tags: 3.3.1 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-plain-object: 5.0.0 - known-css-properties: 0.30.0 - mathml-tag-names: 2.1.3 - meow: 13.2.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - picocolors: 1.0.1 - postcss: 8.4.38 - postcss-resolve-nested-selector: 0.1.1 - postcss-safe-parser: 7.0.0(postcss@8.4.38) - postcss-selector-parser: 6.0.16 - postcss-value-parser: 4.2.0 - resolve-from: 5.0.0 - string-width: 4.2.3 - strip-ansi: 7.1.0 - supports-hyperlinks: 3.0.0 - svg-tags: 1.0.0 - table: 6.8.2 - write-file-atomic: 5.0.1 + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.6 + debug: 4.4.3 + engine.io: 6.6.9 + socket.io-adapter: 2.5.8 + socket.io-parser: 4.2.6 transitivePeerDependencies: + - bufferutil - supports-color - - typescript - dev: true + - utf-8-validate - /super-regex@1.0.0: - resolution: {integrity: sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==} - engines: {node: '>=18'} + sort-keys@6.0.1: dependencies: - function-timeout: 1.0.1 - time-span: 5.1.0 - dev: false + is-plain-obj: 4.1.0 - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: false + source-map-js@1.2.1: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 + source-map@0.5.7: {} - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + source-map@0.6.1: {} + + space-separated-tokens@2.0.2: {} + + sparkles@2.1.0: {} + + spdx-correct@3.2.0: dependencies: - has-flag: 4.0.0 + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.23 - /supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - dev: true + spdx-exceptions@2.5.0: {} - /supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} + spdx-expression-parse@3.0.1: dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - dev: true + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 - /supports-hyperlinks@3.0.0: - resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} - engines: {node: '>=14.18'} + spdx-expression-parse@4.0.0: dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - dev: true + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + spdx-license-ids@3.0.23: {} - /sver-compat@1.5.0: - resolution: {integrity: sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==} - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - dev: false + split-string@6.1.0: {} - /svg-tags@1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - dev: true + sprintf-js@1.0.3: {} - /svgo@2.8.0: - resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} - engines: {node: '>=10.13.0'} - hasBin: true - requiresBuild: true - dependencies: - '@trysound/sax': 0.2.0 - commander: 7.2.0 - css-select: 4.3.0 - css-tree: 1.1.3 - csso: 4.2.0 - picocolors: 1.0.1 - stable: 0.1.8 - dev: false - optional: true + srcset@5.0.3: {} - /svgo@3.3.2: - resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - '@trysound/sax': 0.2.0 - commander: 7.2.0 - css-select: 5.1.0 - css-tree: 2.3.1 - css-what: 6.1.0 - csso: 5.0.5 - picocolors: 1.0.1 - dev: false + statuses@1.3.1: {} + + statuses@1.5.0: {} - /synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} + statuses@2.0.2: {} + + stream-composer@1.0.2: dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.6.2 - dev: true + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /table@6.8.2: - resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} - engines: {node: '>=10.0.0'} + stream-exhaust@1.0.2: {} + + stream-throttle@0.1.3: dependencies: - ajv: 8.13.0 - lodash.truncate: 4.4.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true + commander: 2.20.3 + limiter: 1.1.5 - /tar-stream@1.6.2: - resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} - engines: {node: '>= 0.8.0'} + stream-to-array@2.3.0: dependencies: - bl: 1.2.3 - buffer-alloc: 1.2.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - readable-stream: 2.3.8 - to-buffer: 1.1.1 - xtend: 4.0.2 - dev: false + any-promise: 1.3.0 - /teex@1.0.1: - resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + streamx@2.28.0: dependencies: - streamx: 2.16.1 - dev: false + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /temp-dir@1.0.0: - resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} - engines: {node: '>=4'} - dev: false + string-argv@0.3.2: {} - /tempfile@2.0.0: - resolution: {integrity: sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==} - engines: {node: '>=4'} + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: dependencies: - temp-dir: 1.0.0 - uuid: 3.4.0 - dev: false + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 - /ternary-stream@3.0.0: - resolution: {integrity: sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==} + string-width@6.1.0: dependencies: - duplexify: 4.1.3 - fork-stream: 0.0.4 - merge-stream: 2.0.0 - through2: 3.0.2 - dev: false + eastasianwidth: 0.2.0 + emoji-regex: 10.6.0 + strip-ansi: 7.2.0 - /text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} - dev: true + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + string-width@8.2.1: + dependencies: + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 - /textextensions@2.6.0: - resolution: {integrity: sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==} - engines: {node: '>=0.8'} - dev: false + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 - /textextensions@3.3.0: - resolution: {integrity: sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw==} - engines: {node: '>=8'} - dev: false + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 - /through2-filter@3.0.0: - resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} + stringify-entities@4.0.4: dependencies: - through2: 2.0.5 - xtend: 4.0.2 - dev: false + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 - /through2@0.6.5: - resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + strip-ansi@6.0.1: dependencies: - readable-stream: 1.0.34 - xtend: 4.0.2 - dev: false + ansi-regex: 5.0.1 - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + strip-ansi@7.2.0: dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: false + ansi-regex: 6.2.2 - /through2@3.0.2: - resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} + strip-bom-buf@3.0.1: dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false + is-utf8: 0.2.1 - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + strip-bom-stream@5.0.0: dependencies: - readable-stream: 3.6.2 - dev: false + first-chunk-stream: 5.0.0 + strip-bom-buf: 3.0.1 - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + strip-bom-string@1.0.0: {} - /tildify@1.2.0: - resolution: {integrity: sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ==} - engines: {node: '>=0.10.0'} + stylehacks@8.0.1(postcss@8.5.16): dependencies: - os-homedir: 1.0.2 - dev: false + browserslist: 4.28.4 + postcss: 8.5.16 + postcss-selector-parser: 7.1.4 - /time-span@5.1.0: - resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} - engines: {node: '>=12'} + stylelint-config-recommended-scss@14.1.0(postcss@8.5.16)(stylelint@17.14.0(typescript@6.0.3)): dependencies: - convert-hrtime: 5.0.0 - dev: false - - /time-stamp@1.1.0: - resolution: {integrity: sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==} - engines: {node: '>=0.10.0'} - dev: false + postcss-scss: 4.0.9(postcss@8.5.16) + stylelint: 17.14.0(typescript@6.0.3) + stylelint-config-recommended: 14.0.1(stylelint@17.14.0(typescript@6.0.3)) + stylelint-scss: 6.14.0(stylelint@17.14.0(typescript@6.0.3)) + optionalDependencies: + postcss: 8.5.16 - /timed-out@4.0.1: - resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} - engines: {node: '>=0.10.0'} - dev: false + stylelint-config-recommended-scss@17.0.1(postcss@8.5.16)(stylelint@17.14.0(typescript@6.0.3)): + dependencies: + postcss-scss: 4.0.9(postcss@8.5.16) + stylelint: 17.14.0(typescript@6.0.3) + stylelint-config-recommended: 18.0.0(stylelint@17.14.0(typescript@6.0.3)) + stylelint-scss: 7.2.0(stylelint@17.14.0(typescript@6.0.3)) + optionalDependencies: + postcss: 8.5.16 - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + stylelint-config-recommended@14.0.1(stylelint@17.14.0(typescript@6.0.3)): dependencies: - os-tmpdir: 1.0.2 - dev: true + stylelint: 17.14.0(typescript@6.0.3) - /to-absolute-glob@2.0.2: - resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} - engines: {node: '>=0.10.0'} + stylelint-config-recommended@18.0.0(stylelint@17.14.0(typescript@6.0.3)): dependencies: - is-absolute: 1.0.0 - is-negated-glob: 1.0.0 - dev: false + stylelint: 17.14.0(typescript@6.0.3) - /to-buffer@1.1.1: - resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} - dev: false + stylelint-config-standard-scss@13.1.0(postcss@8.5.16)(stylelint@17.14.0(typescript@6.0.3)): + dependencies: + stylelint: 17.14.0(typescript@6.0.3) + stylelint-config-recommended-scss: 14.1.0(postcss@8.5.16)(stylelint@17.14.0(typescript@6.0.3)) + stylelint-config-standard: 36.0.1(stylelint@17.14.0(typescript@6.0.3)) + optionalDependencies: + postcss: 8.5.16 - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + stylelint-config-standard-scss@17.0.0(postcss@8.5.16)(stylelint@17.14.0(typescript@6.0.3)): + dependencies: + stylelint: 17.14.0(typescript@6.0.3) + stylelint-config-recommended-scss: 17.0.1(postcss@8.5.16)(stylelint@17.14.0(typescript@6.0.3)) + stylelint-config-standard: 40.0.0(stylelint@17.14.0(typescript@6.0.3)) + optionalDependencies: + postcss: 8.5.16 - /to-object-path@0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} + stylelint-config-standard@36.0.1(stylelint@17.14.0(typescript@6.0.3)): dependencies: - kind-of: 3.2.2 - dev: false + stylelint: 17.14.0(typescript@6.0.3) + stylelint-config-recommended: 14.0.1(stylelint@17.14.0(typescript@6.0.3)) - /to-readable-stream@1.0.0: - resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} - engines: {node: '>=6'} - dev: true + stylelint-config-standard@40.0.0(stylelint@17.14.0(typescript@6.0.3)): + dependencies: + stylelint: 17.14.0(typescript@6.0.3) + stylelint-config-recommended: 18.0.0(stylelint@17.14.0(typescript@6.0.3)) - /to-regex-range@2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} + stylelint-high-performance-animation@2.0.0(stylelint@17.14.0(typescript@6.0.3)): dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 - dev: false + postcss-value-parser: 4.2.0 + stylelint: 17.14.0(typescript@6.0.3) - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + stylelint-order@6.0.4(stylelint@17.14.0(typescript@6.0.3)): dependencies: - is-number: 7.0.0 + postcss: 8.5.16 + postcss-sorting: 8.0.2(postcss@8.5.16) + stylelint: 17.14.0(typescript@6.0.3) - /to-regex@3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} + stylelint-scss@6.14.0(stylelint@17.14.0(typescript@6.0.3)): dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 - dev: false + css-tree: 3.2.1 + is-plain-object: 5.0.0 + known-css-properties: 0.37.0 + mdn-data: 2.28.1 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.6 + postcss-selector-parser: 7.1.4 + postcss-value-parser: 4.2.0 + stylelint: 17.14.0(typescript@6.0.3) - /to-through@2.0.0: - resolution: {integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==} - engines: {node: '>= 0.10'} + stylelint-scss@7.2.0(stylelint@17.14.0(typescript@6.0.3)): dependencies: - through2: 2.0.5 - dev: false + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-syntax-patches-for-csstree': 1.1.6(css-tree@3.2.1) + '@csstools/css-tokenizer': 4.0.0 + css-tree: 3.2.1 + is-plain-object: 5.0.0 + known-css-properties: 0.37.0 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.6 + postcss-selector-parser: 7.1.4 + postcss-value-parser: 4.2.0 + stylelint: 17.14.0(typescript@6.0.3) - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: false + stylelint-selector-bem-pattern@5.0.0(stylelint@17.14.0(typescript@6.0.3)): + dependencies: + postcss: 8.5.16 + postcss-bem-linter: 4.0.1(postcss@8.5.16) + stylelint: 17.14.0(typescript@6.0.3) - /token-types@5.0.1: - resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} - engines: {node: '>=14.16'} + stylelint@17.14.0(typescript@6.0.3): dependencies: - '@tokenizer/token': 0.3.0 - ieee754: 1.2.1 - dev: false + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-syntax-patches-for-csstree': 1.1.6(css-tree@3.2.1) + '@csstools/css-tokenizer': 4.0.0 + '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/selector-resolve-nested': 4.0.0(postcss-selector-parser@7.1.4) + '@csstools/selector-specificity': 6.0.0(postcss-selector-parser@7.1.4) + colord: 2.9.3 + cosmiconfig: 9.0.2(typescript@6.0.3) + css-functions-list: 3.3.3 + css-tree: 3.2.1 + debug: 4.4.3 + fast-glob: 3.3.3 + fastest-levenshtein: 1.0.16 + file-entry-cache: 11.1.5 + global-modules: 2.0.0 + globby: 16.2.0 + globjoin: 0.1.4 + html-tags: 5.1.0 + ignore: 7.0.5 + import-meta-resolve: 4.2.0 + mathml-tag-names: 4.0.0 + meow: 14.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.16 + postcss-safe-parser: 7.0.1(postcss@8.5.16) + postcss-selector-parser: 7.1.4 + postcss-value-parser: 4.2.0 + string-width: 8.2.1 + supports-hyperlinks: 4.5.0 + svg-tags: 1.0.0 + table: 6.9.0 + write-file-atomic: 7.0.1 + transitivePeerDependencies: + - supports-color + - typescript - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true + supports-color@10.2.2: {} - /trim-repeated@1.0.0: - resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} - engines: {node: '>=0.10.0'} + supports-color@7.2.0: dependencies: - escape-string-regexp: 1.0.5 - dev: false + has-flag: 4.0.0 - /trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - dev: true + supports-color@9.4.0: {} - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + supports-hyperlinks@4.5.0: dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true + has-flag: 5.0.1 + supports-color: 10.2.2 - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + sver@1.8.4: + optionalDependencies: + semver: 6.3.1 - /tsutils@3.21.0(typescript@5.4.5): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.4.5 - dev: true + svg-tags@1.0.0: {} - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + svgo@4.0.1: dependencies: - safe-buffer: 5.2.1 - dev: false + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.2.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.0 - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + table@6.9.0: dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true + ajv: 8.20.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 - /type-fest@0.3.1: - resolution: {integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==} - engines: {node: '>=6'} - dev: true + teex@1.0.1: + dependencies: + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + text-table@0.2.0: {} - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: true + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: true + through2@3.0.2: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 - /type-fest@4.18.2: - resolution: {integrity: sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==} - engines: {node: '>=16'} - dev: true + time-stamp@1.1.0: {} - /type@2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - dev: false + tinyexec@1.2.4: {} - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + tinyglobby@0.2.17: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - dev: true + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - dev: true + title-case@4.3.2: {} - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + to-regex-range@5.0.1: dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - dev: true + is-number: 7.0.0 - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + to-through@3.0.0: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - dev: true + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + to-valid-identifier@1.0.0: dependencies: - is-typedarray: 1.0.0 - dev: true - - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + '@sindresorhus/base62': 1.0.0 + reserved-identifiers: 1.2.0 - /typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + toidentifier@1.0.1: {} - /ua-parser-js@1.0.37: - resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} - dev: false + trough@2.2.0: {} - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true + tslib@2.8.1: {} - /uglify-js@3.4.10: - resolution: {integrity: sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==} - engines: {node: '>=0.8.0'} - hasBin: true + type-check@0.4.0: dependencies: - commander: 2.19.0 - source-map: 0.6.1 - dev: false + prelude-ls: 1.2.1 - /uint8array-extras@1.1.0: - resolution: {integrity: sha512-CVaBSyOmGoFHu+zOVPbetXEXykOd8KHVBHLlqvmaMWpwcq3rewj18xVNbU5uzf48hclnNQhfNaNany2cMHFK/g==} - engines: {node: '>=18'} - dev: false + type-fest@0.21.3: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true + type-fest@3.13.1: {} - /unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - dependencies: - buffer: 5.7.1 - through: 2.3.8 - dev: false + typedarray@0.0.6: {} - /unc-path-regex@0.1.2: - resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} - engines: {node: '>=0.10.0'} - dev: false + typescript@6.0.3: {} - /undertaker-registry@1.0.1: - resolution: {integrity: sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==} - engines: {node: '>= 0.10'} - dev: false + ua-parser-js@1.0.41: {} - /undertaker@1.3.0: - resolution: {integrity: sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==} - engines: {node: '>= 0.10'} - dependencies: - arr-flatten: 1.1.0 - arr-map: 2.0.2 - bach: 1.2.0 - collection-map: 1.0.0 - es6-weak-map: 2.0.3 - fast-levenshtein: 1.1.4 - last-run: 1.1.1 - object.defaults: 1.1.0 - object.reduce: 1.0.1 - undertaker-registry: 1.0.1 - dev: false + uc.micro@2.1.0: {} - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + uglify-js@3.19.3: + optional: true - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - dev: true + unc-path-regex@0.1.2: {} - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + undertaker-registry@2.0.0: {} + + undertaker@2.0.0: dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 - unicode-property-aliases-ecmascript: 2.1.0 - dev: true + bach: 2.0.1 + fast-levenshtein: 3.0.0 + last-run: 2.0.0 + undertaker-registry: 2.0.0 - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} - dev: true + undici-types@6.21.0: {} - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - dev: true + undici-types@8.3.0: {} - /unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} + undici@7.28.0: {} - /unified-args@11.0.1: - resolution: {integrity: sha512-WEQghE91+0s3xPVs0YW6a5zUduNLjmANswX7YbBfksHNDGMjHxaWCql4SR7c9q0yov/XiIEdk6r/LqfPjaYGcw==} + unicorn-magic@0.3.0: {} + + unicorn-magic@0.4.0: {} + + unified-args@11.0.1: dependencies: '@types/text-table': 0.2.5 - chalk: 5.3.0 + chalk: 5.6.2 chokidar: 3.6.0 comma-separated-tokens: 2.0.3 json5: 2.2.3 minimist: 1.2.8 - strip-ansi: 7.1.0 + strip-ansi: 7.2.0 text-table: 0.2.0 - unified-engine: 11.2.1 + unified-engine: 11.2.2 transitivePeerDependencies: + - bluebird - supports-color - dev: true - /unified-engine@11.2.1: - resolution: {integrity: sha512-xBAdZ8UY2X4R9Hm6X6kMne4Nz0PlpOc1oE6DPeqJnewr5Imkb8uT5Eyvy1h7xNekPL3PSWh3ZJyNrMW6jnNQBg==} + unified-engine@11.2.2: dependencies: '@types/concat-stream': 2.0.3 - '@types/debug': 4.1.12 + '@types/debug': 4.1.13 '@types/is-empty': 1.2.3 - '@types/node': 20.12.12 - '@types/unist': 3.0.2 + '@types/node': 22.20.0 + '@types/unist': 3.0.3 concat-stream: 2.0.0 - debug: 4.3.4 + debug: 4.4.3 extend: 3.0.2 - glob: 10.3.15 - ignore: 5.3.1 + glob: 10.5.0 + ignore: 6.0.2 is-empty: 1.2.0 is-plain-obj: 4.1.0 load-plugin: 6.0.3 parse-json: 7.1.1 trough: 2.2.0 - unist-util-inspect: 8.0.0 - vfile: 6.0.1 - vfile-message: 4.0.2 + unist-util-inspect: 8.1.0 + vfile: 6.0.3 + vfile-message: 4.0.3 vfile-reporter: 8.1.1 vfile-statistics: 3.0.0 - yaml: 2.4.2 + yaml: 2.9.0 transitivePeerDependencies: + - bluebird - supports-color - dev: true - /unified-lint-rule@1.0.6: - resolution: {integrity: sha512-YPK15YBFwnsVorDFG/u0cVVQN5G2a3V8zv5/N6KN3TCG+ajKtaALcy7u14DCSrJI+gZeyYquFL9cioJXOGXSvg==} + unified-lint-rule@1.0.6: dependencies: wrapped: 1.0.1 - dev: true - /unified-lint-rule@3.0.0: - resolution: {integrity: sha512-Sz96ILLsTy3djsG3H44zFb2b77MFf9CQVYnV3PWkxgRX8/n31fFrr+JnzUaJ6cbOHTtZnL1A71+YodsTjzwAew==} + unified-lint-rule@3.0.1: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 trough: 2.2.0 - unified: 11.0.4 - vfile: 6.0.1 - dev: true + unified: 11.0.5 + vfile: 6.0.3 - /unified-message-control@5.0.0: - resolution: {integrity: sha512-B2cSAkpuMVVmPP90KCfKdBhm1e9KYJ+zK3x5BCa0N65zpq1Ybkc9C77+M5qwR8FWO7RF3LM5QRRPZtgjW6DUCw==} + unified-message-control@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 devlop: 1.1.0 space-separated-tokens: 2.0.2 - unist-util-is: 6.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - vfile-location: 5.0.2 - vfile-message: 4.0.2 - dev: true + unist-util-is: 6.0.1 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + vfile-message: 4.0.3 - /unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unified@11.0.5: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 bail: 2.0.2 devlop: 1.1.0 extend: 3.0.2 is-plain-obj: 4.1.0 trough: 2.2.0 - vfile: 6.0.1 - dev: true - - /union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - dev: false + vfile: 6.0.3 - /union-value@2.0.1: - resolution: {integrity: sha512-NmcRHHhUy1qWmp6yYWsaURV2qwfS24TmTtO9S9x0L41wCNNVBQFD3toOzO0cd8SsNrFhbw/O0iYO5uffXGYocw==} - engines: {node: '>=6'} + union-value@2.0.1: dependencies: get-value: 3.0.1 set-value: 3.0.3 - dev: false - - /unique-stream@1.0.0: - resolution: {integrity: sha512-L8KM6TdpsoBk6TJTXevbmpub3bATS06Znu3BcfVPVQkFtnh1MFeCZ3gFKCQcji7f7YYiigsO5OR99vqhoNT8nQ==} - dev: false - - /unique-stream@2.3.1: - resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} - dependencies: - json-stable-stringify-without-jsonify: 1.0.1 - through2-filter: 3.0.0 - dev: false - - /unique-string@3.0.0: - resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} - engines: {node: '>=12'} - dependencies: - crypto-random-string: 4.0.0 - dev: true - /unist-util-generated@1.1.6: - resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} - dev: true - - /unist-util-inspect@8.0.0: - resolution: {integrity: sha512-/3Wn/wU6/H6UEo4FoYUeo8KUePN8ERiZpQYFWYoihOsr1DoDuv80PeB0hobVZyYSvALa2e556bG1A1/AbwU4yg==} - dependencies: - '@types/unist': 3.0.2 - dev: true - - /unist-util-is@3.0.0: - resolution: {integrity: sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==} - dev: true - - /unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - dev: true - - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-inspect@8.1.0: dependencies: - '@types/unist': 3.0.2 - dev: true + '@types/unist': 3.0.3 - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - dependencies: - '@types/unist': 3.0.2 - dev: true + unist-util-is@3.0.0: {} - /unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-is@6.0.1: dependencies: - '@types/unist': 3.0.2 - unist-util-visit: 5.0.0 - dev: true + '@types/unist': 3.0.3 - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-position@5.0.0: dependencies: - '@types/unist': 3.0.2 - dev: true + '@types/unist': 3.0.3 - /unist-util-to-list-of-char@0.1.3: - resolution: {integrity: sha512-f8GrLHdhBKfaW6mzJc25BKeUOqhsuiRXlGrXBtb3pmRT3QCuYS+jH4g7Uf52hjV7TLQN4PGnjzrTFMFXAQaprA==} + unist-util-stringify-position@4.0.0: dependencies: - unist-util-generated: 1.1.6 - unist-util-visit: 1.4.1 - dev: true + '@types/unist': 3.0.3 - /unist-util-visit-parents@2.1.2: - resolution: {integrity: sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==} + unist-util-visit-parents@2.1.2: dependencies: unist-util-is: 3.0.0 - dev: true - - /unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 4.1.0 - dev: true - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.2: dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - dev: true + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 - /unist-util-visit@1.4.1: - resolution: {integrity: sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==} + unist-util-visit@1.4.1: dependencies: unist-util-visit-parents: 2.1.2 - dev: true - - /unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 - dev: true - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.1.0: dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: true - - /universal-user-agent@6.0.1: - resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - dev: true - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: false - - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true - - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: false + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 - /unset-value@1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - dev: false + universalify@0.1.2: {} - /upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - dev: false + unpipe@1.0.0: {} - /update-browserslist-db@1.0.16(browserslist@4.23.0): - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.2.3(browserslist@4.28.4): dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.1 + browserslist: 4.28.4 + escalade: 3.2.0 + picocolors: 1.1.1 - /update-notifier@7.0.0: - resolution: {integrity: sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ==} - engines: {node: '>=18'} - dependencies: - boxen: 7.1.1 - chalk: 5.3.0 - configstore: 6.0.0 - import-lazy: 4.0.0 - is-in-ci: 0.1.0 - is-installed-globally: 0.4.0 - is-npm: 6.0.0 - latest-version: 7.0.0 - pupa: 3.1.0 - semver: 7.6.0 - semver-diff: 4.0.0 - xdg-basedir: 5.1.0 - dev: true - - /upng-js@2.1.0: - resolution: {integrity: sha512-d3xzZzpMP64YkjP5pr8gNyvBt7dLk/uGI67EctzDuVp4lCZyVMo0aJO6l/VDlgbInJYDY6cnClLoBp29eKWI6g==} - dependencies: - pako: 1.0.11 - dev: false - - /upper-case@1.1.3: - resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} - dev: false - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - /urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - dev: false - - /url-join@5.0.0: - resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /url-parse-lax@1.0.0: - resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} - engines: {node: '>=0.10.0'} - dependencies: - prepend-http: 1.0.4 - dev: false - - /url-parse-lax@3.0.0: - resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} - engines: {node: '>=4'} - dependencies: - prepend-http: 2.0.0 - - /url-to-options@1.0.1: - resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==} - engines: {node: '>= 4'} - dev: false - - /use@3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - dev: false - - /user-home@1.1.1: - resolution: {integrity: sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - /util-extend@1.0.3: - resolution: {integrity: sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==} - dev: false - - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: false - - /uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - dev: false + util-deprecate@1.0.2: {} - /v8-compile-cache@2.4.0: - resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} - dev: true + util-extend@1.0.3: {} - /v8flags@2.1.1: - resolution: {integrity: sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA==} - engines: {node: '>= 0.10.0'} - dependencies: - user-home: 1.1.1 - dev: false + utils-merge@1.0.1: {} - /v8flags@3.2.0: - resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} - engines: {node: '>= 0.10'} - dependencies: - homedir-polyfill: 1.0.3 - dev: false + v8flags@4.0.1: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - /value-or-function@3.0.0: - resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==} - engines: {node: '>= 0.10'} - dev: false + validate-npm-package-name@5.0.1: {} - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: false + value-or-function@4.0.0: {} - /vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + vary@1.1.2: {} + + vfile-location@5.0.3: dependencies: - '@types/unist': 3.0.2 - vfile: 6.0.1 - dev: true + '@types/unist': 3.0.3 + vfile: 6.0.3 - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.3: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 - dev: true - /vfile-reporter@8.1.1: - resolution: {integrity: sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==} + vfile-reporter@8.1.1: dependencies: '@types/supports-color': 8.1.3 string-width: 6.1.0 supports-color: 9.4.0 unist-util-stringify-position: 4.0.0 - vfile: 6.0.1 - vfile-message: 4.0.2 + vfile: 6.0.3 + vfile-message: 4.0.3 vfile-sort: 4.0.0 vfile-statistics: 3.0.0 - dev: true - /vfile-sort@4.0.0: - resolution: {integrity: sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==} + vfile-sort@4.0.0: dependencies: - vfile: 6.0.1 - vfile-message: 4.0.2 - dev: true + vfile: 6.0.3 + vfile-message: 4.0.3 - /vfile-statistics@3.0.0: - resolution: {integrity: sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==} + vfile-statistics@3.0.0: dependencies: - vfile: 6.0.1 - vfile-message: 4.0.2 - dev: true + vfile: 6.0.3 + vfile-message: 4.0.3 - /vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vfile@6.0.3: dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - dev: true + '@types/unist': 3.0.3 + vfile-message: 4.0.3 - /vinyl-file@5.0.0: - resolution: {integrity: sha512-MvkPF/yA1EX7c6p+juVIvp9+Lxp70YUfNKzEWeHMKpUNVSnTZh2coaOqLxI0pmOe2V9nB+OkgFaMDkodaJUyGw==} - engines: {node: '>=14.16'} + vinyl-contents@2.0.0: + dependencies: + bl: 5.1.0 + vinyl: 3.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + vinyl-file@5.0.0: dependencies: '@types/vinyl': 2.0.12 strip-bom-buf: 3.0.1 strip-bom-stream: 5.0.0 - vinyl: 3.0.0 - dev: false + vinyl: 3.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /vinyl-fs@0.3.14: - resolution: {integrity: sha512-9CTKjt8378nhdydwFDTwywKio0n8aqq6xA70g0uypcnTNSCow/gQOwv0L9E2GaKd7EQ3kZl/diBxPSCgcBXESw==} - engines: {node: '>= 0.10'} + vinyl-fs@4.0.2: dependencies: - defaults: 1.0.4 - glob-stream: 3.1.18 - glob-watcher: 0.0.6 - graceful-fs: 3.0.12 - mkdirp: 0.5.6 - strip-bom: 1.0.0 - through2: 0.6.5 - vinyl: 0.4.6 - dev: false - - /vinyl-fs@3.0.3: - resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} - engines: {node: '>= 0.10'} - dependencies: - fs-mkdirp-stream: 1.0.0 - glob-stream: 6.1.0 + fs-mkdirp-stream: 2.0.1 + glob-stream: 8.0.3 graceful-fs: 4.2.11 + iconv-lite: 0.6.3 is-valid-glob: 1.0.0 - lazystream: 1.0.1 - lead: 1.0.0 - object.assign: 4.1.5 - pumpify: 1.5.1 - readable-stream: 2.3.8 - remove-bom-buffer: 3.0.0 - remove-bom-stream: 1.2.0 - resolve-options: 1.1.0 - through2: 2.0.5 - to-through: 2.0.0 - value-or-function: 3.0.0 - vinyl: 2.2.1 - vinyl-sourcemap: 1.1.0 - dev: false - - /vinyl-ftp@0.6.1: - resolution: {integrity: sha512-HVp7xuWx9xQC+tzsCCYCnpd3ZVXK8wa4sMEhdkiGY6rY7P1sIm71YkfLjzdYXGS4hseOiSBSS75jPxZBozol6A==} - engines: {node: '>=0.10.0'} - dependencies: - ftp: 0.3.10 - minimatch: 3.1.2 - object-assign: 4.1.1 - parallel-transform: 1.2.0 - through2: 2.0.5 - vinyl: 2.2.1 - dev: false + lead: 4.0.0 + normalize-path: 3.0.0 + resolve-options: 2.0.0 + stream-composer: 1.0.2 + streamx: 2.28.0 + to-through: 3.0.0 + value-or-function: 4.0.0 + vinyl: 3.0.1 + vinyl-sourcemap: 2.0.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /vinyl-sourcemap@1.1.0: - resolution: {integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==} - engines: {node: '>= 0.10'} + vinyl-sourcemap@2.0.0: dependencies: - append-buffer: 1.0.2 - convert-source-map: 1.9.0 + convert-source-map: 2.0.0 graceful-fs: 4.2.11 - normalize-path: 2.1.1 - now-and-later: 2.0.1 - remove-bom-buffer: 3.0.0 - vinyl: 2.2.1 - dev: false + now-and-later: 3.0.0 + streamx: 2.28.0 + vinyl: 3.0.1 + vinyl-contents: 2.0.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /vinyl-sourcemaps-apply@0.2.1: - resolution: {integrity: sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==} + vinyl-sourcemaps-apply@0.2.1: dependencies: source-map: 0.5.7 - dev: false - - /vinyl@0.4.6: - resolution: {integrity: sha512-pmza4M5VA15HOImIQYWhoXGlGNafCm0QK5BpBUXkzzEwrRxKqBsbAhTfkT2zMcJhUX1G1Gkid0xaV8WjOl7DsA==} - engines: {node: '>= 0.9'} - dependencies: - clone: 0.2.0 - clone-stats: 0.0.1 - dev: false - - /vinyl@0.5.3: - resolution: {integrity: sha512-P5zdf3WB9uzr7IFoVQ2wZTmUwHL8cMZWJGzLBNCHNZ3NB6HTMsYABtt7z8tAGIINLXyAob9B9a1yzVGMFOYKEA==} - engines: {node: '>= 0.9'} - dependencies: - clone: 1.0.4 - clone-stats: 0.0.1 - replace-ext: 0.0.1 - dev: false - - /vinyl@2.2.1: - resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} - engines: {node: '>= 0.10'} - dependencies: - clone: 2.1.2 - clone-buffer: 1.0.0 - clone-stats: 1.0.0 - cloneable-readable: 1.1.3 - remove-trailing-separator: 1.1.0 - replace-ext: 1.0.1 - dev: false - /vinyl@3.0.0: - resolution: {integrity: sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==} - engines: {node: '>=10.13.0'} + vinyl@3.0.1: dependencies: clone: 2.1.2 - clone-stats: 1.0.0 remove-trailing-separator: 1.1.0 replace-ext: 2.0.0 teex: 1.0.1 - dev: false + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - /walk-up-path@3.0.1: - resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} - dev: true + walk-up-path@3.0.1: {} - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - - /web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + whatwg-encoding@3.1.1: dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true + iconv-lite: 0.6.3 - /which-module@1.0.0: - resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} - dev: false + whatwg-mimetype@4.0.0: {} - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - dev: true - - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - dev: true - - /wildcard-match@5.1.3: - resolution: {integrity: sha512-a95hPUk+BNzSGLntNXYxsjz2Hooi5oL7xOfJR6CKwSsSALh7vUNuTlzsrZowtYy38JNduYFRVhFv19ocqNOZlg==} - dev: true - - /windows-release@5.1.1: - resolution: {integrity: sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + which@4.0.0: dependencies: - execa: 5.1.1 - dev: true + isexe: 3.1.5 - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true + word-wrap@1.2.5: {} - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true + wordwrap@1.0.0: {} - /wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} + wrap-ansi@10.0.0: dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - dev: false + ansi-styles: 6.2.3 + string-width: 8.2.1 + strip-ansi: 7.2.0 - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.2.0 - /wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} + wrap-ansi@9.0.2: dependencies: - ansi-styles: 6.2.1 - string-width: 7.1.0 - strip-ansi: 7.1.0 - dev: true + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 - /wrapped@1.0.1: - resolution: {integrity: sha512-ZTKuqiTu3WXtL72UKCCnQLRax2IScKH7oQ+mvjbpvNE+NJxIWIemDqqM2GxNr4N16NCjOYpIgpin5pStM7kM5g==} + wrapped@1.0.1: dependencies: co: 3.1.0 sliced: 1.0.1 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - dev: true - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true + wrappy@1.0.2: {} - /write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + write-file-atomic@7.0.1: dependencies: - imurmurhash: 0.1.4 signal-exit: 4.1.0 - dev: true - - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - /xdg-basedir@5.1.0: - resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} - engines: {node: '>=12'} - dev: true + ws@8.21.0: {} - /xml2js@0.6.2: - resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} - engines: {node: '>=4.0.0'} + xml2js@0.6.2: dependencies: - sax: 1.3.0 + sax: 1.6.0 xmlbuilder: 11.0.1 - dev: false - - /xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - dev: false - - /xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} - engines: {node: '>=0.4.0'} - dev: false - - /xregexp@2.0.0: - resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==} - dev: false - - /xregexp@5.1.1: - resolution: {integrity: sha512-fKXeVorD+CzWvFs7VBuKTYIW63YD1e1osxwQ8caZ6o1jg6pDAbABDG54LCIq0j5cy7PjRvGIq6sef9DYPXpncg==} - dependencies: - '@babel/runtime-corejs3': 7.24.5 - dev: true - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: false - - /y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - dev: false - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: false + xmlbuilder@11.0.1: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + xmlhttprequest-ssl@2.1.2: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + xtend@4.0.2: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true + y18n@5.0.8: {} - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true + yaml@2.9.0: {} - /yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} - hasBin: true + yargs-parser@20.2.9: {} - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true + yargs-parser@21.1.1: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@22.0.0: {} - /yargs-parser@5.0.1: - resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==} + yargs@16.2.2: dependencies: - camelcase: 3.0.0 - object.assign: 4.1.5 - dev: false + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.3: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - /yargs@7.1.2: - resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==} + yargs@18.0.0: dependencies: - camelcase: 3.0.0 - cliui: 3.2.0 - decamelize: 1.2.0 - get-caller-file: 1.0.3 - os-locale: 1.4.0 - read-pkg-up: 1.0.1 - require-directory: 2.1.1 - require-main-filename: 1.0.1 - set-blocking: 2.0.0 - string-width: 1.0.2 - which-module: 1.0.0 - y18n: 3.2.2 - yargs-parser: 5.0.1 - dev: false - - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - dev: false - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@0.1.0: {} - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: true + yoctocolors-cjs@2.1.3: {} - github.com/cebreus/gulp-html-validate/d7b9e99eaaa3d5df85c00274bb5f5e61e0fe85d9(gulp@4.0.2)(html-validate@8.18.2): - resolution: {tarball: https://codeload.github.com/cebreus/gulp-html-validate/tar.gz/d7b9e99eaaa3d5df85c00274bb5f5e61e0fe85d9} - id: github.com/cebreus/gulp-html-validate/d7b9e99eaaa3d5df85c00274bb5f5e61e0fe85d9 - name: gulp-html-validate - version: 0.2.0 - peerDependencies: - gulp: '>=4' - html-validate: '>=4' - dependencies: - fancy-log: 1.3.3 - gulp: 4.0.2 - html-validate: 8.18.2 - plugin-error: 1.0.1 - through2: 4.0.2 - dev: false + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..f9ca40b --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,12 @@ +allowBuilds: + '@parcel/watcher': true + es5-ext: true + esbuild: true + gifsicle: true + lefthook: true + mozjpeg: true + optipng-bin: true + sharp: true +overrides: + favicons>sharp: 0.35.2 + ws@>=8.0.0 <8.21.0: ^8.21.0 diff --git a/static/.well-known/security.txt b/public/.well-known/security.txt similarity index 100% rename from static/.well-known/security.txt rename to public/.well-known/security.txt diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..2e59664 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: /*.*? diff --git a/scripts/hooks/fix-blank-line.js b/scripts/hooks/fix-blank-line.js new file mode 100644 index 0000000..96dd3b9 --- /dev/null +++ b/scripts/hooks/fix-blank-line.js @@ -0,0 +1,13 @@ +import fs from 'node:fs' + +const filePath = process.argv[2] +if (!filePath) { + process.exit(0) +} + +const content = fs.readFileSync(filePath, 'utf8') +const lines = content.split('\n') +if (lines.length > 1 && lines[0].trim() && lines[1].trim()) { + lines.splice(1, 0, '') + fs.writeFileSync(filePath, lines.join('\n')) +} diff --git a/scripts/hooks/fold-lines.js b/scripts/hooks/fold-lines.js new file mode 100644 index 0000000..0cdfdac --- /dev/null +++ b/scripts/hooks/fold-lines.js @@ -0,0 +1,54 @@ +import fs from 'node:fs' + +const filePath = process.argv[2] +if (!filePath) { + process.exit(0) +} + +const MAX_WIDTH = 100 + +const content = fs.readFileSync(filePath, 'utf8') +const lines = content.split('\n') + +function wrapLine(line, maxWidth) { + if (line.length <= maxWidth) { + return [line] + } + + const words = line.split(' ') + const wrapped = [] + let current = '' + + for (const word of words) { + const next = current ? current + ' ' + word : word + if (next.length <= maxWidth) { + current = next + continue + } + + if (current) { + wrapped.push(current) + } + + if (word.length <= maxWidth) { + current = word + continue + } + + let rest = word + while (rest.length > maxWidth) { + wrapped.push(rest.slice(0, maxWidth)) + rest = rest.slice(maxWidth) + } + current = rest + } + + if (current) { + wrapped.push(current) + } + + return wrapped +} + +const wrappedLines = lines.flatMap((line) => wrapLine(line, MAX_WIDTH)) +fs.writeFileSync(filePath, wrappedLines.join('\n')) diff --git a/scripts/release.js b/scripts/release.js new file mode 100644 index 0000000..0ae741f --- /dev/null +++ b/scripts/release.js @@ -0,0 +1,107 @@ +import { spawnSync } from 'node:child_process' +import { rmSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' + +/** + * Release-it configuration and execution wrapper. + * This script provides on-demand release capabilities without polluting + * the project's devDependencies. + */ + +const CONFIG_FILE = '.release-it.tmp.json' + +const config = { + git: { + changelog: 'git log --pretty=format:"* %s (%h)" ${latestTag}...HEAD', + requireCleanWorkingDir: true, + requireUpstream: true, + requireCommits: true, + addUntrackedFiles: false, + commit: true, + commitMessage: 'release: v${version}', + tag: true, + tagName: 'v${version}', + tagAnnotation: 'Release v${version}', + push: true, + pushArgs: '--follow-tags', + }, + github: { + release: false, + }, + npm: { + publish: false, + }, + plugins: { + '@release-it/conventional-changelog': { + infile: 'CHANGELOG.md', + header: '# Changelog', + preset: { + name: 'conventionalcommits', + types: [ + { type: 'feat', section: 'Features' }, + { type: 'fix', section: 'Bug Fixes' }, + { type: 'chore', section: 'Miscellaneous' }, + { type: 'refactor', section: 'Refactoring' }, + { type: 'perf', section: 'Performance' }, + ], + }, + }, + }, +} + +function runReleaseIt() { + console.log('πŸ“¦ Running release-it via pnpm dlx...') + + // We use pnpm dlx to run release-it with plugins in an isolated environment + const args = [ + 'dlx', + '--silent', + '-p', + 'release-it@^20.0.0', + '-p', + '@release-it/conventional-changelog@^10.0.6', + '-p', + '@j-ulrich/release-it-regex-bumper@^5.4.0', + 'release-it', + '--config', + CONFIG_FILE, + ...process.argv.slice(2), + ] + + const result = spawnSync('pnpm', args, { + stdio: 'inherit', + shell: true, + }) + + if (result.status !== 0) { + process.exit(result.status ?? 1) + } +} + +function cleanupTemporaryConfig(configPath) { + try { + rmSync(configPath, { force: true }) + } catch (cleanupError) { + console.warn('⚠️ Failed to clean up temporary config:', cleanupError) + } +} + +function main() { + const configPath = join(process.cwd(), CONFIG_FILE) + + try { + console.log('πŸš€ Preparing release environment...') + writeFileSync(configPath, JSON.stringify(config, null, 2)) + runReleaseIt(configPath) + } catch (error) { + console.error( + '❌ Release failed:', + error instanceof Error ? error.message : String(error) + ) + process.exit(1) + } finally { + cleanupTemporaryConfig(configPath) + } +} + +main() diff --git a/scripts/run-njklint.js b/scripts/run-njklint.js new file mode 100644 index 0000000..dfd0036 --- /dev/null +++ b/scripts/run-njklint.js @@ -0,0 +1,91 @@ +import { spawnSync } from 'node:child_process' +import { createRequire } from 'node:module' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const require = createRequire(import.meta.url) + +/** + * Removes noisy informational njklint banner lines while preserving real lint output. + * @param {string} output - Raw stdout/stderr captured from the njklint CLI. + * @returns {string} Filtered output with banner lines removed. + */ +export function filterNjkLintOutput(output) { + return output + .split('\n') + .filter((line) => { + return ( + !line.startsWith('Linting directory: ') && + !line.startsWith('Linting file: ') + ) + }) + .join('\n') +} + +function resolveNjkLintCliPath() { + const packageJsonPath = require.resolve('nunjucklinter/package.json') + const packageDir = path.dirname(packageJsonPath) + return path.join(packageDir, 'dist/index.js') +} + +function writeFilteredOutput(stream, text) { + if (!text) { + return + } + + const filtered = filterNjkLintOutput(text) + if (!filtered) { + return + } + + stream.write(filtered) + if (!filtered.endsWith('\n')) { + stream.write('\n') + } +} + +function main() { + const cliPath = resolveNjkLintCliPath() + const result = spawnSync( + process.execPath, + [cliPath, ...process.argv.slice(2)], + { + encoding: 'utf8', + stdio: ['inherit', 'pipe', 'pipe'], + } + ) + + writeFilteredOutput(process.stdout, result.stdout) + writeFilteredOutput(process.stderr, result.stderr) + + if (result.error) { + throw result.error + } + + process.exit(result.status ?? 0) +} + +/** + * Checks whether this module is the direct CLI entrypoint. + * @param {string} moduleUrl - Current module URL. + * @param {string|undefined} argvPath - Script path from process arguments. + * @returns {boolean} True when the module path and argv path match. + */ +export function isDirectRun(moduleUrl, argvPath) { + if (!argvPath) { + return false + } + + const modulePath = fileURLToPath(moduleUrl) + const scriptPath = path.resolve(argvPath) + + if (process.platform === 'win32') { + return modulePath.toLowerCase() === scriptPath.toLowerCase() + } + + return modulePath === scriptPath +} + +if (isDirectRun(import.meta.url, process.argv[1])) { + main() +} diff --git a/src/assets/css/fonts.css b/src/assets/css/fonts.css new file mode 100644 index 0000000..345fb94 --- /dev/null +++ b/src/assets/css/fonts.css @@ -0,0 +1,29 @@ +@font-face { + font-family: 'Outfit'; + font-style: normal; + font-weight: 400; + font-display: auto; + font-stretch: normal; + src: url(fonts/Outfit-normal-400.woff) format('woff'); + unicode-range: U+0-10FFFF; +} + +@font-face { + font-family: 'Outfit'; + font-style: normal; + font-weight: 600; + font-display: auto; + font-stretch: normal; + src: url(fonts/Outfit-normal-600.woff) format('woff'); + unicode-range: U+0-10FFFF; +} + +@font-face { + font-family: 'Outfit'; + font-style: normal; + font-weight: 800; + font-display: auto; + font-stretch: normal; + src: url(fonts/Outfit-normal-800.woff) format('woff'); + unicode-range: U+0-10FFFF; +} diff --git a/src/assets/css/fonts.min.css b/src/assets/css/fonts.min.css new file mode 100644 index 0000000..f0aed4c --- /dev/null +++ b/src/assets/css/fonts.min.css @@ -0,0 +1 @@ +@font-face{font-display:auto;font-family:Outfit;font-stretch:normal;font-style:normal;font-weight:400;src:url(fonts/Outfit-normal-400.woff) format("woff");unicode-range:u+0-10ffff}@font-face{font-display:auto;font-family:Outfit;font-stretch:normal;font-style:normal;font-weight:600;src:url(fonts/Outfit-normal-600.woff) format("woff");unicode-range:u+0-10ffff}@font-face{font-display:auto;font-family:Outfit;font-stretch:normal;font-style:normal;font-weight:800;src:url(fonts/Outfit-normal-800.woff) format("woff");unicode-range:u+0-10ffff} \ No newline at end of file diff --git a/src/assets/fonts/.gitkeep b/src/assets/fonts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/icons/.gitkeep b/src/assets/icons/.gitkeep new file mode 100644 index 0000000..a443338 --- /dev/null +++ b/src/assets/icons/.gitkeep @@ -0,0 +1 @@ +# This file is intentionally left blank to ensure the src/img directory is tracked. diff --git a/src/gfx/favicon/favicons-source.png b/src/assets/icons/favicons-source.png similarity index 100% rename from src/gfx/favicon/favicons-source.png rename to src/assets/icons/favicons-source.png diff --git a/src/assets/images/.gitkeep b/src/assets/images/.gitkeep new file mode 100644 index 0000000..a443338 --- /dev/null +++ b/src/assets/images/.gitkeep @@ -0,0 +1 @@ +# This file is intentionally left blank to ensure the src/img directory is tracked. diff --git a/src/config/env.js b/src/config/env.js new file mode 100644 index 0000000..02dbc65 --- /dev/null +++ b/src/config/env.js @@ -0,0 +1,15 @@ +import { getEnv } from '../../gulp/utils/index.js' + +/** + * Shared environment configuration for the project. + * Bridges the gap between Gulp build system and source code. + */ +const isDevelopment = getEnv('NODE_ENV', 'development') === 'development' +const isProduction = getEnv('NODE_ENV') === 'production' +const buildMode = getEnv('BUILD_MODE', 'dev') + +export default { + isDevelopment, + isProduction, + buildMode, +} diff --git a/src/config/fonts.list b/src/config/fonts.list new file mode 100644 index 0000000..66c4c8c --- /dev/null +++ b/src/config/fonts.list @@ -0,0 +1 @@ +Outfit 400,600,800 diff --git a/src/config/site.js b/src/config/site.js new file mode 100644 index 0000000..8e90ab3 --- /dev/null +++ b/src/config/site.js @@ -0,0 +1,21 @@ +import { readFileSync } from 'node:fs' + +const pkg = JSON.parse(readFileSync('./package.json', 'utf8')) + +export const siteDefaults = { + title: 'Gulp DevStack', + description: 'Modern frontend development workflow with Gulp', + version: pkg.version, + author: 'Cebreus', + baseUrl: process.env.SITE_BASE_URL || 'http://localhost:3000', + meta: { + lang: 'en', + charset: 'utf-8', + }, + seo: { + title: 'New Project SEO Title', + description: 'New Project SEO Description', + robots: 'index,follow', + include_to_sitemap: true, + }, +} diff --git a/src/fonts.list b/src/fonts.list deleted file mode 100644 index 5a998b3..0000000 --- a/src/fonts.list +++ /dev/null @@ -1,5 +0,0 @@ - -# Tab-delimeted format -# Poppins 400,700 latin,latin-ext - -Poppins 400,700 diff --git a/src/gfx/smajlik.jpg b/src/gfx/smajlik.jpg deleted file mode 100644 index cd3d613..0000000 Binary files a/src/gfx/smajlik.jpg and /dev/null differ diff --git a/src/gfx/smajlik.png b/src/gfx/smajlik.png deleted file mode 100644 index b3d77c4..0000000 Binary files a/src/gfx/smajlik.png and /dev/null differ diff --git a/src/gfx/smajlik.svg b/src/gfx/smajlik.svg deleted file mode 100644 index 30ebf0c..0000000 --- a/src/gfx/smajlik.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/js/bootstrap-custom.js b/src/js/bootstrap-custom.js new file mode 100644 index 0000000..9f36e2d --- /dev/null +++ b/src/js/bootstrap-custom.js @@ -0,0 +1,39 @@ +/** + * Bootstrap 5 Custom Build + * Distilled version containing only necessary components. + * + * NOTE: Some components depend on Popper.js (Dropdown, Popover, Tooltip). + * esbuild handles these dependencies automatically via npm. + */ + +// --- Individual Components (uncomment what you need) --- + +// import Alert from 'bootstrap/js/dist/alert' +// import Button from 'bootstrap/js/dist/button' +// import Carousel from 'bootstrap/js/dist/carousel' +// import Collapse from 'bootstrap/js/dist/collapse' +import Dropdown from 'bootstrap/js/dist/dropdown' +import Modal from 'bootstrap/js/dist/modal' +// import Offcanvas from 'bootstrap/js/dist/offcanvas' +import Popover from 'bootstrap/js/dist/popover' +// import ScrollSpy from 'bootstrap/js/dist/scrollspy' +// import Tab from 'bootstrap/js/dist/tab' +// import Toast from 'bootstrap/js/dist/toast' +import Tooltip from 'bootstrap/js/dist/tooltip' + +// --- Global Initialization (optional) --- +document.addEventListener('DOMContentLoaded', () => { + // Example: Auto-init Tooltips + const tooltipTriggerList = document.querySelectorAll( + '[data-bs-toggle="tooltip"]' + ) + ;[...tooltipTriggerList].map((el) => new Tooltip(el)) + + // Example: Auto-init Popovers + const popoverTriggerList = document.querySelectorAll( + '[data-bs-toggle="popover"]' + ) + ;[...popoverTriggerList].map((el) => new Popover(el)) +}) + +export { Dropdown, Modal, Popover, Tooltip } diff --git a/src/js/custom.js b/src/js/custom.js index 02ee3c1..2675a09 100644 --- a/src/js/custom.js +++ b/src/js/custom.js @@ -1 +1,3 @@ -console.log('Source file `custom.js` processed.'); +function initCustomJs() {} + +initCustomJs() diff --git a/src/js/main.js b/src/js/main.js new file mode 100644 index 0000000..db7ed71 --- /dev/null +++ b/src/js/main.js @@ -0,0 +1,9 @@ +function bindEvents() { + // Add event listeners here. +} + +function initializeApp() { + bindEvents() +} + +document.addEventListener('DOMContentLoaded', initializeApp) diff --git a/src/templates/partials/favicons.njk b/src/lib/components/favicons/favicons.njk similarity index 56% rename from src/templates/partials/favicons.njk rename to src/lib/components/favicons/favicons.njk index 04c9811..18386b9 100644 --- a/src/templates/partials/favicons.njk +++ b/src/lib/components/favicons/favicons.njk @@ -1,4 +1,4 @@ - - - - \ No newline at end of file + + + + diff --git a/src/lib/components/meta-rich-snippets/seo.njk b/src/lib/components/meta-rich-snippets/seo.njk new file mode 100644 index 0000000..1fbd312 --- /dev/null +++ b/src/lib/components/meta-rich-snippets/seo.njk @@ -0,0 +1,15 @@ +{% if page.seo.description or page.description %} + +{% endif %} +{% if page.seo.keywords %} + +{% endif %} +{% if site.meta.author %} + +{% endif %} +{% if page.seo.robots %} + +{% endif %} +{% if page.seo.canonicalSelf %} + +{% endif %} diff --git a/src/routes/404.njk b/src/routes/404.njk new file mode 100644 index 0000000..430a477 --- /dev/null +++ b/src/routes/404.njk @@ -0,0 +1,26 @@ +{% + set page = { + seo: { + title: "404 - Page Not Found", + description: "Sorry, the page you are looking for doesn't exist or has been moved.", + robots: "noindex, follow" + } + } +%} +{% extends "layout-default.njk" %} + +{% block content %} +
+
+
+
+
+

404 β€” Page Not Found

+

The page you are looking for might have been removed or is temporarily unavailable.

+ Go Home +
+
+
+
+
+{% endblock %} diff --git a/src/routes/index.md b/src/routes/index.md new file mode 100644 index 0000000..2bca5b5 --- /dev/null +++ b/src/routes/index.md @@ -0,0 +1,24 @@ +--- +title: Welcome to Blank Template +description: Project initialized from a static site boilerplate. +menuMain: + name: 'Home' + order: 1 + show: true +hero: + title: It works! + description: >- + Gulp Devstack has been successfully initialized into a pristine template.
+ Start building your next high-performance static website. + buttons: + - text: Read the Guide + url: https://gulp-devstack.cebre.us/about + class: btn-primary + - text: View on GitHub + url: https://github.com/cebreus/gulp-devstack + class: btn-outline-secondary +seo: + title: Gulp DevStack - Clean Core + description: A high-control static workflow focused on predictable builds and quality output. + robots: index,follow +--- diff --git a/src/routes/index.njk b/src/routes/index.njk new file mode 100644 index 0000000..dd7175b --- /dev/null +++ b/src/routes/index.njk @@ -0,0 +1,27 @@ +{% extends "layout-default.njk" %} + +{% block content %} + {# Flattened structure: container handles flex centering directly #} +
+ {% if page.hero %} +
+

{{ page.hero.title }}

+

{{ page.hero.description }}

+ {% if page.hero.buttons %} +
+ {% for btn in page.hero.buttons %} + + {{ btn.text }} + + {% endfor %} +
+ {% endif %} +
+ {% endif %} +
+{% endblock %} diff --git a/src/routes/layout-default.njk b/src/routes/layout-default.njk new file mode 100644 index 0000000..1e989b8 --- /dev/null +++ b/src/routes/layout-default.njk @@ -0,0 +1,68 @@ + + + {% block head_tag %} + + + + {{ (page.seo.title or page.title or site.title) | striptags }} + + + + {% block css %} + + + {% for style in pageStyles or [] %} + + {% endfor %} + {% endblock %} + + {% block head_custom %} + {% endblock %} + + {% block meta_seo %} + {% include "components/meta-rich-snippets/seo.njk" %} + {% endblock %} + + {% block favicons %} + {% include "components/favicons/favicons.njk" %} + {% endblock %} + + {% endblock %} + + {% block header %} + {% endblock %} + + {% block main %} + + {% block content %} + {{ page.content | md | safe }} + {% endblock %} + {% endblock %} + + {% block footer %} + {% endblock %} + + {% block js %} + + + + {% for script in pageScripts or [] %} + + {% endfor %} + {% endblock %} + + {% block scripts %} + {% endblock %} + + diff --git a/src/scss/_route-abstracts.scss b/src/scss/_route-abstracts.scss new file mode 100644 index 0000000..20b9216 --- /dev/null +++ b/src/scss/_route-abstracts.scss @@ -0,0 +1,106 @@ +@use 'sass:map'; + +$white: #fff; +$black: #000; +$primary: #0d6efd; +$secondary: #6c757d; +$text-muted: #6c757d; +$dark: #212529; + +$font-family-monospace: + 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', + 'Courier New', monospace; +$font-size-base: 1rem; +$font-size-sm: 0.875rem; +$badge-font-size: 0.75em; +$h2-font-size: 2rem; +$h3-font-size: 1.75rem; +$h4-font-size: 1.5rem; +$h5-font-size: 1.25rem; +$font-weight-semibold: 600; +$font-weight-bold: 700; + +$border-width: 1px; +$border-color: #dee2e6; +$border-radius: 0.375rem; +$border-radius-lg: 0.5rem; +$box-shadow-sm: 0 0.125rem 0.25rem rgba($black, 0.075); +$box-shadow: 0 0.5rem 1rem rgba($black, 0.15); + +$spacers: ( + 0: 0, + 1: 0.25rem, + 2: 0.5rem, + 3: 1rem, + 4: 1.5rem, + 5: 3rem, +); + +$grid-breakpoints: ( + xs: 0, + sm: 576px, + md: 768px, + lg: 992px, + xl: 1200px, + xxl: 1400px, +); + +@function breakpoint-min($name) { + @return map.get($grid-breakpoints, $name); +} + +@function breakpoint-max($name) { + $min: breakpoint-min($name); + @if not $min { + @return null; + } + + @return $min - 0.02px; +} + +@mixin media-breakpoint-up($name) { + $min: breakpoint-min($name); + @if not $min { + @content; + } @else { + @media (min-width: $min) { + @content; + } + } +} + +@mixin media-breakpoint-down($name) { + $max: breakpoint-max($name); + @if not $max { + @content; + } @else { + @media (max-width: $max) { + @content; + } + } +} + +@mixin media-breakpoint-between($lower, $upper) { + $min: breakpoint-min($lower); + $max: breakpoint-max($upper); + + @if $min and $max { + @media (min-width: $min) and (max-width: $max) { + @content; + } + } @else if $max { + @media (max-width: $max) { + @content; + } + } @else if $min { + @media (min-width: $min) { + @content; + } + } @else { + @content; + } +} + +@mixin font-size($size) { + font-size: $size; +} diff --git a/src/scss/_variables.scss b/src/scss/_variables.scss deleted file mode 100644 index faacfb3..0000000 --- a/src/scss/_variables.scss +++ /dev/null @@ -1,1751 +0,0 @@ -$show-debugger: false !default; -$show-grid: info !default; - -// Variables -// -// Variables should follow the `$component-state-property-size` formula for -// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs. - -// Color system - -// scss-docs-start gray-color-variables -$white: #fff !default; -$gray-100: #f8f9fa !default; -$gray-200: #e9ecef !default; -$gray-300: #dee2e6 !default; -$gray-400: #ced4da !default; -$gray-500: #adb5bd !default; -$gray-600: #6c757d !default; -$gray-700: #495057 !default; -$gray-800: #343a40 !default; -$gray-900: #212529 !default; -$black: #000 !default; -// scss-docs-end gray-color-variables - -// fusv-disable -// scss-docs-start gray-colors-map -$grays: ( - "100": $gray-100, - "200": $gray-200, - "300": $gray-300, - "400": $gray-400, - "500": $gray-500, - "600": $gray-600, - "700": $gray-700, - "800": $gray-800, - "900": $gray-900 -) !default; -// scss-docs-end gray-colors-map -// fusv-enable - -// scss-docs-start color-variables -$blue: #005bf7 !default; -$indigo: #6610f2 !default; -$purple: #6f42c1 !default; -$pink: #d63384 !default; -$red: #ed0b36 !default; -$orange: #ff8442 !default; -$yellow: #ffc107 !default; -$green: #198754 !default; -$teal: #20c997 !default; -$cyan: #0dcaf0 !default; -// scss-docs-end color-variables - -// scss-docs-start colors-map -$colors: ( - "blue": $blue, - "indigo": $indigo, - "purple": $purple, - "pink": $pink, - "red": $red, - "orange": $orange, - "yellow": $yellow, - "green": $green, - "teal": $teal, - "cyan": $cyan, - "black": $black, - "white": $white, - "gray": $gray-600, - "gray-dark": $gray-800 -) !default; -// scss-docs-end colors-map - -// The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.0 are 3, 4.5 and 7. -// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast -$min-contrast-ratio: 4.5 !default; - -// Customize the light and dark text colors for use in our color contrast function. -$color-contrast-dark: $black !default; -$color-contrast-light: $white !default; - -// fusv-disable -$blue-100: tint-color($blue, 80%) !default; -$blue-200: tint-color($blue, 60%) !default; -$blue-300: tint-color($blue, 40%) !default; -$blue-400: tint-color($blue, 20%) !default; -$blue-500: $blue !default; -$blue-600: shade-color($blue, 20%) !default; -$blue-700: shade-color($blue, 40%) !default; -$blue-800: shade-color($blue, 60%) !default; -$blue-900: shade-color($blue, 80%) !default; - -$indigo-100: tint-color($indigo, 80%) !default; -$indigo-200: tint-color($indigo, 60%) !default; -$indigo-300: tint-color($indigo, 40%) !default; -$indigo-400: tint-color($indigo, 20%) !default; -$indigo-500: $indigo !default; -$indigo-600: shade-color($indigo, 20%) !default; -$indigo-700: shade-color($indigo, 40%) !default; -$indigo-800: shade-color($indigo, 60%) !default; -$indigo-900: shade-color($indigo, 80%) !default; - -$purple-100: tint-color($purple, 80%) !default; -$purple-200: tint-color($purple, 60%) !default; -$purple-300: tint-color($purple, 40%) !default; -$purple-400: tint-color($purple, 20%) !default; -$purple-500: $purple !default; -$purple-600: shade-color($purple, 20%) !default; -$purple-700: shade-color($purple, 40%) !default; -$purple-800: shade-color($purple, 60%) !default; -$purple-900: shade-color($purple, 80%) !default; - -$pink-100: tint-color($pink, 80%) !default; -$pink-200: tint-color($pink, 60%) !default; -$pink-300: tint-color($pink, 40%) !default; -$pink-400: tint-color($pink, 20%) !default; -$pink-500: $pink !default; -$pink-600: shade-color($pink, 20%) !default; -$pink-700: shade-color($pink, 40%) !default; -$pink-800: shade-color($pink, 60%) !default; -$pink-900: shade-color($pink, 80%) !default; - -$red-100: tint-color($red, 80%) !default; -$red-200: tint-color($red, 60%) !default; -$red-300: tint-color($red, 40%) !default; -$red-400: tint-color($red, 20%) !default; -$red-500: $red !default; -$red-600: shade-color($red, 20%) !default; -$red-700: shade-color($red, 40%) !default; -$red-800: shade-color($red, 60%) !default; -$red-900: shade-color($red, 80%) !default; - -$orange-100: tint-color($orange, 80%) !default; -$orange-200: tint-color($orange, 60%) !default; -$orange-300: tint-color($orange, 40%) !default; -$orange-400: tint-color($orange, 20%) !default; -$orange-500: $orange !default; -$orange-600: shade-color($orange, 20%) !default; -$orange-700: shade-color($orange, 40%) !default; -$orange-800: shade-color($orange, 60%) !default; -$orange-900: shade-color($orange, 80%) !default; - -$yellow-100: tint-color($yellow, 80%) !default; -$yellow-200: tint-color($yellow, 60%) !default; -$yellow-300: tint-color($yellow, 40%) !default; -$yellow-400: tint-color($yellow, 20%) !default; -$yellow-500: $yellow !default; -$yellow-600: shade-color($yellow, 20%) !default; -$yellow-700: shade-color($yellow, 40%) !default; -$yellow-800: shade-color($yellow, 60%) !default; -$yellow-900: shade-color($yellow, 80%) !default; - -$green-100: tint-color($green, 80%) !default; -$green-200: tint-color($green, 60%) !default; -$green-300: tint-color($green, 40%) !default; -$green-400: tint-color($green, 20%) !default; -$green-500: $green !default; -$green-600: shade-color($green, 20%) !default; -$green-700: shade-color($green, 40%) !default; -$green-800: shade-color($green, 60%) !default; -$green-900: shade-color($green, 80%) !default; - -$teal-100: tint-color($teal, 80%) !default; -$teal-200: tint-color($teal, 60%) !default; -$teal-300: tint-color($teal, 40%) !default; -$teal-400: tint-color($teal, 20%) !default; -$teal-500: $teal !default; -$teal-600: shade-color($teal, 20%) !default; -$teal-700: shade-color($teal, 40%) !default; -$teal-800: shade-color($teal, 60%) !default; -$teal-900: shade-color($teal, 80%) !default; - -$cyan-100: tint-color($cyan, 80%) !default; -$cyan-200: tint-color($cyan, 60%) !default; -$cyan-300: tint-color($cyan, 40%) !default; -$cyan-400: tint-color($cyan, 20%) !default; -$cyan-500: $cyan !default; -$cyan-600: shade-color($cyan, 20%) !default; -$cyan-700: shade-color($cyan, 40%) !default; -$cyan-800: shade-color($cyan, 60%) !default; -$cyan-900: shade-color($cyan, 80%) !default; - -$blues: ( - "blue-100": $blue-100, - "blue-200": $blue-200, - "blue-300": $blue-300, - "blue-400": $blue-400, - "blue-500": $blue-500, - "blue-600": $blue-600, - "blue-700": $blue-700, - "blue-800": $blue-800, - "blue-900": $blue-900 -) !default; - -$indigos: ( - "indigo-100": $indigo-100, - "indigo-200": $indigo-200, - "indigo-300": $indigo-300, - "indigo-400": $indigo-400, - "indigo-500": $indigo-500, - "indigo-600": $indigo-600, - "indigo-700": $indigo-700, - "indigo-800": $indigo-800, - "indigo-900": $indigo-900 -) !default; - -$purples: ( - "purple-100": $purple-100, - "purple-200": $purple-200, - "purple-300": $purple-300, - "purple-400": $purple-400, - "purple-500": $purple-500, - "purple-600": $purple-600, - "purple-700": $purple-700, - "purple-800": $purple-800, - "purple-900": $purple-900 -) !default; - -$pinks: ( - "pink-100": $pink-100, - "pink-200": $pink-200, - "pink-300": $pink-300, - "pink-400": $pink-400, - "pink-500": $pink-500, - "pink-600": $pink-600, - "pink-700": $pink-700, - "pink-800": $pink-800, - "pink-900": $pink-900 -) !default; - -$reds: ( - "red-100": $red-100, - "red-200": $red-200, - "red-300": $red-300, - "red-400": $red-400, - "red-500": $red-500, - "red-600": $red-600, - "red-700": $red-700, - "red-800": $red-800, - "red-900": $red-900 -) !default; - -$oranges: ( - "orange-100": $orange-100, - "orange-200": $orange-200, - "orange-300": $orange-300, - "orange-400": $orange-400, - "orange-500": $orange-500, - "orange-600": $orange-600, - "orange-700": $orange-700, - "orange-800": $orange-800, - "orange-900": $orange-900 -) !default; - -$yellows: ( - "yellow-100": $yellow-100, - "yellow-200": $yellow-200, - "yellow-300": $yellow-300, - "yellow-400": $yellow-400, - "yellow-500": $yellow-500, - "yellow-600": $yellow-600, - "yellow-700": $yellow-700, - "yellow-800": $yellow-800, - "yellow-900": $yellow-900 -) !default; - -$greens: ( - "green-100": $green-100, - "green-200": $green-200, - "green-300": $green-300, - "green-400": $green-400, - "green-500": $green-500, - "green-600": $green-600, - "green-700": $green-700, - "green-800": $green-800, - "green-900": $green-900 -) !default; - -$teals: ( - "teal-100": $teal-100, - "teal-200": $teal-200, - "teal-300": $teal-300, - "teal-400": $teal-400, - "teal-500": $teal-500, - "teal-600": $teal-600, - "teal-700": $teal-700, - "teal-800": $teal-800, - "teal-900": $teal-900 -) !default; - -$cyans: ( - "cyan-100": $cyan-100, - "cyan-200": $cyan-200, - "cyan-300": $cyan-300, - "cyan-400": $cyan-400, - "cyan-500": $cyan-500, - "cyan-600": $cyan-600, - "cyan-700": $cyan-700, - "cyan-800": $cyan-800, - "cyan-900": $cyan-900 -) !default; -// fusv-enable - -// scss-docs-start theme-color-variables -$primary: $blue !default; -$secondary: $gray-600 !default; -$success: $green !default; -$info: $cyan !default; -$warning: $yellow !default; -$danger: $red !default; -$light: $gray-100 !default; -$dark: $gray-900 !default; -// scss-docs-end theme-color-variables - -// scss-docs-start theme-colors-map -$theme-colors: ( - "primary": $primary, - "secondary": $secondary, - "success": $success, - "info": $info, - "warning": $warning, - "danger": $danger, - "light": $light, - "dark": $dark -) !default; -// scss-docs-end theme-colors-map - -// scss-docs-start theme-text-variables -$primary-text-emphasis: shade-color($primary, 60%) !default; -$secondary-text-emphasis: shade-color($secondary, 60%) !default; -$success-text-emphasis: shade-color($success, 60%) !default; -$info-text-emphasis: shade-color($info, 60%) !default; -$warning-text-emphasis: shade-color($warning, 60%) !default; -$danger-text-emphasis: shade-color($danger, 60%) !default; -$light-text-emphasis: $gray-700 !default; -$dark-text-emphasis: $gray-700 !default; -// scss-docs-end theme-text-variables - -// scss-docs-start theme-bg-subtle-variables -$primary-bg-subtle: tint-color($primary, 80%) !default; -$secondary-bg-subtle: tint-color($secondary, 80%) !default; -$success-bg-subtle: tint-color($success, 80%) !default; -$info-bg-subtle: tint-color($info, 80%) !default; -$warning-bg-subtle: tint-color($warning, 80%) !default; -$danger-bg-subtle: tint-color($danger, 80%) !default; -$light-bg-subtle: mix($gray-100, $white) !default; -$dark-bg-subtle: $gray-400 !default; -// scss-docs-end theme-bg-subtle-variables - -// scss-docs-start theme-border-subtle-variables -$primary-border-subtle: tint-color($primary, 60%) !default; -$secondary-border-subtle: tint-color($secondary, 60%) !default; -$success-border-subtle: tint-color($success, 60%) !default; -$info-border-subtle: tint-color($info, 60%) !default; -$warning-border-subtle: tint-color($warning, 60%) !default; -$danger-border-subtle: tint-color($danger, 60%) !default; -$light-border-subtle: $gray-200 !default; -$dark-border-subtle: $gray-500 !default; -// scss-docs-end theme-border-subtle-variables - -// Characters which are escaped by the escape-svg function -$escaped-characters: ( - ("<", "%3c"), - (">", "%3e"), - ("#", "%23"), - ("(", "%28"), - (")", "%29"), -) !default; - -// Options -// -// Quickly modify global styling by enabling or disabling optional features. - -$enable-caret: true !default; -$enable-rounded: true !default; -$enable-shadows: false !default; -$enable-gradients: false !default; -$enable-transitions: true !default; -$enable-reduced-motion: true !default; -$enable-smooth-scroll: true !default; -$enable-grid-classes: true !default; -$enable-container-classes: true !default; -$enable-cssgrid: false !default; -$enable-button-pointers: true !default; -$enable-rfs: true !default; -$enable-validation-icons: true !default; -$enable-negative-margins: false !default; -$enable-deprecation-messages: true !default; -$enable-important-utilities: true !default; - -$enable-dark-mode: true !default; -$color-mode-type: data !default; // `data` or `media-query` - -// Prefix for :root CSS variables - -$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix` -$prefix: $variable-prefix !default; - -// Gradient -// -// The gradient which is added to components if `$enable-gradients` is `true` -// This gradient is also added to elements with `.bg-gradient` -// scss-docs-start variable-gradient -$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default; -// scss-docs-end variable-gradient - -// Spacing -// -// Control the default styling of most Bootstrap elements by modifying these -// variables. Mostly focused on spacing. -// You can add more entries to the $spacers map, should you need more variation. - -// scss-docs-start spacer-variables-maps -$spacer: 1rem !default; -$spacers: ( - 0: 0, - 1: $spacer * .25, - 2: $spacer * .5, - 3: $spacer, - 4: $spacer * 1.5, - 5: $spacer * 3, -) !default; -// scss-docs-end spacer-variables-maps - -// Position -// -// Define the edge positioning anchors of the position utilities. - -// scss-docs-start position-map -$position-values: ( - 0: 0, - 50: 50%, - 100: 100% -) !default; -// scss-docs-end position-map - -// Body -// -// Settings for the `` element. - -$body-text-align: null !default; -$body-color: $gray-900 !default; -$body-bg: $white !default; - -$body-secondary-color: rgba($body-color, .75) !default; -$body-secondary-bg: $gray-200 !default; - -$body-tertiary-color: rgba($body-color, .5) !default; -$body-tertiary-bg: $gray-100 !default; - -$body-emphasis-color: $orange !default; - -// Links -// -// Style anchor elements. - -$link-color: $primary !default; -$link-decoration: underline !default; -$link-shade-percentage: 20% !default; -$link-hover-color: shift-color($link-color, $link-shade-percentage) !default; -$link-hover-decoration: null !default; - -$stretched-link-pseudo-element: after !default; -$stretched-link-z-index: 1 !default; - -// Icon links -// scss-docs-start icon-link-variables -$icon-link-gap: .375rem !default; -$icon-link-underline-offset: .25em !default; -$icon-link-icon-size: 1em !default; -$icon-link-icon-transition: .2s ease-in-out transform !default; -$icon-link-icon-transform: translate3d(.25em, 0, 0) !default; -// scss-docs-end icon-link-variables - -// Paragraphs -// -// Style p element. - -$paragraph-margin-bottom: 1rem !default; - - -// Grid breakpoints -// -// Define the minimum dimensions at which your layout will change, -// adapting to different screen sizes, for use in media queries. - -// scss-docs-start grid-breakpoints -$grid-breakpoints: ( - xs: 0, - sm: 576px, - md: 768px, - lg: 992px, - xl: 1200px, - xxl: 1400px -) !default; -// scss-docs-end grid-breakpoints - -@include _assert-ascending($grid-breakpoints, "$grid-breakpoints"); -@include _assert-starts-at-zero($grid-breakpoints, "$grid-breakpoints"); - - -// Grid containers -// -// Define the maximum width of `.container` for different screen sizes. - -// scss-docs-start container-max-widths -$container-max-widths: ( - sm: 540px, - md: 720px, - lg: 960px, - xl: 1140px, - xxl: 1320px -) !default; -// scss-docs-end container-max-widths - -@include _assert-ascending($container-max-widths, "$container-max-widths"); - - -// Grid columns -// -// Set the number of columns and specify the width of the gutters. - -$grid-columns: 12 !default; -$grid-gutter-width: 1.5rem !default; -$grid-row-columns: 6 !default; - -// Container padding - -$container-padding-x: $grid-gutter-width !default; - - -// Components -// -// Define common padding and border radius sizes and more. - -// scss-docs-start border-variables -$border-width: 1px !default; -$border-widths: ( - 1: 1px, - 2: 2px, - 3: 3px, - 4: 4px, - 5: 5px -) !default; - -$border-style: solid !default; -$border-color: $gray-300 !default; -$border-color-translucent: rgba($black, .175) !default; -// scss-docs-end border-variables - -// scss-docs-start border-radius-variables -$border-radius: .375rem !default; -$border-radius-sm: .25rem !default; -$border-radius-lg: .5rem !default; -$border-radius-xl: 1rem !default; -$border-radius-xxl: 2rem !default; -$border-radius-pill: 50rem !default; -// scss-docs-end border-radius-variables -// fusv-disable -$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0 -// fusv-enable - -// scss-docs-start box-shadow-variables -$box-shadow: 0 .5rem 1rem rgba($black, .15) !default; -$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default; -$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default; -$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default; -// scss-docs-end box-shadow-variables - -$component-active-color: $white !default; -$component-active-bg: $primary !default; - -// scss-docs-start focus-ring-variables -$focus-ring-width: .25rem !default; -$focus-ring-opacity: .25 !default; -$focus-ring-color: rgba($primary, $focus-ring-opacity) !default; -$focus-ring-blur: 0 !default; -$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default; -// scss-docs-end focus-ring-variables - -// scss-docs-start caret-variables -$caret-width: .3em !default; -$caret-vertical-align: $caret-width * .85 !default; -$caret-spacing: $caret-width * .85 !default; -// scss-docs-end caret-variables - -$transition-base: all .2s ease-in-out !default; -$transition-fade: opacity .15s linear !default; -// scss-docs-start collapse-transition -$transition-collapse: height .35s ease !default; -$transition-collapse-width: width .35s ease !default; -// scss-docs-end collapse-transition - -// stylelint-disable function-disallowed-list -// scss-docs-start aspect-ratios -$aspect-ratios: ( - "1x1": 100%, - "4x3": calc(3 / 4 * 100%), - "16x9": calc(9 / 16 * 100%), - "21x9": calc(9 / 21 * 100%) -) !default; -// scss-docs-end aspect-ratios -// stylelint-enable function-disallowed-list - -// Typography -// -// Font, line-height, and color for body text, headings, and more. - -// scss-docs-start font-variables -// stylelint-disable value-keyword-case -$font-family-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; -$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default; -// stylelint-enable value-keyword-case -$font-family-base: var(--#{$prefix}font-sans-serif) !default; -$font-family-code: var(--#{$prefix}font-monospace) !default; - -// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins -// $font-size-base affects the font size of the body text -$font-size-root: null !default; -$font-size-base: 1rem !default; // Assumes the browser default, typically `16px` -$font-size-sm: $font-size-base * .875 !default; -$font-size-lg: $font-size-base * 1.25 !default; - -$font-weight-lighter: lighter !default; -$font-weight-light: 300 !default; -$font-weight-normal: 400 !default; -$font-weight-medium: 500 !default; -$font-weight-semibold: 600 !default; -$font-weight-bold: 700 !default; -$font-weight-bolder: bolder !default; - -$font-weight-base: $font-weight-normal !default; - -$line-height-base: 1.5 !default; -$line-height-sm: 1.25 !default; -$line-height-lg: 2 !default; - -$h1-font-size: $font-size-base * 2.5 !default; -$h2-font-size: $font-size-base * 2 !default; -$h3-font-size: $font-size-base * 1.75 !default; -$h4-font-size: $font-size-base * 1.5 !default; -$h5-font-size: $font-size-base * 1.25 !default; -$h6-font-size: $font-size-base !default; -// scss-docs-end font-variables - -// scss-docs-start font-sizes -$font-sizes: ( - 1: $h1-font-size, - 2: $h2-font-size, - 3: $h3-font-size, - 4: $h4-font-size, - 5: $h5-font-size, - 6: $h6-font-size -) !default; -// scss-docs-end font-sizes - -// scss-docs-start headings-variables -$headings-margin-bottom: $spacer * .5 !default; -$headings-font-family: null !default; -$headings-font-style: null !default; -$headings-font-weight: 500 !default; -$headings-line-height: 1.2 !default; -$headings-color: inherit !default; -// scss-docs-end headings-variables - -// scss-docs-start display-headings -$display-font-sizes: ( - 1: 5rem, - 2: 4.5rem, - 3: 4rem, - 4: 3.5rem, - 5: 3rem, - 6: 2.5rem -) !default; - -$display-font-family: null !default; -$display-font-style: null !default; -$display-font-weight: 300 !default; -$display-line-height: $headings-line-height !default; -// scss-docs-end display-headings - -// scss-docs-start type-variables -$lead-font-size: $font-size-base * 1.25 !default; -$lead-font-weight: 300 !default; - -$small-font-size: .875em !default; - -$sub-sup-font-size: .75em !default; - -// fusv-disable -$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0 -// fusv-enable - -$initialism-font-size: $small-font-size !default; - -$blockquote-margin-y: $spacer !default; -$blockquote-font-size: $font-size-base * 1.25 !default; -$blockquote-footer-color: $gray-600 !default; -$blockquote-footer-font-size: $small-font-size !default; - -$hr-margin-y: $spacer !default; -$hr-color: inherit !default; - -// fusv-disable -$hr-bg-color: null !default; // Deprecated in v5.2.0 -$hr-height: null !default; // Deprecated in v5.2.0 -// fusv-enable - -$hr-border-color: null !default; // Allows for inherited colors -$hr-border-width: var(--#{$prefix}border-width) !default; -$hr-opacity: .25 !default; - -// scss-docs-start vr-variables -$vr-border-width: var(--#{$prefix}border-width) !default; -// scss-docs-end vr-variables - -$legend-margin-bottom: .5rem !default; -$legend-font-size: 1.5rem !default; -$legend-font-weight: null !default; - -$dt-font-weight: $font-weight-bold !default; - -$list-inline-padding: .5rem !default; - -$mark-padding: .1875em !default; -$mark-color: $body-color !default; -$mark-bg: $yellow-100 !default; -// scss-docs-end type-variables - - -// Tables -// -// Customizes the `.table` component with basic values, each used across all table variations. - -// scss-docs-start table-variables -$table-cell-padding-y: .5rem !default; -$table-cell-padding-x: .5rem !default; -$table-cell-padding-y-sm: .25rem !default; -$table-cell-padding-x-sm: .25rem !default; - -$table-cell-vertical-align: top !default; - -$table-color: var(--#{$prefix}emphasis-color) !default; -$table-bg: var(--#{$prefix}body-bg) !default; -$table-accent-bg: transparent !default; - -$table-th-font-weight: null !default; - -$table-striped-color: $table-color !default; -$table-striped-bg-factor: .05 !default; -$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default; - -$table-active-color: $table-color !default; -$table-active-bg-factor: .1 !default; -$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default; - -$table-hover-color: $table-color !default; -$table-hover-bg-factor: .075 !default; -$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default; - -$table-border-factor: .2 !default; -$table-border-width: var(--#{$prefix}border-width) !default; -$table-border-color: var(--#{$prefix}border-color) !default; - -$table-striped-order: odd !default; -$table-striped-columns-order: even !default; - -$table-group-separator-color: currentcolor !default; - -$table-caption-color: var(--#{$prefix}secondary-color) !default; - -$table-bg-scale: -80% !default; -// scss-docs-end table-variables - -// scss-docs-start table-loop -$table-variants: ( - "primary": shift-color($primary, $table-bg-scale), - "secondary": shift-color($secondary, $table-bg-scale), - "success": shift-color($success, $table-bg-scale), - "info": shift-color($info, $table-bg-scale), - "warning": shift-color($warning, $table-bg-scale), - "danger": shift-color($danger, $table-bg-scale), - "light": $light, - "dark": $dark, -) !default; -// scss-docs-end table-loop - - -// Buttons + Forms -// -// Shared variables that are reassigned to `$input-` and `$btn-` specific variables. - -// scss-docs-start input-btn-variables -$input-btn-padding-y: .375rem !default; -$input-btn-padding-x: .75rem !default; -$input-btn-font-family: null !default; -$input-btn-font-size: $font-size-base !default; -$input-btn-line-height: $line-height-base !default; - -$input-btn-focus-width: $focus-ring-width !default; -$input-btn-focus-color-opacity: $focus-ring-opacity !default; -$input-btn-focus-color: $focus-ring-color !default; -$input-btn-focus-blur: $focus-ring-blur !default; -$input-btn-focus-box-shadow: $focus-ring-box-shadow !default; - -$input-btn-padding-y-sm: .25rem !default; -$input-btn-padding-x-sm: .5rem !default; -$input-btn-font-size-sm: $font-size-sm !default; - -$input-btn-padding-y-lg: .5rem !default; -$input-btn-padding-x-lg: 1rem !default; -$input-btn-font-size-lg: $font-size-lg !default; - -$input-btn-border-width: var(--#{$prefix}border-width) !default; -// scss-docs-end input-btn-variables - - -// Buttons -// -// For each of Bootstrap's buttons, define text, background, and border color. - -// scss-docs-start btn-variables -$btn-color: var(--#{$prefix}body-color) !default; -$btn-padding-y: $input-btn-padding-y !default; -$btn-padding-x: $input-btn-padding-x !default; -$btn-font-family: $input-btn-font-family !default; -$btn-font-size: $input-btn-font-size !default; -$btn-line-height: $input-btn-line-height !default; -$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping - -$btn-padding-y-sm: $input-btn-padding-y-sm !default; -$btn-padding-x-sm: $input-btn-padding-x-sm !default; -$btn-font-size-sm: $input-btn-font-size-sm !default; - -$btn-padding-y-lg: $input-btn-padding-y-lg !default; -$btn-padding-x-lg: $input-btn-padding-x-lg !default; -$btn-font-size-lg: $input-btn-font-size-lg !default; - -$btn-border-width: $input-btn-border-width !default; - -$btn-font-weight: $font-weight-normal !default; -$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default; -$btn-focus-width: $input-btn-focus-width !default; -$btn-focus-box-shadow: $input-btn-focus-box-shadow !default; -$btn-disabled-opacity: .65 !default; -$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default; - -$btn-link-color: var(--#{$prefix}link-color) !default; -$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default; -$btn-link-disabled-color: $gray-600 !default; -$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default; - -// Allows for customizing button radius independently from global border radius -$btn-border-radius: var(--#{$prefix}border-radius) !default; -$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default; -$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default; - -$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; - -$btn-hover-bg-shade-amount: 15% !default; -$btn-hover-bg-tint-amount: 15% !default; -$btn-hover-border-shade-amount: 20% !default; -$btn-hover-border-tint-amount: 10% !default; -$btn-active-bg-shade-amount: 20% !default; -$btn-active-bg-tint-amount: 20% !default; -$btn-active-border-shade-amount: 25% !default; -$btn-active-border-tint-amount: 10% !default; -// scss-docs-end btn-variables - - -// Forms - -// scss-docs-start form-text-variables -$form-text-margin-top: .25rem !default; -$form-text-font-size: $small-font-size !default; -$form-text-font-style: null !default; -$form-text-font-weight: null !default; -$form-text-color: var(--#{$prefix}secondary-color) !default; -// scss-docs-end form-text-variables - -// scss-docs-start form-label-variables -$form-label-margin-bottom: .5rem !default; -$form-label-font-size: null !default; -$form-label-font-style: null !default; -$form-label-font-weight: null !default; -$form-label-color: null !default; -// scss-docs-end form-label-variables - -// scss-docs-start form-input-variables -$input-padding-y: $input-btn-padding-y !default; -$input-padding-x: $input-btn-padding-x !default; -$input-font-family: $input-btn-font-family !default; -$input-font-size: $input-btn-font-size !default; -$input-font-weight: $font-weight-base !default; -$input-line-height: $input-btn-line-height !default; - -$input-padding-y-sm: $input-btn-padding-y-sm !default; -$input-padding-x-sm: $input-btn-padding-x-sm !default; -$input-font-size-sm: $input-btn-font-size-sm !default; - -$input-padding-y-lg: $input-btn-padding-y-lg !default; -$input-padding-x-lg: $input-btn-padding-x-lg !default; -$input-font-size-lg: $input-btn-font-size-lg !default; - -$input-bg: var(--#{$prefix}body-bg) !default; -$input-disabled-color: null !default; -$input-disabled-bg: var(--#{$prefix}secondary-bg) !default; -$input-disabled-border-color: null !default; - -$input-color: var(--#{$prefix}body-color) !default; -$input-border-color: var(--#{$prefix}border-color) !default; -$input-border-width: $input-btn-border-width !default; -$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default; - -$input-border-radius: var(--#{$prefix}border-radius) !default; -$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default; -$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default; - -$input-focus-bg: $input-bg !default; -$input-focus-border-color: tint-color($component-active-bg, 50%) !default; -$input-focus-color: $input-color !default; -$input-focus-width: $input-btn-focus-width !default; -$input-focus-box-shadow: $input-btn-focus-box-shadow !default; - -$input-placeholder-color: var(--#{$prefix}secondary-color) !default; -$input-plaintext-color: var(--#{$prefix}body-color) !default; - -$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list - -$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default; -$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default; -$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default; - -$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default; -$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default; -$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default; - -$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; - -$form-color-width: 3rem !default; -// scss-docs-end form-input-variables - -// scss-docs-start form-check-variables -$form-check-input-width: 1em !default; -$form-check-min-height: $font-size-base * $line-height-base !default; -$form-check-padding-start: $form-check-input-width + .5em !default; -$form-check-margin-bottom: .125rem !default; -$form-check-label-color: null !default; -$form-check-label-cursor: null !default; -$form-check-transition: null !default; - -$form-check-input-active-filter: brightness(90%) !default; - -$form-check-input-bg: $input-bg !default; -$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default; -$form-check-input-border-radius: .25em !default; -$form-check-radio-border-radius: 50% !default; -$form-check-input-focus-border: $input-focus-border-color !default; -$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default; - -$form-check-input-checked-color: $component-active-color !default; -$form-check-input-checked-bg-color: $component-active-bg !default; -$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default; -$form-check-input-checked-bg-image: url("data:image/svg+xml,") !default; -$form-check-radio-checked-bg-image: url("data:image/svg+xml,") !default; - -$form-check-input-indeterminate-color: $component-active-color !default; -$form-check-input-indeterminate-bg-color: $component-active-bg !default; -$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default; -$form-check-input-indeterminate-bg-image: url("data:image/svg+xml,") !default; - -$form-check-input-disabled-opacity: .5 !default; -$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default; -$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default; - -$form-check-inline-margin-end: 1rem !default; -// scss-docs-end form-check-variables - -// scss-docs-start form-switch-variables -$form-switch-color: rgba($black, .25) !default; -$form-switch-width: 2em !default; -$form-switch-padding-start: $form-switch-width + .5em !default; -$form-switch-bg-image: url("data:image/svg+xml,") !default; -$form-switch-border-radius: $form-switch-width !default; -$form-switch-transition: background-position .15s ease-in-out !default; - -$form-switch-focus-color: $input-focus-border-color !default; -$form-switch-focus-bg-image: url("data:image/svg+xml,") !default; - -$form-switch-checked-color: $component-active-color !default; -$form-switch-checked-bg-image: url("data:image/svg+xml,") !default; -$form-switch-checked-bg-position: right center !default; -// scss-docs-end form-switch-variables - -// scss-docs-start input-group-variables -$input-group-addon-padding-y: $input-padding-y !default; -$input-group-addon-padding-x: $input-padding-x !default; -$input-group-addon-font-weight: $input-font-weight !default; -$input-group-addon-color: $input-color !default; -$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default; -$input-group-addon-border-color: $input-border-color !default; -// scss-docs-end input-group-variables - -// scss-docs-start form-select-variables -$form-select-padding-y: $input-padding-y !default; -$form-select-padding-x: $input-padding-x !default; -$form-select-font-family: $input-font-family !default; -$form-select-font-size: $input-font-size !default; -$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image -$form-select-font-weight: $input-font-weight !default; -$form-select-line-height: $input-line-height !default; -$form-select-color: $input-color !default; -$form-select-bg: $input-bg !default; -$form-select-disabled-color: null !default; -$form-select-disabled-bg: $input-disabled-bg !default; -$form-select-disabled-border-color: $input-disabled-border-color !default; -$form-select-bg-position: right $form-select-padding-x center !default; -$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions -$form-select-indicator-color: $gray-800 !default; -$form-select-indicator: url("data:image/svg+xml,") !default; - -$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default; -$form-select-feedback-icon-position: center right $form-select-indicator-padding !default; -$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default; - -$form-select-border-width: $input-border-width !default; -$form-select-border-color: $input-border-color !default; -$form-select-border-radius: $input-border-radius !default; -$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default; - -$form-select-focus-border-color: $input-focus-border-color !default; -$form-select-focus-width: $input-focus-width !default; -$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default; - -$form-select-padding-y-sm: $input-padding-y-sm !default; -$form-select-padding-x-sm: $input-padding-x-sm !default; -$form-select-font-size-sm: $input-font-size-sm !default; -$form-select-border-radius-sm: $input-border-radius-sm !default; - -$form-select-padding-y-lg: $input-padding-y-lg !default; -$form-select-padding-x-lg: $input-padding-x-lg !default; -$form-select-font-size-lg: $input-font-size-lg !default; -$form-select-border-radius-lg: $input-border-radius-lg !default; - -$form-select-transition: $input-transition !default; -// scss-docs-end form-select-variables - -// scss-docs-start form-range-variables -$form-range-track-width: 100% !default; -$form-range-track-height: .5rem !default; -$form-range-track-cursor: pointer !default; -$form-range-track-bg: var(--#{$prefix}secondary-bg) !default; -$form-range-track-border-radius: 1rem !default; -$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default; - -$form-range-thumb-width: 1rem !default; -$form-range-thumb-height: $form-range-thumb-width !default; -$form-range-thumb-bg: $component-active-bg !default; -$form-range-thumb-border: 0 !default; -$form-range-thumb-border-radius: 1rem !default; -$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default; -$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default; -$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge -$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default; -$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default; -$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; -// scss-docs-end form-range-variables - -// scss-docs-start form-file-variables -$form-file-button-color: $input-color !default; -$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default; -$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default; -// scss-docs-end form-file-variables - -// scss-docs-start form-floating-variables -$form-floating-height: add(3.5rem, $input-height-border) !default; -$form-floating-line-height: 1.25 !default; -$form-floating-padding-x: $input-padding-x !default; -$form-floating-padding-y: 1rem !default; -$form-floating-input-padding-t: 1.625rem !default; -$form-floating-input-padding-b: .625rem !default; -$form-floating-label-height: 1.5em !default; -$form-floating-label-opacity: .65 !default; -$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default; -$form-floating-label-disabled-color: $gray-600 !default; -$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default; -// scss-docs-end form-floating-variables - -// Form validation - -// scss-docs-start form-feedback-variables -$form-feedback-margin-top: $form-text-margin-top !default; -$form-feedback-font-size: $form-text-font-size !default; -$form-feedback-font-style: $form-text-font-style !default; -$form-feedback-valid-color: $success !default; -$form-feedback-invalid-color: $danger !default; - -$form-feedback-icon-valid-color: $form-feedback-valid-color !default; -$form-feedback-icon-valid: url("data:image/svg+xml,") !default; -$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default; -$form-feedback-icon-invalid: url("data:image/svg+xml,") !default; -// scss-docs-end form-feedback-variables - -// scss-docs-start form-validation-colors -$form-valid-color: $form-feedback-valid-color !default; -$form-valid-border-color: $form-feedback-valid-color !default; -$form-invalid-color: $form-feedback-invalid-color !default; -$form-invalid-border-color: $form-feedback-invalid-color !default; -// scss-docs-end form-validation-colors - -// scss-docs-start form-validation-states -$form-validation-states: ( - "valid": ( - "color": var(--#{$prefix}form-valid-color), - "icon": $form-feedback-icon-valid, - "tooltip-color": #fff, - "tooltip-bg-color": var(--#{$prefix}success), - "focus-box-shadow": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity), - "border-color": var(--#{$prefix}form-valid-border-color), - ), - "invalid": ( - "color": var(--#{$prefix}form-invalid-color), - "icon": $form-feedback-icon-invalid, - "tooltip-color": #fff, - "tooltip-bg-color": var(--#{$prefix}danger), - "focus-box-shadow": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity), - "border-color": var(--#{$prefix}form-invalid-border-color), - ) -) !default; -// scss-docs-end form-validation-states - -// Z-index master list -// -// Warning: Avoid customizing these values. They're used for a bird's eye view -// of components dependent on the z-axis and are designed to all work together. - -// scss-docs-start zindex-stack -$zindex-dropdown: 1000 !default; -$zindex-sticky: 1020 !default; -$zindex-fixed: 1030 !default; -$zindex-offcanvas-backdrop: 1040 !default; -$zindex-offcanvas: 1045 !default; -$zindex-modal-backdrop: 1050 !default; -$zindex-modal: 1055 !default; -$zindex-popover: 1070 !default; -$zindex-tooltip: 1080 !default; -$zindex-toast: 1090 !default; -// scss-docs-end zindex-stack - -// scss-docs-start zindex-levels-map -$zindex-levels: ( - n1: -1, - 0: 0, - 1: 1, - 2: 2, - 3: 3 -) !default; -// scss-docs-end zindex-levels-map - - -// Navs - -// scss-docs-start nav-variables -$nav-link-padding-y: .5rem !default; -$nav-link-padding-x: 1rem !default; -$nav-link-font-size: null !default; -$nav-link-font-weight: null !default; -$nav-link-color: var(--#{$prefix}link-color) !default; -$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default; -$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default; -$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default; -$nav-link-focus-box-shadow: $focus-ring-box-shadow !default; - -$nav-tabs-border-color: var(--#{$prefix}border-color) !default; -$nav-tabs-border-width: var(--#{$prefix}border-width) !default; -$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default; -$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default; -$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default; -$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default; -$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default; - -$nav-pills-border-radius: var(--#{$prefix}border-radius) !default; -$nav-pills-link-active-color: $component-active-color !default; -$nav-pills-link-active-bg: $component-active-bg !default; - -$nav-underline-gap: 1rem !default; -$nav-underline-border-width: .125rem !default; -$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default; -// scss-docs-end nav-variables - - -// Navbar - -// scss-docs-start navbar-variables -$navbar-padding-y: $spacer * .5 !default; -$navbar-padding-x: null !default; - -$navbar-nav-link-padding-x: .5rem !default; - -$navbar-brand-font-size: $font-size-lg !default; -// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link -$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default; -$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default; -$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default; -$navbar-brand-margin-end: 1rem !default; - -$navbar-toggler-padding-y: .25rem !default; -$navbar-toggler-padding-x: .75rem !default; -$navbar-toggler-font-size: $font-size-lg !default; -$navbar-toggler-border-radius: $btn-border-radius !default; -$navbar-toggler-focus-width: $btn-focus-width !default; -$navbar-toggler-transition: box-shadow .15s ease-in-out !default; - -$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default; -$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default; -$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default; -$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default; -$navbar-light-icon-color: rgba($body-color, .75) !default; -$navbar-light-toggler-icon-bg: url("data:image/svg+xml,") !default; -$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default; -$navbar-light-brand-color: $navbar-light-active-color !default; -$navbar-light-brand-hover-color: $navbar-light-active-color !default; -// scss-docs-end navbar-variables - -// scss-docs-start navbar-dark-variables -$navbar-dark-color: rgba($white, .55) !default; -$navbar-dark-hover-color: rgba($white, .75) !default; -$navbar-dark-active-color: $white !default; -$navbar-dark-disabled-color: rgba($white, .25) !default; -$navbar-dark-icon-color: $navbar-dark-color !default; -$navbar-dark-toggler-icon-bg: url("data:image/svg+xml,") !default; -$navbar-dark-toggler-border-color: rgba($white, .1) !default; -$navbar-dark-brand-color: $navbar-dark-active-color !default; -$navbar-dark-brand-hover-color: $navbar-dark-active-color !default; -// scss-docs-end navbar-dark-variables - - -// Dropdowns -// -// Dropdown menu container and contents. - -// scss-docs-start dropdown-variables -$dropdown-min-width: 10rem !default; -$dropdown-padding-x: 0 !default; -$dropdown-padding-y: .5rem !default; -$dropdown-spacer: .125rem !default; -$dropdown-font-size: $font-size-base !default; -$dropdown-color: var(--#{$prefix}body-color) !default; -$dropdown-bg: var(--#{$prefix}body-bg) !default; -$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default; -$dropdown-border-radius: var(--#{$prefix}border-radius) !default; -$dropdown-border-width: var(--#{$prefix}border-width) !default; -$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list -$dropdown-divider-bg: $dropdown-border-color !default; -$dropdown-divider-margin-y: $spacer * .5 !default; -$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default; - -$dropdown-link-color: var(--#{$prefix}body-color) !default; -$dropdown-link-hover-color: $dropdown-link-color !default; -$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default; - -$dropdown-link-active-color: $component-active-color !default; -$dropdown-link-active-bg: $component-active-bg !default; - -$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default; - -$dropdown-item-padding-y: $spacer * .25 !default; -$dropdown-item-padding-x: $spacer !default; - -$dropdown-header-color: $gray-600 !default; -$dropdown-header-padding-x: $dropdown-item-padding-x !default; -$dropdown-header-padding-y: $dropdown-padding-y !default; -// fusv-disable -$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0 -// fusv-enable -// scss-docs-end dropdown-variables - -// scss-docs-start dropdown-dark-variables -$dropdown-dark-color: $gray-300 !default; -$dropdown-dark-bg: $gray-800 !default; -$dropdown-dark-border-color: $dropdown-border-color !default; -$dropdown-dark-divider-bg: $dropdown-divider-bg !default; -$dropdown-dark-box-shadow: null !default; -$dropdown-dark-link-color: $dropdown-dark-color !default; -$dropdown-dark-link-hover-color: $white !default; -$dropdown-dark-link-hover-bg: rgba($white, .15) !default; -$dropdown-dark-link-active-color: $dropdown-link-active-color !default; -$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default; -$dropdown-dark-link-disabled-color: $gray-500 !default; -$dropdown-dark-header-color: $gray-500 !default; -// scss-docs-end dropdown-dark-variables - - -// Pagination - -// scss-docs-start pagination-variables -$pagination-padding-y: .375rem !default; -$pagination-padding-x: .75rem !default; -$pagination-padding-y-sm: .25rem !default; -$pagination-padding-x-sm: .5rem !default; -$pagination-padding-y-lg: .75rem !default; -$pagination-padding-x-lg: 1.5rem !default; - -$pagination-font-size: $font-size-base !default; - -$pagination-color: var(--#{$prefix}link-color) !default; -$pagination-bg: var(--#{$prefix}body-bg) !default; -$pagination-border-radius: var(--#{$prefix}border-radius) !default; -$pagination-border-width: var(--#{$prefix}border-width) !default; -$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list -$pagination-border-color: var(--#{$prefix}border-color) !default; - -$pagination-focus-color: var(--#{$prefix}link-hover-color) !default; -$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default; -$pagination-focus-box-shadow: $focus-ring-box-shadow !default; -$pagination-focus-outline: 0 !default; - -$pagination-hover-color: var(--#{$prefix}link-hover-color) !default; -$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default; -$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this? - -$pagination-active-color: $component-active-color !default; -$pagination-active-bg: $component-active-bg !default; -$pagination-active-border-color: $component-active-bg !default; - -$pagination-disabled-color: var(--#{$prefix}secondary-color) !default; -$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default; -$pagination-disabled-border-color: var(--#{$prefix}border-color) !default; - -$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; - -$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default; -$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default; -// scss-docs-end pagination-variables - - -// Placeholders - -// scss-docs-start placeholders -$placeholder-opacity-max: .5 !default; -$placeholder-opacity-min: .2 !default; -// scss-docs-end placeholders - -// Cards - -// scss-docs-start card-variables -$card-spacer-y: $spacer !default; -$card-spacer-x: $spacer !default; -$card-title-spacer-y: $spacer * .5 !default; -$card-title-color: null !default; -$card-subtitle-color: null !default; -$card-border-width: var(--#{$prefix}border-width) !default; -$card-border-color: var(--#{$prefix}border-color-translucent) !default; -$card-border-radius: var(--#{$prefix}border-radius) !default; -$card-box-shadow: null !default; -$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default; -$card-cap-padding-y: $card-spacer-y * .5 !default; -$card-cap-padding-x: $card-spacer-x !default; -$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default; -$card-cap-color: null !default; -$card-height: null !default; -$card-color: null !default; -$card-bg: var(--#{$prefix}body-bg) !default; -$card-img-overlay-padding: $spacer !default; -$card-group-margin: $grid-gutter-width * .5 !default; -// scss-docs-end card-variables - -// Accordion - -// scss-docs-start accordion-variables -$accordion-padding-y: 1rem !default; -$accordion-padding-x: 1.25rem !default; -$accordion-color: var(--#{$prefix}body-color) !default; -$accordion-bg: var(--#{$prefix}body-bg) !default; -$accordion-border-width: var(--#{$prefix}border-width) !default; -$accordion-border-color: var(--#{$prefix}border-color) !default; -$accordion-border-radius: var(--#{$prefix}border-radius) !default; -$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default; - -$accordion-body-padding-y: $accordion-padding-y !default; -$accordion-body-padding-x: $accordion-padding-x !default; - -$accordion-button-padding-y: $accordion-padding-y !default; -$accordion-button-padding-x: $accordion-padding-x !default; -$accordion-button-color: var(--#{$prefix}body-color) !default; -$accordion-button-bg: var(--#{$prefix}accordion-bg) !default; -$accordion-transition: $btn-transition, border-radius .15s ease !default; -$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default; -$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default; - -$accordion-button-focus-border-color: $input-focus-border-color !default; -$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default; - -$accordion-icon-width: 1.25rem !default; -$accordion-icon-color: $body-color !default; -$accordion-icon-active-color: $primary-text-emphasis !default; -$accordion-icon-transition: transform .2s ease-in-out !default; -$accordion-icon-transform: rotate(-180deg) !default; - -$accordion-button-icon: url("data:image/svg+xml,") !default; -$accordion-button-active-icon: url("data:image/svg+xml,") !default; -// scss-docs-end accordion-variables - -// Tooltips - -// scss-docs-start tooltip-variables -$tooltip-font-size: $font-size-sm !default; -$tooltip-max-width: 200px !default; -$tooltip-color: var(--#{$prefix}body-bg) !default; -$tooltip-bg: var(--#{$prefix}emphasis-color) !default; -$tooltip-border-radius: var(--#{$prefix}border-radius) !default; -$tooltip-opacity: .9 !default; -$tooltip-padding-y: $spacer * .25 !default; -$tooltip-padding-x: $spacer * .5 !default; -$tooltip-margin: null !default; // TODO: remove this in v6 - -$tooltip-arrow-width: .8rem !default; -$tooltip-arrow-height: .4rem !default; -// fusv-disable -$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables -// fusv-enable -// scss-docs-end tooltip-variables - -// Form tooltips must come after regular tooltips -// scss-docs-start tooltip-feedback-variables -$form-feedback-tooltip-padding-y: $tooltip-padding-y !default; -$form-feedback-tooltip-padding-x: $tooltip-padding-x !default; -$form-feedback-tooltip-font-size: $tooltip-font-size !default; -$form-feedback-tooltip-line-height: null !default; -$form-feedback-tooltip-opacity: $tooltip-opacity !default; -$form-feedback-tooltip-border-radius: $tooltip-border-radius !default; -// scss-docs-end tooltip-feedback-variables - - -// Popovers - -// scss-docs-start popover-variables -$popover-font-size: $font-size-sm !default; -$popover-bg: var(--#{$prefix}body-bg) !default; -$popover-max-width: 276px !default; -$popover-border-width: var(--#{$prefix}border-width) !default; -$popover-border-color: var(--#{$prefix}border-color-translucent) !default; -$popover-border-radius: var(--#{$prefix}border-radius-lg) !default; -$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list -$popover-box-shadow: var(--#{$prefix}box-shadow) !default; - -$popover-header-font-size: $font-size-base !default; -$popover-header-bg: var(--#{$prefix}secondary-bg) !default; -$popover-header-color: $headings-color !default; -$popover-header-padding-y: .5rem !default; -$popover-header-padding-x: $spacer !default; - -$popover-body-color: var(--#{$prefix}body-color) !default; -$popover-body-padding-y: $spacer !default; -$popover-body-padding-x: $spacer !default; - -$popover-arrow-width: 1rem !default; -$popover-arrow-height: .5rem !default; -// scss-docs-end popover-variables - -// fusv-disable -// Deprecated in Bootstrap 5.2.0 for CSS variables -$popover-arrow-color: $popover-bg !default; -$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default; -// fusv-enable - - -// Toasts - -// scss-docs-start toast-variables -$toast-max-width: 350px !default; -$toast-padding-x: .75rem !default; -$toast-padding-y: .5rem !default; -$toast-font-size: .875rem !default; -$toast-color: null !default; -$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default; -$toast-border-width: var(--#{$prefix}border-width) !default; -$toast-border-color: var(--#{$prefix}border-color-translucent) !default; -$toast-border-radius: var(--#{$prefix}border-radius) !default; -$toast-box-shadow: var(--#{$prefix}box-shadow) !default; -$toast-spacing: $container-padding-x !default; - -$toast-header-color: var(--#{$prefix}secondary-color) !default; -$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default; -$toast-header-border-color: $toast-border-color !default; -// scss-docs-end toast-variables - - -// Badges - -// scss-docs-start badge-variables -$badge-font-size: .75em !default; -$badge-font-weight: $font-weight-bold !default; -$badge-color: $white !default; -$badge-padding-y: .35em !default; -$badge-padding-x: .65em !default; -$badge-border-radius: var(--#{$prefix}border-radius) !default; -// scss-docs-end badge-variables - - -// Modals - -// scss-docs-start modal-variables -$modal-inner-padding: $spacer !default; - -$modal-footer-margin-between: .5rem !default; - -$modal-dialog-margin: .5rem !default; -$modal-dialog-margin-y-sm-up: 1.75rem !default; - -$modal-title-line-height: $line-height-base !default; - -$modal-content-color: null !default; -$modal-content-bg: var(--#{$prefix}body-bg) !default; -$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default; -$modal-content-border-width: var(--#{$prefix}border-width) !default; -$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default; -$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default; -$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default; -$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default; - -$modal-backdrop-bg: $black !default; -$modal-backdrop-opacity: .5 !default; - -$modal-header-border-color: var(--#{$prefix}border-color) !default; -$modal-header-border-width: $modal-content-border-width !default; -$modal-header-padding-y: $modal-inner-padding !default; -$modal-header-padding-x: $modal-inner-padding !default; -$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility - -$modal-footer-bg: null !default; -$modal-footer-border-color: $modal-header-border-color !default; -$modal-footer-border-width: $modal-header-border-width !default; - -$modal-sm: 300px !default; -$modal-md: 500px !default; -$modal-lg: 800px !default; -$modal-xl: 1140px !default; - -$modal-fade-transform: translate(0, -50px) !default; -$modal-show-transform: none !default; -$modal-transition: transform .3s ease-out !default; -$modal-scale-transform: scale(1.02) !default; -// scss-docs-end modal-variables - - -// Alerts -// -// Define alert colors, border radius, and padding. - -// scss-docs-start alert-variables -$alert-padding-y: $spacer !default; -$alert-padding-x: $spacer !default; -$alert-margin-bottom: 1rem !default; -$alert-border-radius: var(--#{$prefix}border-radius) !default; -$alert-link-font-weight: $font-weight-bold !default; -$alert-border-width: var(--#{$prefix}border-width) !default; -$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side -// scss-docs-end alert-variables - -// fusv-disable -$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6 -$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6 -$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6 -// fusv-enable - -// Progress bars - -// scss-docs-start progress-variables -$progress-height: 1rem !default; -$progress-font-size: $font-size-base * .75 !default; -$progress-bg: var(--#{$prefix}secondary-bg) !default; -$progress-border-radius: var(--#{$prefix}border-radius) !default; -$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default; -$progress-bar-color: $white !default; -$progress-bar-bg: $primary !default; -$progress-bar-animation-timing: 1s linear infinite !default; -$progress-bar-transition: width .6s ease !default; -// scss-docs-end progress-variables - - -// List group - -// scss-docs-start list-group-variables -$list-group-color: var(--#{$prefix}body-color) !default; -$list-group-bg: var(--#{$prefix}body-bg) !default; -$list-group-border-color: var(--#{$prefix}border-color) !default; -$list-group-border-width: var(--#{$prefix}border-width) !default; -$list-group-border-radius: var(--#{$prefix}border-radius) !default; - -$list-group-item-padding-y: $spacer * .5 !default; -$list-group-item-padding-x: $spacer !default; -// fusv-disable -$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0 -$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0 -// fusv-enable - -$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default; -$list-group-active-color: $component-active-color !default; -$list-group-active-bg: $component-active-bg !default; -$list-group-active-border-color: $list-group-active-bg !default; - -$list-group-disabled-color: var(--#{$prefix}secondary-color) !default; -$list-group-disabled-bg: $list-group-bg !default; - -$list-group-action-color: var(--#{$prefix}secondary-color) !default; -$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default; - -$list-group-action-active-color: var(--#{$prefix}body-color) !default; -$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default; -// scss-docs-end list-group-variables - - -// Image thumbnails - -// scss-docs-start thumbnail-variables -$thumbnail-padding: .25rem !default; -$thumbnail-bg: var(--#{$prefix}body-bg) !default; -$thumbnail-border-width: var(--#{$prefix}border-width) !default; -$thumbnail-border-color: var(--#{$prefix}border-color) !default; -$thumbnail-border-radius: var(--#{$prefix}border-radius) !default; -$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default; -// scss-docs-end thumbnail-variables - - -// Figures - -// scss-docs-start figure-variables -$figure-caption-font-size: $small-font-size !default; -$figure-caption-color: var(--#{$prefix}secondary-color) !default; -// scss-docs-end figure-variables - - -// Breadcrumbs - -// scss-docs-start breadcrumb-variables -$breadcrumb-font-size: null !default; -$breadcrumb-padding-y: 0 !default; -$breadcrumb-padding-x: 0 !default; -$breadcrumb-item-padding-x: .5rem !default; -$breadcrumb-margin-bottom: 1rem !default; -$breadcrumb-bg: null !default; -$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default; -$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default; -$breadcrumb-divider: quote("/") !default; -$breadcrumb-divider-flipped: $breadcrumb-divider !default; -$breadcrumb-border-radius: null !default; -// scss-docs-end breadcrumb-variables - -// Carousel - -// scss-docs-start carousel-variables -$carousel-control-color: $white !default; -$carousel-control-width: 15% !default; -$carousel-control-opacity: .5 !default; -$carousel-control-hover-opacity: .9 !default; -$carousel-control-transition: opacity .15s ease !default; - -$carousel-indicator-width: 30px !default; -$carousel-indicator-height: 3px !default; -$carousel-indicator-hit-area-height: 10px !default; -$carousel-indicator-spacer: 3px !default; -$carousel-indicator-opacity: .5 !default; -$carousel-indicator-active-bg: $white !default; -$carousel-indicator-active-opacity: 1 !default; -$carousel-indicator-transition: opacity .6s ease !default; - -$carousel-caption-width: 70% !default; -$carousel-caption-color: $white !default; -$carousel-caption-padding-y: 1.25rem !default; -$carousel-caption-spacer: 1.25rem !default; - -$carousel-control-icon-width: 2rem !default; - -$carousel-control-prev-icon-bg: url("data:image/svg+xml,") !default; -$carousel-control-next-icon-bg: url("data:image/svg+xml,") !default; - -$carousel-transition-duration: .6s !default; -$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`) -// scss-docs-end carousel-variables - -// scss-docs-start carousel-dark-variables -$carousel-dark-indicator-active-bg: $black !default; -$carousel-dark-caption-color: $black !default; -$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default; -// scss-docs-end carousel-dark-variables - - -// Spinners - -// scss-docs-start spinner-variables -$spinner-width: 2rem !default; -$spinner-height: $spinner-width !default; -$spinner-vertical-align: -.125em !default; -$spinner-border-width: .25em !default; -$spinner-animation-speed: .75s !default; - -$spinner-width-sm: 1rem !default; -$spinner-height-sm: $spinner-width-sm !default; -$spinner-border-width-sm: .2em !default; -// scss-docs-end spinner-variables - - -// Close - -// scss-docs-start close-variables -$btn-close-width: 1em !default; -$btn-close-height: $btn-close-width !default; -$btn-close-padding-x: .25em !default; -$btn-close-padding-y: $btn-close-padding-x !default; -$btn-close-color: $black !default; -$btn-close-bg: url("data:image/svg+xml,") !default; -$btn-close-focus-shadow: $focus-ring-box-shadow !default; -$btn-close-opacity: .5 !default; -$btn-close-hover-opacity: .75 !default; -$btn-close-focus-opacity: 1 !default; -$btn-close-disabled-opacity: .25 !default; -$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default; -// scss-docs-end close-variables - - -// Offcanvas - -// scss-docs-start offcanvas-variables -$offcanvas-padding-y: $modal-inner-padding !default; -$offcanvas-padding-x: $modal-inner-padding !default; -$offcanvas-horizontal-width: 400px !default; -$offcanvas-vertical-height: 30vh !default; -$offcanvas-transition-duration: .3s !default; -$offcanvas-border-color: $modal-content-border-color !default; -$offcanvas-border-width: $modal-content-border-width !default; -$offcanvas-title-line-height: $modal-title-line-height !default; -$offcanvas-bg-color: var(--#{$prefix}body-bg) !default; -$offcanvas-color: var(--#{$prefix}body-color) !default; -$offcanvas-box-shadow: $modal-content-box-shadow-xs !default; -$offcanvas-backdrop-bg: $modal-backdrop-bg !default; -$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default; -// scss-docs-end offcanvas-variables - -// Code - -$code-font-size: $small-font-size !default; -$code-color: $pink !default; - -$kbd-padding-y: .1875rem !default; -$kbd-padding-x: .375rem !default; -$kbd-font-size: $code-font-size !default; -$kbd-color: var(--#{$prefix}body-bg) !default; -$kbd-bg: var(--#{$prefix}body-color) !default; -$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6 - -$pre-color: null !default; diff --git a/src/scss/bootstrap.scss b/src/scss/bootstrap.scss index 120b71b..a278831 100644 --- a/src/scss/bootstrap.scss +++ b/src/scss/bootstrap.scss @@ -1,11 +1,7 @@ // scss-docs-start import-stack + // Configuration -@import '../../node_modules/bootstrap/scss/functions'; -@import './variables'; -@import './variables-dark'; -@import '../../node_modules/bootstrap/scss/maps'; -@import '../../node_modules/bootstrap/scss/mixins'; -@import '../../node_modules/bootstrap/scss/utilities'; +@import 'globals'; // Layout & components @import '../../node_modules/bootstrap/scss/root'; @@ -15,37 +11,36 @@ @import '../../node_modules/bootstrap/scss/containers'; @import '../../node_modules/bootstrap/scss/grid'; -// @import '../../node_modules/bootstrap/scss/tables'; -// @import '../../node_modules/bootstrap/scss/forms'; +@import '../../node_modules/bootstrap/scss/tables'; +@import '../../node_modules/bootstrap/scss/forms'; @import '../../node_modules/bootstrap/scss/buttons'; @import '../../node_modules/bootstrap/scss/transitions'; -// @import '../../node_modules/bootstrap/scss/dropdown'; -// @import '../../node_modules/bootstrap/scss/button-group'; +@import '../../node_modules/bootstrap/scss/dropdown'; +@import '../../node_modules/bootstrap/scss/button-group'; @import '../../node_modules/bootstrap/scss/nav'; @import '../../node_modules/bootstrap/scss/navbar'; -// @import '../../node_modules/bootstrap/scss/card'; -// @import '../../node_modules/bootstrap/scss/accordion'; -// @import '../../node_modules/bootstrap/scss/breadcrumb'; -// @import '../../node_modules/bootstrap/scss/pagination'; -// @import '../../node_modules/bootstrap/scss/badge'; -// @import '../../node_modules/bootstrap/scss/alert'; -// @import '../../node_modules/bootstrap/scss/progress'; -// @import '../../node_modules/bootstrap/scss/list-group'; -// @import '../../node_modules/bootstrap/scss/close'; -// @import '../../node_modules/bootstrap/scss/toasts'; -// @import '../../node_modules/bootstrap/scss/modal'; -// @import '../../node_modules/bootstrap/scss/tooltip'; -// @import '../../node_modules/bootstrap/scss/popover'; -// @import '../../node_modules/bootstrap/scss/carousel'; -// @import '../../node_modules/bootstrap/scss/spinners'; -// @import '../../node_modules/bootstrap/scss/offcanvas'; -// @import "../../node_modules/bootstrap/scss/placeholders"; +@import '../../node_modules/bootstrap/scss/card'; +@import '../../node_modules/bootstrap/scss/accordion'; +@import '../../node_modules/bootstrap/scss/breadcrumb'; +@import '../../node_modules/bootstrap/scss/pagination'; +@import '../../node_modules/bootstrap/scss/badge'; +@import '../../node_modules/bootstrap/scss/alert'; +@import '../../node_modules/bootstrap/scss/progress'; +@import '../../node_modules/bootstrap/scss/list-group'; +@import '../../node_modules/bootstrap/scss/close'; +@import '../../node_modules/bootstrap/scss/toasts'; +@import '../../node_modules/bootstrap/scss/modal'; +@import '../../node_modules/bootstrap/scss/tooltip'; +@import '../../node_modules/bootstrap/scss/popover'; +@import '../../node_modules/bootstrap/scss/carousel'; +@import '../../node_modules/bootstrap/scss/spinners'; +@import '../../node_modules/bootstrap/scss/offcanvas'; +@import '../../node_modules/bootstrap/scss/placeholders'; + // Helpers @import '../../node_modules/bootstrap/scss/helpers'; // Utilities @import '../../node_modules/bootstrap/scss/utilities/api'; -@import '../../node_modules/bootstrap/scss/mixins/banner'; -@include bsBanner(''); diff --git a/src/scss/components.scss b/src/scss/components.scss new file mode 100644 index 0000000..4f661c8 --- /dev/null +++ b/src/scss/components.scss @@ -0,0 +1,4 @@ +// Systematic component library with shared global context +@import 'globals'; + +// Add project-specific component imports below diff --git a/src/scss/custom.scss b/src/scss/custom.scss index 72c30a1..eda5cfa 100644 --- a/src/scss/custom.scss +++ b/src/scss/custom.scss @@ -1,80 +1,55 @@ -@use 'sass:map'; -@import '../../node_modules/bootstrap/scss/functions'; -@import '../../node_modules/bootstrap/scss/mixins'; -@import './variables'; -@import './temp/assets/css/fonts'; - -// Importy komponent -// -------------- - -// PΕ™etΓ­ΕΎenΓ­ Bootatrapu -// -------------- - -// Set minimum reasonable width on very small devices - -body { - min-width: 320px; +/* + Global project token registry. + Keep all Bootstrap custom property overrides here so developers edit one place. +*/ + +:root { + /* Brand */ + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + + /* Surface and text */ + --bs-body-bg: #fff; + --bs-body-color: #212529; + --bs-tertiary-bg: #f8f9fa; + --bs-border-color: #dee2e6; + --bs-link-color: #0d6efd; + --bs-link-hover-color: #0a58ca; + + /* Typography */ + --bs-body-font-size: 1rem; + --bs-body-line-height: 1.5; + --bs-body-font-weight: 400; + + /* Spacing scale (Bootstrap-compatible) */ + --bs-spacer-0: 0; + --bs-spacer-1: 0.25rem; + --bs-spacer-2: 0.5rem; + --bs-spacer-3: 1rem; + --bs-spacer-4: 1.5rem; + --bs-spacer-5: 3rem; + + /* Radius and shadows */ + --bs-border-radius: 0.5rem; + --bs-border-radius-sm: 0.375rem; + --bs-border-radius-lg: 0.75rem; + --bs-box-shadow-sm: 0 0.125rem 0.25rem rgb(0 0 0 / 7.5%); + --bs-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 15%); } -// Remove viod in the bottom of the alert component -.alert { - p:last-child, - ol:last-child, - ul:last-child { - margin-bottom: 0; - } +[data-bs-theme='dark'] { + --bs-body-bg: #0f172a; + --bs-body-color: #e2e8f0; + --bs-tertiary-bg: #1e293b; + --bs-border-color: #334155; + --bs-link-color: #7dd3fc; + --bs-link-hover-color: #bae6fd; } -// Reset for SVG images in ` div { + position: relative; + z-index: 1; + } + } + + .row { + &::after { + right: math.div(-$grid-gutter-width, 2); + left: math.div(-$grid-gutter-width, 2); + + @each $breakpoint in map.keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + background: repeating-linear-gradient( + to right, + transparent, + transparent $grid-gutter-width, + $gutter-color $grid-gutter-width, + $gutter-color #{map.get($row-col-widths, $breakpoint)} + ); + } + } + } + } + + .form-row { + &::after { + right: -5px; + left: -5px; + + @each $breakpoint in map.keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + background: repeating-linear-gradient( + to right, + transparent, + transparent $form-grid-gutter-width, + $gutter-color $form-grid-gutter-width, + $gutter-color #{map.get($form-row-col-widths, $breakpoint)} + ); + } + } + } + } + } + + @if $devstack-grid-mode == 'info' or $devstack-grid-mode == 'full' { + body::before { + position: fixed; + right: 0; + bottom: 0; + z-index: 1002003004005; + padding: $input-btn-padding-y-sm $input-btn-padding-x-sm; + font-weight: $font-weight-semibold; + font-size: 12px; + line-height: 1; + font-family: monospace; + white-space: pre; + color: $snippet-color; + background: $snippet-bg; + + @each $breakpoint in map.keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + content: '#{to-upper-case(#{$breakpoint})} #{map.get($grid-breakpoints, $breakpoint)} \Amaska: ' + attr(data-template); + } + } + } + } +} diff --git a/src/scss/u-show-grid.scss b/src/scss/u-show-grid.scss deleted file mode 100644 index 1c3b262..0000000 --- a/src/scss/u-show-grid.scss +++ /dev/null @@ -1,109 +0,0 @@ -@use 'sass:map'; - -@import '../../node_modules/bootstrap/scss/functions'; -@import '../../node_modules/bootstrap/scss/mixins'; -@import './variables'; - -$row-col-widths: () !default; -$form-row-col-widths: () !default; -$gutter-color:rgb(255 0 255 / 30%); -$snippet-color: #fff; -$snippet-bg: rgb(255 0 255 / 90%); - -// stylelint-disable-next-line scss/dollar-variable-default -$row-col-widths: map.merge( - ( - xs: 7.9%, - sm: 7.9%, - md: 8%, - lg: 8.08%, - xl: 8.12% - ), - $row-col-widths -); - -// stylelint-disable-next-line scss/dollar-variable-default -$form-row-col-widths: map.merge( - ( - xs: 8.18%, - sm: 8.18%, - md: 8.22%, - lg: 8.245%, - xl: 8.26% - ), - $form-row-col-widths -); - -@media screen { - @if $show-grid == true or $show-grid != info { - .row, - .form-row { - position: relative; - - &::after { - content: ''; - position: absolute; - top: 0; - bottom: 0; - z-index: 1001; - display: block; - height: 1rem; - } - - & > div { - position: relative; - z-index: 1; - } - } - - .row { - &::after { - right: -$grid-gutter-width / 2; - left: -$grid-gutter-width / 2; - - @each $breakpoint in map.keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - background: repeating-linear-gradient(to right, transparent, transparent $grid-gutter-width, $gutter-color $grid-gutter-width, $gutter-color #{map.get($row-col-widths, $breakpoint)}); - } - } - } - } - - .form-row { - &::after { - right: -5px; - left: -5px; - - @each $breakpoint in map.keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - background: repeating-linear-gradient(to right, transparent, transparent $form-grid-gutter-width, $gutter-color $form-grid-gutter-width, $gutter-color #{map.get($form-row-col-widths, $breakpoint)}); - } - } - } - } - } - - @if $show-grid != false { - body::before { - position: fixed; - right: 0; - bottom: 0; - z-index: 1002003004005; - padding: $input-btn-padding-y-sm $input-btn-padding-x-sm; - font-weight: bold; - font-size: 12px; - line-height: 1; - font-family: monospace; - white-space: pre; - color: $snippet-color; - background: $snippet-bg; - - @each $breakpoint in map.keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - // stylelint-disable-next-line - content: '#{to-upper-case(#{$breakpoint})} #{map.get($grid-breakpoints, $breakpoint)} \Amaska: ' attr(data-template); - } - } - } - } -} diff --git a/src/scss/utils.scss b/src/scss/utils.scss new file mode 100644 index 0000000..f0a97bb --- /dev/null +++ b/src/scss/utils.scss @@ -0,0 +1,4 @@ +@use 'sass:map'; +@import 'globals'; + +// Custom utility class definitions. diff --git a/src/scss/_variables-dark.scss b/src/scss/variables-dark.scss similarity index 87% rename from src/scss/_variables-dark.scss rename to src/scss/variables-dark.scss index 7b81a24..1fbdc2e 100644 --- a/src/scss/_variables-dark.scss +++ b/src/scss/variables-dark.scss @@ -1,3 +1,5 @@ +@use 'sass:color'; + // Dark color mode variables // // Custom variables for the `[data-bs-theme="dark"]` theme. Use this as a starting point for your own custom color modes by creating a new theme-specific file like `_variables-dark.scss` and adding the variables you need. @@ -16,6 +18,7 @@ $warning-text-emphasis-dark: tint-color($warning, 40%) !default; $danger-text-emphasis-dark: tint-color($danger, 40%) !default; $light-text-emphasis-dark: $gray-100 !default; $dark-text-emphasis-dark: $gray-300 !default; + // scss-docs-end theme-text-dark-variables // scss-docs-start theme-bg-subtle-dark-variables @@ -26,7 +29,8 @@ $info-bg-subtle-dark: shade-color($info, 80%) !default; $warning-bg-subtle-dark: shade-color($warning, 80%) !default; $danger-bg-subtle-dark: shade-color($danger, 80%) !default; $light-bg-subtle-dark: $gray-800 !default; -$dark-bg-subtle-dark: mix($gray-800, $black) !default; +$dark-bg-subtle-dark: color.mix($gray-800, $black) !default; + // scss-docs-end theme-bg-subtle-dark-variables // scss-docs-start theme-border-subtle-dark-variables @@ -38,6 +42,7 @@ $warning-border-subtle-dark: shade-color($warning, 40%) !default; $danger-border-subtle-dark: shade-color($danger, 40%) !default; $light-border-subtle-dark: $gray-700 !default; $dark-border-subtle-dark: $gray-800 !default; + // scss-docs-end theme-border-subtle-dark-variables $body-color-dark: $gray-300 !default; @@ -45,7 +50,7 @@ $body-bg-dark: $gray-900 !default; $body-secondary-color-dark: rgba($body-color-dark, 0.75) !default; $body-secondary-bg-dark: $gray-800 !default; $body-tertiary-color-dark: rgba($body-color-dark, 0.5) !default; -$body-tertiary-bg-dark: mix($gray-800, $gray-900, 50%) !default; +$body-tertiary-bg-dark: color.mix($gray-800, $gray-900, 50%) !default; $body-emphasis-color-dark: $white !default; $border-color-dark: $gray-700 !default; $border-color-translucent-dark: rgba($white, 0.15) !default; @@ -74,6 +79,7 @@ $form-valid-color-dark: $green-300 !default; $form-valid-border-color-dark: $green-300 !default; $form-invalid-color-dark: $red-300 !default; $form-invalid-border-color-dark: $red-300 !default; + // scss-docs-end form-validation-colors-dark // @@ -83,6 +89,21 @@ $form-invalid-border-color-dark: $red-300 !default; $accordion-icon-color-dark: $primary-text-emphasis-dark !default; $accordion-icon-active-color-dark: $primary-text-emphasis-dark !default; -$accordion-button-icon-dark: url("data:image/svg+xml,") !default; -$accordion-button-active-icon-dark: url("data:image/svg+xml,") !default; +$accordion-button-icon-dark: url("data:image/svg+xml,") !default; +$accordion-button-active-icon-dark: url("data:image/svg+xml,") !default; + // scss-docs-end sass-dark-mode-vars + +// +// Carousel +// + +$carousel-indicator-active-bg-dark: $carousel-dark-indicator-active-bg !default; +$carousel-caption-color-dark: $carousel-dark-caption-color !default; +$carousel-control-icon-filter-dark: $carousel-dark-control-icon-filter !default; + +// +// Close button +// + +$btn-close-filter-dark: $btn-close-white-filter !default; diff --git a/src/scss/variables.scss b/src/scss/variables.scss new file mode 100644 index 0000000..5716971 --- /dev/null +++ b/src/scss/variables.scss @@ -0,0 +1,1920 @@ +@use 'sass:color'; + +$devstack-debugger-mode: 'none' !default; // 'none', 'active' +$devstack-grid-mode: 'info' !default; // 'none', 'info', 'full' + +// Variables +// +// Variables should follow the `$component-state-property-size` formula for +// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs. + +// Color system + +// scss-docs-start gray-color-variables +$white: #fff !default; +$gray-100: #f8f9fa !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #5e666d !default; // Darkened from #6c757d for contrast +$gray-700: #495057 !default; +$gray-800: #343a40 !default; +$gray-900: #212529 !default; +$black: #000 !default; + +// scss-docs-end gray-color-variables + +// fusv-disable +// scss-docs-start gray-colors-map +$grays: ( + '100': $gray-100, + '200': $gray-200, + '300': $gray-300, + '400': $gray-400, + '500': $gray-500, + '600': $gray-600, + '700': $gray-700, + '800': $gray-800, + '900': $gray-900, +) !default; + +// scss-docs-end gray-colors-map +// fusv-enable + +// scss-docs-start color-variables +$blue: #0a58ca !default; // Darkened from #0d6efd for contrast +$indigo: #6610f2 !default; +$purple: #6f42c1 !default; +$pink: #d63384 !default; +$red: #dc3545 !default; +$orange: #fd7e14 !default; +$yellow: #ffc107 !default; +$green: #198754 !default; +$teal: #20c997 !default; +$cyan: #0dcaf0 !default; + +// scss-docs-end color-variables + +// scss-docs-start colors-map +$colors: ( + 'blue': $blue, + 'indigo': $indigo, + 'purple': $purple, + 'pink': $pink, + 'red': $red, + 'orange': $orange, + 'yellow': $yellow, + 'green': $green, + 'teal': $teal, + 'cyan': $cyan, + 'black': $black, + 'white': $white, + 'gray': $gray-600, + 'gray-dark': $gray-800, +) !default; + +// scss-docs-end colors-map + +// The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.2 are 3, 4.5 and 7. +// See https://www.w3.org/TR/WCAG/#contrast-minimum +$min-contrast-ratio: 4.5 !default; + +// Customize the light and dark text colors for use in our color contrast function. +$color-contrast-dark: $black !default; +$color-contrast-light: $white !default; + +// fusv-disable +$blue-100: tint-color($blue, 80%) !default; +$blue-200: tint-color($blue, 60%) !default; +$blue-300: tint-color($blue, 40%) !default; +$blue-400: tint-color($blue, 20%) !default; +$blue-500: $blue !default; +$blue-600: shade-color($blue, 20%) !default; +$blue-700: shade-color($blue, 40%) !default; +$blue-800: shade-color($blue, 60%) !default; +$blue-900: shade-color($blue, 80%) !default; + +$indigo-100: tint-color($indigo, 80%) !default; +$indigo-200: tint-color($indigo, 60%) !default; +$indigo-300: tint-color($indigo, 40%) !default; +$indigo-400: tint-color($indigo, 20%) !default; +$indigo-500: $indigo !default; +$indigo-600: shade-color($indigo, 20%) !default; +$indigo-700: shade-color($indigo, 40%) !default; +$indigo-800: shade-color($indigo, 60%) !default; +$indigo-900: shade-color($indigo, 80%) !default; + +$purple-100: tint-color($purple, 80%) !default; +$purple-200: tint-color($purple, 60%) !default; +$purple-300: tint-color($purple, 40%) !default; +$purple-400: tint-color($purple, 20%) !default; +$purple-500: $purple !default; +$purple-600: shade-color($purple, 20%) !default; +$purple-700: shade-color($purple, 40%) !default; +$purple-800: shade-color($purple, 60%) !default; +$purple-900: shade-color($purple, 80%) !default; + +$pink-100: tint-color($pink, 80%) !default; +$pink-200: tint-color($pink, 60%) !default; +$pink-300: tint-color($pink, 40%) !default; +$pink-400: tint-color($pink, 20%) !default; +$pink-500: $pink !default; +$pink-600: shade-color($pink, 20%) !default; +$pink-700: shade-color($pink, 40%) !default; +$pink-800: shade-color($pink, 60%) !default; +$pink-900: shade-color($pink, 80%) !default; + +$red-100: tint-color($red, 80%) !default; +$red-200: tint-color($red, 60%) !default; +$red-300: tint-color($red, 40%) !default; +$red-400: tint-color($red, 20%) !default; +$red-500: $red !default; +$red-600: shade-color($red, 20%) !default; +$red-700: shade-color($red, 40%) !default; +$red-800: shade-color($red, 60%) !default; +$red-900: shade-color($red, 80%) !default; + +$orange-100: tint-color($orange, 80%) !default; +$orange-200: tint-color($orange, 60%) !default; +$orange-300: tint-color($orange, 40%) !default; +$orange-400: tint-color($orange, 20%) !default; +$orange-500: $orange !default; +$orange-600: shade-color($orange, 20%) !default; +$orange-700: shade-color($orange, 40%) !default; +$orange-800: shade-color($orange, 60%) !default; +$orange-900: shade-color($orange, 80%) !default; + +$yellow-100: tint-color($yellow, 80%) !default; +$yellow-200: tint-color($yellow, 60%) !default; +$yellow-300: tint-color($yellow, 40%) !default; +$yellow-400: tint-color($yellow, 20%) !default; +$yellow-500: $yellow !default; +$yellow-600: shade-color($yellow, 20%) !default; +$yellow-700: shade-color($yellow, 40%) !default; +$yellow-800: shade-color($yellow, 60%) !default; +$yellow-900: shade-color($yellow, 80%) !default; + +$green-100: tint-color($green, 80%) !default; +$green-200: tint-color($green, 60%) !default; +$green-300: tint-color($green, 40%) !default; +$green-400: tint-color($green, 20%) !default; +$green-500: $green !default; +$green-600: shade-color($green, 20%) !default; +$green-700: shade-color($green, 40%) !default; +$green-800: shade-color($green, 60%) !default; +$green-900: shade-color($green, 80%) !default; + +$teal-100: tint-color($teal, 80%) !default; +$teal-200: tint-color($teal, 60%) !default; +$teal-300: tint-color($teal, 40%) !default; +$teal-400: tint-color($teal, 20%) !default; +$teal-500: $teal !default; +$teal-600: shade-color($teal, 20%) !default; +$teal-700: shade-color($teal, 40%) !default; +$teal-800: shade-color($teal, 60%) !default; +$teal-900: shade-color($teal, 80%) !default; + +$cyan-100: tint-color($cyan, 80%) !default; +$cyan-200: tint-color($cyan, 60%) !default; +$cyan-300: tint-color($cyan, 40%) !default; +$cyan-400: tint-color($cyan, 20%) !default; +$cyan-500: $cyan !default; +$cyan-600: shade-color($cyan, 20%) !default; +$cyan-700: shade-color($cyan, 40%) !default; +$cyan-800: shade-color($cyan, 60%) !default; +$cyan-900: shade-color($cyan, 80%) !default; + +$blues: ( + 'blue-100': $blue-100, + 'blue-200': $blue-200, + 'blue-300': $blue-300, + 'blue-400': $blue-400, + 'blue-500': $blue-500, + 'blue-600': $blue-600, + 'blue-700': $blue-700, + 'blue-800': $blue-800, + 'blue-900': $blue-900, +) !default; + +$indigos: ( + 'indigo-100': $indigo-100, + 'indigo-200': $indigo-200, + 'indigo-300': $indigo-300, + 'indigo-400': $indigo-400, + 'indigo-500': $indigo-500, + 'indigo-600': $indigo-600, + 'indigo-700': $indigo-700, + 'indigo-800': $indigo-800, + 'indigo-900': $indigo-900, +) !default; + +$purples: ( + 'purple-100': $purple-100, + 'purple-200': $purple-200, + 'purple-300': $purple-300, + 'purple-400': $purple-400, + 'purple-500': $purple-500, + 'purple-600': $purple-600, + 'purple-700': $purple-700, + 'purple-800': $purple-800, + 'purple-900': $purple-900, +) !default; + +$pinks: ( + 'pink-100': $pink-100, + 'pink-200': $pink-200, + 'pink-300': $pink-300, + 'pink-400': $pink-400, + 'pink-500': $pink-500, + 'pink-600': $pink-600, + 'pink-700': $pink-700, + 'pink-800': $pink-800, + 'pink-900': $pink-900, +) !default; + +$reds: ( + 'red-100': $red-100, + 'red-200': $red-200, + 'red-300': $red-300, + 'red-400': $red-400, + 'red-500': $red-500, + 'red-600': $red-600, + 'red-700': $red-700, + 'red-800': $red-800, + 'red-900': $red-900, +) !default; + +$oranges: ( + 'orange-100': $orange-100, + 'orange-200': $orange-200, + 'orange-300': $orange-300, + 'orange-400': $orange-400, + 'orange-500': $orange-500, + 'orange-600': $orange-600, + 'orange-700': $orange-700, + 'orange-800': $orange-800, + 'orange-900': $orange-900, +) !default; + +$yellows: ( + 'yellow-100': $yellow-100, + 'yellow-200': $yellow-200, + 'yellow-300': $yellow-300, + 'yellow-400': $yellow-400, + 'yellow-500': $yellow-500, + 'yellow-600': $yellow-600, + 'yellow-700': $yellow-700, + 'yellow-800': $yellow-800, + 'yellow-900': $yellow-900, +) !default; + +$greens: ( + 'green-100': $green-100, + 'green-200': $green-200, + 'green-300': $green-300, + 'green-400': $green-400, + 'green-500': $green-500, + 'green-600': $green-600, + 'green-700': $green-700, + 'green-800': $green-800, + 'green-900': $green-900, +) !default; + +$teals: ( + 'teal-100': $teal-100, + 'teal-200': $teal-200, + 'teal-300': $teal-300, + 'teal-400': $teal-400, + 'teal-500': $teal-500, + 'teal-600': $teal-600, + 'teal-700': $teal-700, + 'teal-800': $teal-800, + 'teal-900': $teal-900, +) !default; + +$cyans: ( + 'cyan-100': $cyan-100, + 'cyan-200': $cyan-200, + 'cyan-300': $cyan-300, + 'cyan-400': $cyan-400, + 'cyan-500': $cyan-500, + 'cyan-600': $cyan-600, + 'cyan-700': $cyan-700, + 'cyan-800': $cyan-800, + 'cyan-900': $cyan-900, +) !default; + +// fusv-enable + +// scss-docs-start theme-color-variables +$primary: $blue !default; +$secondary: $gray-600 !default; +$success: $green !default; +$info: $cyan !default; +$warning: $yellow !default; +$danger: $red !default; +$light: $gray-100 !default; +$dark: $gray-900 !default; + +// scss-docs-end theme-color-variables + +// scss-docs-start theme-colors-map +$theme-colors: ( + 'primary': $primary, + 'secondary': $secondary, + 'success': $success, + 'info': $info, + 'warning': $warning, + 'danger': $danger, + 'light': $light, + 'dark': $dark, +) !default; + +// scss-docs-end theme-colors-map + +// scss-docs-start theme-text-variables +$primary-text-emphasis: shade-color($primary, 60%) !default; +$secondary-text-emphasis: shade-color($secondary, 60%) !default; +$success-text-emphasis: shade-color($success, 60%) !default; +$info-text-emphasis: shade-color($info, 60%) !default; +$warning-text-emphasis: shade-color($warning, 60%) !default; +$danger-text-emphasis: shade-color($danger, 60%) !default; +$light-text-emphasis: $gray-700 !default; +$dark-text-emphasis: $gray-700 !default; + +// scss-docs-end theme-text-variables + +// scss-docs-start theme-bg-subtle-variables +$primary-bg-subtle: tint-color($primary, 80%) !default; +$secondary-bg-subtle: tint-color($secondary, 80%) !default; +$success-bg-subtle: tint-color($success, 80%) !default; +$info-bg-subtle: tint-color($info, 80%) !default; +$warning-bg-subtle: tint-color($warning, 80%) !default; +$danger-bg-subtle: tint-color($danger, 80%) !default; +$light-bg-subtle: color.mix($gray-100, $white) !default; +$dark-bg-subtle: $gray-400 !default; + +// scss-docs-end theme-bg-subtle-variables + +// scss-docs-start theme-border-subtle-variables +$primary-border-subtle: tint-color($primary, 60%) !default; +$secondary-border-subtle: tint-color($secondary, 60%) !default; +$success-border-subtle: tint-color($success, 60%) !default; +$info-border-subtle: tint-color($info, 60%) !default; +$warning-border-subtle: tint-color($warning, 60%) !default; +$danger-border-subtle: tint-color($danger, 60%) !default; +$light-border-subtle: $gray-200 !default; +$dark-border-subtle: $gray-500 !default; + +// scss-docs-end theme-border-subtle-variables + +// Characters which are escaped by the escape-svg function +$escaped-characters: ( + ('<', '%3c'), + ('>', '%3e'), + ('#', '%23'), + ('(', '%28'), + (')', '%29') +) !default; + +// Options +// +// Quickly modify global styling by enabling or disabling optional features. + +$enable-caret: true !default; +$enable-rounded: true !default; +$enable-shadows: false !default; +$enable-gradients: false !default; +$enable-transitions: true !default; +$enable-reduced-motion: true !default; +$enable-smooth-scroll: true !default; +$enable-grid-classes: true !default; +$enable-container-classes: true !default; +$enable-cssgrid: false !default; +$enable-button-pointers: true !default; +$enable-rfs: true !default; +$enable-validation-icons: true !default; +$enable-negative-margins: false !default; +$enable-deprecation-messages: true !default; +$enable-important-utilities: true !default; + +$enable-dark-mode: true !default; +$color-mode-type: data !default; // `data` or `media-query` + +// Prefix for :root CSS variables + +$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix` +$prefix: $variable-prefix !default; + +// Gradient +// +// The gradient which is added to components if `$enable-gradients` is `true` +// This gradient is also added to elements with `.bg-gradient` +// scss-docs-start variable-gradient +$gradient: linear-gradient( + 180deg, + rgba($white, 0.15), + rgba($white, 0) +) !default; + +// scss-docs-end variable-gradient + +// Spacing +// +// Control the default styling of most Bootstrap elements by modifying these +// variables. Mostly focused on spacing. +// You can add more entries to the $spacers map, should you need more variation. + +// scss-docs-start spacer-variables-maps +$spacer: 1rem !default; +$spacers: ( + 0: 0, + 1: $spacer * 0.25, + 2: $spacer * 0.5, + 3: $spacer, + 4: $spacer * 1.5, + 5: $spacer * 3, +) !default; + +// scss-docs-end spacer-variables-maps + +// Position +// +// Define the edge positioning anchors of the position utilities. + +// scss-docs-start position-map +$position-values: ( + 0: 0, + 50: 50%, + 100: 100%, +) !default; + +// scss-docs-end position-map + +// Body +// +// Settings for the `` element. + +$body-text-align: null !default; +$body-color: $gray-900 !default; +$body-bg: $white !default; + +$body-secondary-color: rgba($body-color, 0.75) !default; +$body-secondary-bg: $gray-200 !default; + +$body-tertiary-color: rgba($body-color, 0.5) !default; +$body-tertiary-bg: $gray-100 !default; + +$body-emphasis-color: $black !default; + +// Links +// +// Style anchor elements. + +$link-color: $primary !default; +$link-decoration: underline !default; +$link-shade-percentage: 20% !default; +$link-hover-color: shift-color($link-color, $link-shade-percentage) !default; +$link-hover-decoration: null !default; + +$stretched-link-pseudo-element: after !default; +$stretched-link-z-index: 1 !default; + +// Icon links +// scss-docs-start icon-link-variables +$icon-link-gap: 0.375rem !default; +$icon-link-underline-offset: 0.25em !default; +$icon-link-icon-size: 1em !default; +$icon-link-icon-transition: 0.2s ease-in-out transform !default; +$icon-link-icon-transform: translate3d(0.25em, 0, 0) !default; + +// scss-docs-end icon-link-variables + +// Paragraphs +// +// Style p element. + +$paragraph-margin-bottom: 1rem !default; + +// Grid breakpoints +// +// Define the minimum dimensions at which your layout will change, +// adapting to different screen sizes, for use in media queries. + +// scss-docs-start grid-breakpoints +$grid-breakpoints: ( + xs: 0, + sm: 576px, + md: 768px, + lg: 992px, + xl: 1200px, + xxl: 1400px, +) !default; + +// scss-docs-end grid-breakpoints + +@include _assert-ascending($grid-breakpoints, '$grid-breakpoints'); +@include _assert-starts-at-zero($grid-breakpoints, '$grid-breakpoints'); + +// Grid containers +// +// Define the maximum width of `.container` for different screen sizes. + +// scss-docs-start container-max-widths +$container-max-widths: ( + sm: 540px, + md: 720px, + lg: 960px, + xl: 1140px, + xxl: 1320px, +) !default; + +// scss-docs-end container-max-widths + +@include _assert-ascending($container-max-widths, '$container-max-widths'); + +// Grid columns +// +// Set the number of columns and specify the width of the gutters. + +$grid-columns: 12 !default; +$grid-gutter-width: 1.5rem !default; +$grid-row-columns: 6 !default; + +// Container padding + +$container-padding-x: $grid-gutter-width !default; + +// Components +// +// Define common padding and border radius sizes and more. + +// scss-docs-start border-variables +$border-width: 1px !default; +$border-widths: ( + 1: 1px, + 2: 2px, + 3: 3px, + 4: 4px, + 5: 5px, +) !default; +$border-style: solid !default; +$border-color: $gray-300 !default; +$border-color-translucent: rgba($black, 0.175) !default; + +// scss-docs-end border-variables + +// scss-docs-start border-radius-variables +$border-radius: 0.375rem !default; +$border-radius-sm: 0.25rem !default; +$border-radius-lg: 0.5rem !default; +$border-radius-xl: 1rem !default; +$border-radius-xxl: 2rem !default; +$border-radius-pill: 50rem !default; + +// scss-docs-end border-radius-variables +// fusv-disable +$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0 +// fusv-enable + +// scss-docs-start box-shadow-variables +$box-shadow: 0 0.5rem 1rem rgba($black, 0.15) !default; +$box-shadow-sm: 0 0.125rem 0.25rem rgba($black, 0.075) !default; +$box-shadow-lg: 0 1rem 3rem rgba($black, 0.175) !default; +$box-shadow-inset: inset 0 1px 2px rgba($black, 0.075) !default; + +// scss-docs-end box-shadow-variables + +$component-active-color: $white !default; +$component-active-bg: $primary !default; + +// scss-docs-start focus-ring-variables +$focus-ring-width: 0.25rem !default; +$focus-ring-opacity: 0.25 !default; +$focus-ring-color: rgba($primary, $focus-ring-opacity) !default; +$focus-ring-blur: 0 !default; +$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default; + +// scss-docs-end focus-ring-variables + +// scss-docs-start caret-variables +$caret-width: 0.3em !default; +$caret-vertical-align: $caret-width * 0.85 !default; +$caret-spacing: $caret-width * 0.85 !default; + +// scss-docs-end caret-variables + +$transition-base: all 0.2s ease-in-out !default; +$transition-fade: opacity 0.15s linear !default; + +// scss-docs-start collapse-transition +$transition-collapse: height 0.35s ease !default; +$transition-collapse-width: width 0.35s ease !default; + +// scss-docs-end collapse-transition + +// stylelint-disable function-disallowed-list +// scss-docs-start aspect-ratios +$aspect-ratios: ( + '1x1': 100%, + '4x3': calc(3 / 4 * 100%), + '16x9': calc(9 / 16 * 100%), + '21x9': calc(9 / 21 * 100%), +) !default; + +// scss-docs-end aspect-ratios +// stylelint-enable function-disallowed-list + +// Typography +// +// Font, line-height, and color for body text, headings, and more. + +// scss-docs-start font-variables +// stylelint-disable value-keyword-case +$font-family-sans-serif: + system-ui, + -apple-system, + 'Segoe UI', + Roboto, + 'Helvetica Neue', + 'Noto Sans', + 'Liberation Sans', + Arial, + sans-serif, + 'Apple Color Emoji', + 'Segoe UI Emoji', + 'Segoe UI Symbol', + 'Noto Color Emoji' !default; +$font-family-monospace: + SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', + monospace !default; +// stylelint-enable value-keyword-case +$font-family-base: var(--#{$prefix}font-sans-serif) !default; +$font-family-code: var(--#{$prefix}font-monospace) !default; + +// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins +// $font-size-base affects the font size of the body text +$font-size-root: null !default; +$font-size-base: 1rem !default; // Assumes the browser default, typically `16px` +$font-size-sm: $font-size-base * 0.875 !default; +$font-size-lg: $font-size-base * 1.25 !default; + +$font-weight-lighter: lighter !default; +$font-weight-light: 300 !default; +$font-weight-normal: 400 !default; +$font-weight-medium: 500 !default; +$font-weight-semibold: 600 !default; +$font-weight-bold: 700 !default; +$font-weight-bolder: bolder !default; + +$font-weight-base: $font-weight-normal !default; + +$line-height-base: 1.5 !default; +$line-height-sm: 1.25 !default; +$line-height-lg: 2 !default; + +$h1-font-size: $font-size-base * 2.5 !default; +$h2-font-size: $font-size-base * 2 !default; +$h3-font-size: $font-size-base * 1.75 !default; +$h4-font-size: $font-size-base * 1.5 !default; +$h5-font-size: $font-size-base * 1.25 !default; +$h6-font-size: $font-size-base !default; + +// scss-docs-end font-variables + +// scss-docs-start font-sizes +$font-sizes: ( + 1: $h1-font-size, + 2: $h2-font-size, + 3: $h3-font-size, + 4: $h4-font-size, + 5: $h5-font-size, + 6: $h6-font-size, +) !default; + +// scss-docs-end font-sizes + +// scss-docs-start headings-variables +$headings-margin-bottom: $spacer * 0.5 !default; +$headings-font-family: null !default; +$headings-font-style: null !default; +$headings-font-weight: 500 !default; +$headings-line-height: 1.2 !default; +$headings-color: inherit !default; + +// scss-docs-end headings-variables + +// scss-docs-start display-headings +$display-font-sizes: ( + 1: 5rem, + 2: 4.5rem, + 3: 4rem, + 4: 3.5rem, + 5: 3rem, + 6: 2.5rem, +) !default; + +$display-font-family: null !default; +$display-font-style: null !default; +$display-font-weight: 300 !default; +$display-line-height: $headings-line-height !default; + +// scss-docs-end display-headings + +// scss-docs-start type-variables +$lead-font-size: $font-size-base * 1.25 !default; +$lead-font-weight: 300 !default; + +$small-font-size: 0.875em !default; + +$sub-sup-font-size: 0.75em !default; + +// fusv-disable +$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0 +// fusv-enable + +$initialism-font-size: $small-font-size !default; + +$blockquote-margin-y: $spacer !default; +$blockquote-font-size: $font-size-base * 1.25 !default; +$blockquote-footer-color: $gray-600 !default; +$blockquote-footer-font-size: $small-font-size !default; + +$hr-margin-y: $spacer !default; +$hr-color: inherit !default; + +// fusv-disable +$hr-bg-color: null !default; // Deprecated in v5.2.0 +$hr-height: null !default; // Deprecated in v5.2.0 +// fusv-enable + +$hr-border-color: null !default; // Allows for inherited colors +$hr-border-width: var(--#{$prefix}border-width) !default; +$hr-opacity: 0.25 !default; + +// scss-docs-start vr-variables +$vr-border-width: var(--#{$prefix}border-width) !default; + +// scss-docs-end vr-variables + +$legend-margin-bottom: 0.5rem !default; +$legend-font-size: 1.5rem !default; +$legend-font-weight: null !default; + +$dt-font-weight: $font-weight-bold !default; + +$list-inline-padding: 0.5rem !default; + +$mark-padding: 0.1875em !default; +$mark-color: $body-color !default; +$mark-bg: $yellow-100 !default; + +// scss-docs-end type-variables + +// Tables +// +// Customizes the `.table` component with basic values, each used across all table variations. + +// scss-docs-start table-variables +$table-cell-padding-y: 0.5rem !default; +$table-cell-padding-x: 0.5rem !default; +$table-cell-padding-y-sm: 0.25rem !default; +$table-cell-padding-x-sm: 0.25rem !default; + +$table-cell-vertical-align: top !default; + +$table-color: var(--#{$prefix}emphasis-color) !default; +$table-bg: var(--#{$prefix}body-bg) !default; +$table-accent-bg: transparent !default; + +$table-th-font-weight: null !default; + +$table-striped-color: $table-color !default; +$table-striped-bg-factor: 0.05 !default; +$table-striped-bg: rgb( + var(--#{$prefix}emphasis-color-rgb), + $table-striped-bg-factor +) !default; + +$table-active-color: $table-color !default; +$table-active-bg-factor: 0.1 !default; +$table-active-bg: rgb( + var(--#{$prefix}emphasis-color-rgb), + $table-active-bg-factor +) !default; + +$table-hover-color: $table-color !default; +$table-hover-bg-factor: 0.075 !default; +$table-hover-bg: rgb( + var(--#{$prefix}emphasis-color-rgb), + $table-hover-bg-factor +) !default; + +$table-border-factor: 0.2 !default; +$table-border-width: var(--#{$prefix}border-width) !default; +$table-border-color: var(--#{$prefix}border-color) !default; + +$table-striped-order: odd !default; +$table-striped-columns-order: even !default; + +$table-group-separator-color: currentcolor !default; + +$table-caption-color: var(--#{$prefix}secondary-color) !default; + +$table-bg-scale: -80% !default; + +// scss-docs-end table-variables + +// scss-docs-start table-loop +$table-variants: ( + 'primary': shift-color($primary, $table-bg-scale), + 'secondary': shift-color($secondary, $table-bg-scale), + 'success': shift-color($success, $table-bg-scale), + 'info': shift-color($info, $table-bg-scale), + 'warning': shift-color($warning, $table-bg-scale), + 'danger': shift-color($danger, $table-bg-scale), + 'light': $light, + 'dark': $dark, +) !default; + +// scss-docs-end table-loop + +// Buttons + Forms +// +// Shared variables that are reassigned to `$input-` and `$btn-` specific variables. + +// scss-docs-start input-btn-variables +$input-btn-padding-y: 0.375rem !default; +$input-btn-padding-x: 0.75rem !default; +$input-btn-font-family: null !default; +$input-btn-font-size: $font-size-base !default; +$input-btn-line-height: $line-height-base !default; + +$input-btn-focus-width: $focus-ring-width !default; +$input-btn-focus-color-opacity: $focus-ring-opacity !default; +$input-btn-focus-color: $focus-ring-color !default; +$input-btn-focus-blur: $focus-ring-blur !default; +$input-btn-focus-box-shadow: $focus-ring-box-shadow !default; + +$input-btn-padding-y-sm: 0.25rem !default; +$input-btn-padding-x-sm: 0.5rem !default; +$input-btn-font-size-sm: $font-size-sm !default; + +$input-btn-padding-y-lg: 0.5rem !default; +$input-btn-padding-x-lg: 1rem !default; +$input-btn-font-size-lg: $font-size-lg !default; + +$input-btn-border-width: var(--#{$prefix}border-width) !default; + +// scss-docs-end input-btn-variables + +// Buttons +// +// For each of Bootstrap's buttons, define text, background, and border color. + +// scss-docs-start btn-variables +$btn-color: var(--#{$prefix}body-color) !default; +$btn-padding-y: $input-btn-padding-y !default; +$btn-padding-x: $input-btn-padding-x !default; +$btn-font-family: $input-btn-font-family !default; +$btn-font-size: $input-btn-font-size !default; +$btn-line-height: $input-btn-line-height !default; +$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping + +$btn-padding-y-sm: $input-btn-padding-y-sm !default; +$btn-padding-x-sm: $input-btn-padding-x-sm !default; +$btn-font-size-sm: $input-btn-font-size-sm !default; + +$btn-padding-y-lg: $input-btn-padding-y-lg !default; +$btn-padding-x-lg: $input-btn-padding-x-lg !default; +$btn-font-size-lg: $input-btn-font-size-lg !default; + +$btn-border-width: $input-btn-border-width !default; + +$btn-font-weight: $font-weight-normal !default; +$btn-box-shadow: + inset 0 1px 0 rgba($white, 0.15), + 0 1px 1px rgba($black, 0.075) !default; +$btn-focus-width: $input-btn-focus-width !default; +$btn-focus-box-shadow: $input-btn-focus-box-shadow !default; +$btn-disabled-opacity: 0.65 !default; +$btn-active-box-shadow: inset 0 3px 5px rgba($black, 0.125) !default; + +$btn-link-color: var(--#{$prefix}link-color) !default; +$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default; +$btn-link-disabled-color: $gray-600 !default; +$btn-link-focus-shadow-rgb: to-rgb( + color.mix(color-contrast($link-color), $link-color, 15%) +) !default; + +// Allows for customizing button radius independently from global border radius +$btn-border-radius: var(--#{$prefix}border-radius) !default; +$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default; +$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default; + +$btn-transition: + color 0.15s ease-in-out, + background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out !default; + +$btn-hover-bg-shade-amount: 15% !default; +$btn-hover-bg-tint-amount: 15% !default; +$btn-hover-border-shade-amount: 20% !default; +$btn-hover-border-tint-amount: 10% !default; +$btn-active-bg-shade-amount: 20% !default; +$btn-active-bg-tint-amount: 20% !default; +$btn-active-border-shade-amount: 25% !default; +$btn-active-border-tint-amount: 10% !default; + +// scss-docs-end btn-variables + +// Forms + +// scss-docs-start form-text-variables +$form-text-margin-top: 0.25rem !default; +$form-text-font-size: $small-font-size !default; +$form-text-font-style: null !default; +$form-text-font-weight: null !default; +$form-text-color: var(--#{$prefix}secondary-color) !default; + +// scss-docs-end form-text-variables + +// scss-docs-start form-label-variables +$form-label-margin-bottom: 0.5rem !default; +$form-label-font-size: null !default; +$form-label-font-style: null !default; +$form-label-font-weight: null !default; +$form-label-color: null !default; + +// scss-docs-end form-label-variables + +// scss-docs-start form-input-variables +$input-padding-y: $input-btn-padding-y !default; +$input-padding-x: $input-btn-padding-x !default; +$input-font-family: $input-btn-font-family !default; +$input-font-size: $input-btn-font-size !default; +$input-font-weight: $font-weight-base !default; +$input-line-height: $input-btn-line-height !default; + +$input-padding-y-sm: $input-btn-padding-y-sm !default; +$input-padding-x-sm: $input-btn-padding-x-sm !default; +$input-font-size-sm: $input-btn-font-size-sm !default; + +$input-padding-y-lg: $input-btn-padding-y-lg !default; +$input-padding-x-lg: $input-btn-padding-x-lg !default; +$input-font-size-lg: $input-btn-font-size-lg !default; + +$input-bg: var(--#{$prefix}body-bg) !default; +$input-disabled-color: null !default; +$input-disabled-bg: var(--#{$prefix}secondary-bg) !default; +$input-disabled-border-color: null !default; + +$input-color: var(--#{$prefix}body-color) !default; +$input-border-color: var(--#{$prefix}border-color) !default; +$input-border-width: $input-btn-border-width !default; +$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default; + +$input-border-radius: var(--#{$prefix}border-radius) !default; +$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default; +$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default; + +$input-focus-bg: $input-bg !default; +$input-focus-border-color: tint-color($component-active-bg, 50%) !default; +$input-focus-color: $input-color !default; +$input-focus-width: $input-btn-focus-width !default; +$input-focus-box-shadow: $input-btn-focus-box-shadow !default; + +$input-placeholder-color: var(--#{$prefix}secondary-color) !default; +$input-plaintext-color: var(--#{$prefix}body-color) !default; + +$input-height-border: calc( + #{$input-border-width} * 2 +) !default; // stylelint-disable-line function-disallowed-list + +$input-height-inner: add( + $input-line-height * 1em, + $input-padding-y * 2 +) !default; +$input-height-inner-half: add( + $input-line-height * 0.5em, + $input-padding-y +) !default; +$input-height-inner-quarter: add( + $input-line-height * 0.25em, + $input-padding-y * 0.5 +) !default; + +$input-height: add( + $input-line-height * 1em, + add($input-padding-y * 2, $input-height-border, false) +) !default; +$input-height-sm: add( + $input-line-height * 1em, + add($input-padding-y-sm * 2, $input-height-border, false) +) !default; +$input-height-lg: add( + $input-line-height * 1em, + add($input-padding-y-lg * 2, $input-height-border, false) +) !default; + +$input-transition: + border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out !default; + +$form-color-width: 3rem !default; + +// scss-docs-end form-input-variables + +// scss-docs-start form-check-variables +$form-check-input-width: 1em !default; +$form-check-min-height: $font-size-base * $line-height-base !default; +$form-check-padding-start: $form-check-input-width + 0.5em !default; +$form-check-margin-bottom: 0.125rem !default; +$form-check-label-color: null !default; +$form-check-label-cursor: null !default; +$form-check-transition: null !default; + +$form-check-input-active-filter: brightness(90%) !default; + +$form-check-input-bg: $input-bg !default; +$form-check-input-border: var(--#{$prefix}border-width) solid + var(--#{$prefix}border-color) !default; +$form-check-input-border-radius: 0.25em !default; +$form-check-radio-border-radius: 50% !default; +$form-check-input-focus-border: $input-focus-border-color !default; +$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default; + +$form-check-input-checked-color: $component-active-color !default; +$form-check-input-checked-bg-color: $component-active-bg !default; +$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default; +$form-check-input-checked-bg-image: url("data:image/svg+xml,") !default; +$form-check-radio-checked-bg-image: url("data:image/svg+xml,") !default; + +$form-check-input-indeterminate-color: $component-active-color !default; +$form-check-input-indeterminate-bg-color: $component-active-bg !default; +$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default; +$form-check-input-indeterminate-bg-image: url("data:image/svg+xml,") !default; + +$form-check-input-disabled-opacity: 0.5 !default; +$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default; +$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default; + +$form-check-inline-margin-end: 1rem !default; + +// scss-docs-end form-check-variables + +// scss-docs-start form-switch-variables +$form-switch-color: rgba($black, 0.25) !default; +$form-switch-width: 2em !default; +$form-switch-padding-start: $form-switch-width + 0.5em !default; +$form-switch-bg-image: url("data:image/svg+xml,") !default; +$form-switch-border-radius: $form-switch-width !default; +$form-switch-transition: background-position 0.15s ease-in-out !default; + +$form-switch-focus-color: $input-focus-border-color !default; +$form-switch-focus-bg-image: url("data:image/svg+xml,") !default; + +$form-switch-checked-color: $component-active-color !default; +$form-switch-checked-bg-image: url("data:image/svg+xml,") !default; +$form-switch-checked-bg-position: right center !default; + +// scss-docs-end form-switch-variables + +// scss-docs-start input-group-variables +$input-group-addon-padding-y: $input-padding-y !default; +$input-group-addon-padding-x: $input-padding-x !default; +$input-group-addon-font-weight: $input-font-weight !default; +$input-group-addon-color: $input-color !default; +$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default; +$input-group-addon-border-color: $input-border-color !default; + +// scss-docs-end input-group-variables + +// scss-docs-start form-select-variables +$form-select-padding-y: $input-padding-y !default; +$form-select-padding-x: $input-padding-x !default; +$form-select-font-family: $input-font-family !default; +$form-select-font-size: $input-font-size !default; +$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image +$form-select-font-weight: $input-font-weight !default; +$form-select-line-height: $input-line-height !default; +$form-select-color: $input-color !default; +$form-select-bg: $input-bg !default; +$form-select-disabled-color: null !default; +$form-select-disabled-bg: $input-disabled-bg !default; +$form-select-disabled-border-color: $input-disabled-border-color !default; +$form-select-bg-position: right $form-select-padding-x center !default; +$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions +$form-select-indicator-color: $gray-800 !default; +$form-select-indicator: url("data:image/svg+xml,") !default; + +$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + + $form-select-indicator-padding !default; +$form-select-feedback-icon-position: center right $form-select-indicator-padding !default; +$form-select-feedback-icon-size: $input-height-inner-half + $input-height-inner-half !default; + +$form-select-border-width: $input-border-width !default; +$form-select-border-color: $input-border-color !default; +$form-select-border-radius: $input-border-radius !default; +$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default; + +$form-select-focus-border-color: $input-focus-border-color !default; +$form-select-focus-width: $input-focus-width !default; +$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width + $input-btn-focus-color !default; + +$form-select-padding-y-sm: $input-padding-y-sm !default; +$form-select-padding-x-sm: $input-padding-x-sm !default; +$form-select-font-size-sm: $input-font-size-sm !default; +$form-select-border-radius-sm: $input-border-radius-sm !default; + +$form-select-padding-y-lg: $input-padding-y-lg !default; +$form-select-padding-x-lg: $input-padding-x-lg !default; +$form-select-font-size-lg: $input-font-size-lg !default; +$form-select-border-radius-lg: $input-border-radius-lg !default; + +$form-select-transition: $input-transition !default; + +// scss-docs-end form-select-variables + +// scss-docs-start form-range-variables +$form-range-track-width: 100% !default; +$form-range-track-height: 0.5rem !default; +$form-range-track-cursor: pointer !default; +$form-range-track-bg: var(--#{$prefix}secondary-bg) !default; +$form-range-track-border-radius: 1rem !default; +$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default; + +$form-range-thumb-width: 1rem !default; +$form-range-thumb-height: $form-range-thumb-width !default; +$form-range-thumb-bg: $component-active-bg !default; +$form-range-thumb-border: 0 !default; +$form-range-thumb-border-radius: 1rem !default; +$form-range-thumb-box-shadow: 0 0.1rem 0.25rem rgba($black, 0.1) !default; +$form-range-thumb-focus-box-shadow: + 0 0 0 1px $body-bg, + $input-focus-box-shadow !default; +$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge +$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default; +$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default; +$form-range-thumb-transition: + background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out !default; + +// scss-docs-end form-range-variables + +// scss-docs-start form-file-variables +$form-file-button-color: $input-color !default; +$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default; +$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default; + +// scss-docs-end form-file-variables + +// scss-docs-start form-floating-variables +$form-floating-height: add(3.5rem, $input-height-border) !default; +$form-floating-line-height: 1.25 !default; +$form-floating-padding-x: $input-padding-x !default; +$form-floating-padding-y: 1rem !default; +$form-floating-input-padding-t: 1.625rem !default; +$form-floating-input-padding-b: 0.625rem !default; +$form-floating-label-height: 1.5em !default; +$form-floating-label-opacity: 0.65 !default; +$form-floating-label-transform: scale(0.85) translateY(-0.5rem) + translateX(0.15rem) !default; +$form-floating-label-disabled-color: $gray-600 !default; +$form-floating-transition: + opacity 0.1s ease-in-out, + transform 0.1s ease-in-out !default; + +// scss-docs-end form-floating-variables + +// Form validation + +// scss-docs-start form-feedback-variables +$form-feedback-margin-top: $form-text-margin-top !default; +$form-feedback-font-size: $form-text-font-size !default; +$form-feedback-font-style: $form-text-font-style !default; +$form-feedback-valid-color: $success !default; +$form-feedback-invalid-color: $danger !default; + +$form-feedback-icon-valid-color: $form-feedback-valid-color !default; +$form-feedback-icon-valid: url("data:image/svg+xml,") !default; +$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default; +$form-feedback-icon-invalid: url("data:image/svg+xml,") !default; + +// scss-docs-end form-feedback-variables + +// scss-docs-start form-validation-colors +$form-valid-color: $form-feedback-valid-color !default; +$form-valid-border-color: $form-feedback-valid-color !default; +$form-invalid-color: $form-feedback-invalid-color !default; +$form-invalid-border-color: $form-feedback-invalid-color !default; + +// scss-docs-end form-validation-colors + +// scss-docs-start form-validation-states +$form-validation-states: ( + 'valid': ( + 'color': var(--#{$prefix}form-valid-color), + 'icon': $form-feedback-icon-valid, + 'tooltip-color': #fff, + 'tooltip-bg-color': var(--#{$prefix}success), + 'focus-box-shadow': 0 0 $input-btn-focus-blur $input-focus-width + rgb(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity), + 'border-color': var(--#{$prefix}form-valid-border-color), + ), + 'invalid': ( + 'color': var(--#{$prefix}form-invalid-color), + 'icon': $form-feedback-icon-invalid, + 'tooltip-color': #fff, + 'tooltip-bg-color': var(--#{$prefix}danger), + 'focus-box-shadow': 0 0 $input-btn-focus-blur $input-focus-width + rgb(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity), + 'border-color': var(--#{$prefix}form-invalid-border-color), + ), +) !default; + +// scss-docs-end form-validation-states + +// Z-index master list +// +// Warning: Avoid customizing these values. They're used for a bird's eye view +// of components dependent on the z-axis and are designed to all work together. + +// scss-docs-start zindex-stack +$zindex-dropdown: 1000 !default; +$zindex-sticky: 1020 !default; +$zindex-fixed: 1030 !default; +$zindex-offcanvas-backdrop: 1040 !default; +$zindex-offcanvas: 1045 !default; +$zindex-modal-backdrop: 1050 !default; +$zindex-modal: 1055 !default; +$zindex-popover: 1070 !default; +$zindex-tooltip: 1080 !default; +$zindex-toast: 1090 !default; + +// scss-docs-end zindex-stack + +// scss-docs-start zindex-levels-map +$zindex-levels: ( + n1: -1, + 0: 0, + 1: 1, + 2: 2, + 3: 3, +) !default; + +// scss-docs-end zindex-levels-map + +// Navs + +// scss-docs-start nav-variables +$nav-link-padding-y: 0.5rem !default; +$nav-link-padding-x: 1rem !default; +$nav-link-font-size: null !default; +$nav-link-font-weight: null !default; +$nav-link-color: var(--#{$prefix}link-color) !default; +$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default; +$nav-link-transition: + color 0.15s ease-in-out, + background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out !default; +$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default; +$nav-link-focus-box-shadow: $focus-ring-box-shadow !default; + +$nav-tabs-border-color: var(--#{$prefix}border-color) !default; +$nav-tabs-border-width: var(--#{$prefix}border-width) !default; +$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default; +$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) + var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default; +$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default; +$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default; +$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) + var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default; + +$nav-pills-border-radius: var(--#{$prefix}border-radius) !default; +$nav-pills-link-active-color: $component-active-color !default; +$nav-pills-link-active-bg: $component-active-bg !default; + +$nav-underline-gap: 1rem !default; +$nav-underline-border-width: 0.125rem !default; +$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default; + +// scss-docs-end nav-variables + +// Navbar + +// scss-docs-start navbar-variables +$navbar-padding-y: $spacer * 0.5 !default; +$navbar-padding-x: null !default; + +$navbar-nav-link-padding-x: 0.5rem !default; + +$navbar-brand-font-size: $font-size-lg !default; + +// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link +$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default; +$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default; +$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * 0.5 !default; +$navbar-brand-margin-end: 1rem !default; + +$navbar-toggler-padding-y: 0.25rem !default; +$navbar-toggler-padding-x: 0.75rem !default; +$navbar-toggler-font-size: $font-size-lg !default; +$navbar-toggler-border-radius: $btn-border-radius !default; +$navbar-toggler-focus-width: $btn-focus-width !default; +$navbar-toggler-transition: box-shadow 0.15s ease-in-out !default; + +$navbar-light-color: rgb(var(--#{$prefix}emphasis-color-rgb), 0.65) !default; +$navbar-light-hover-color: rgb( + var(--#{$prefix}emphasis-color-rgb), + 0.8 +) !default; +$navbar-light-active-color: rgb( + var(--#{$prefix}emphasis-color-rgb), + 1 +) !default; +$navbar-light-disabled-color: rgb( + var(--#{$prefix}emphasis-color-rgb), + 0.3 +) !default; +$navbar-light-icon-color: rgba($body-color, 0.75) !default; +$navbar-light-toggler-icon-bg: url("data:image/svg+xml,") !default; +$navbar-light-toggler-border-color: rgb( + var(--#{$prefix}emphasis-color-rgb), + 0.15 +) !default; +$navbar-light-brand-color: $navbar-light-active-color !default; +$navbar-light-brand-hover-color: $navbar-light-active-color !default; + +// scss-docs-end navbar-variables + +// scss-docs-start navbar-dark-variables +$navbar-dark-color: rgba($white, 0.55) !default; +$navbar-dark-hover-color: rgba($white, 0.75) !default; +$navbar-dark-active-color: $white !default; +$navbar-dark-disabled-color: rgba($white, 0.25) !default; +$navbar-dark-icon-color: $navbar-dark-color !default; +$navbar-dark-toggler-icon-bg: url("data:image/svg+xml,") !default; +$navbar-dark-toggler-border-color: rgba($white, 0.1) !default; +$navbar-dark-brand-color: $navbar-dark-active-color !default; +$navbar-dark-brand-hover-color: $navbar-dark-active-color !default; + +// scss-docs-end navbar-dark-variables + +// Dropdowns +// +// Dropdown menu container and contents. + +// scss-docs-start dropdown-variables +$dropdown-min-width: 10rem !default; +$dropdown-padding-x: 0 !default; +$dropdown-padding-y: 0.5rem !default; +$dropdown-spacer: 0.125rem !default; +$dropdown-font-size: $font-size-base !default; +$dropdown-color: var(--#{$prefix}body-color) !default; +$dropdown-bg: var(--#{$prefix}body-bg) !default; +$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default; +$dropdown-border-radius: var(--#{$prefix}border-radius) !default; +$dropdown-border-width: var(--#{$prefix}border-width) !default; +$dropdown-inner-border-radius: calc( + #{$dropdown-border-radius} - #{$dropdown-border-width} +) !default; // stylelint-disable-line function-disallowed-list +$dropdown-divider-bg: $dropdown-border-color !default; +$dropdown-divider-margin-y: $spacer * 0.5 !default; +$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default; + +$dropdown-link-color: var(--#{$prefix}body-color) !default; +$dropdown-link-hover-color: $dropdown-link-color !default; +$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default; + +$dropdown-link-active-color: $component-active-color !default; +$dropdown-link-active-bg: $component-active-bg !default; + +$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default; + +$dropdown-item-padding-y: $spacer * 0.25 !default; +$dropdown-item-padding-x: $spacer !default; + +$dropdown-header-color: $gray-600 !default; +$dropdown-header-padding-x: $dropdown-item-padding-x !default; +$dropdown-header-padding-y: $dropdown-padding-y !default; + +// fusv-disable +$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0 +// fusv-enable +// scss-docs-end dropdown-variables + +// scss-docs-start dropdown-dark-variables +$dropdown-dark-color: $gray-300 !default; +$dropdown-dark-bg: $gray-800 !default; +$dropdown-dark-border-color: $dropdown-border-color !default; +$dropdown-dark-divider-bg: $dropdown-divider-bg !default; +$dropdown-dark-box-shadow: null !default; +$dropdown-dark-link-color: $dropdown-dark-color !default; +$dropdown-dark-link-hover-color: $white !default; +$dropdown-dark-link-hover-bg: rgba($white, 0.15) !default; +$dropdown-dark-link-active-color: $dropdown-link-active-color !default; +$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default; +$dropdown-dark-link-disabled-color: $gray-500 !default; +$dropdown-dark-header-color: $gray-500 !default; + +// scss-docs-end dropdown-dark-variables + +// Pagination + +// scss-docs-start pagination-variables +$pagination-padding-y: 0.375rem !default; +$pagination-padding-x: 0.75rem !default; +$pagination-padding-y-sm: 0.25rem !default; +$pagination-padding-x-sm: 0.5rem !default; +$pagination-padding-y-lg: 0.75rem !default; +$pagination-padding-x-lg: 1.5rem !default; + +$pagination-font-size: $font-size-base !default; + +$pagination-color: var(--#{$prefix}link-color) !default; +$pagination-bg: var(--#{$prefix}body-bg) !default; +$pagination-border-radius: var(--#{$prefix}border-radius) !default; +$pagination-border-width: var(--#{$prefix}border-width) !default; +$pagination-margin-start: calc( + -1 * #{$pagination-border-width} +) !default; // stylelint-disable-line function-disallowed-list +$pagination-border-color: var(--#{$prefix}border-color) !default; + +$pagination-focus-color: var(--#{$prefix}link-hover-color) !default; +$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default; +$pagination-focus-box-shadow: $focus-ring-box-shadow !default; +$pagination-focus-outline: 0 !default; + +$pagination-hover-color: var(--#{$prefix}link-hover-color) !default; +$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default; +$pagination-hover-border-color: var( + --#{$prefix}border-color +) !default; // Todo in v6: remove this? + +$pagination-active-color: $component-active-color !default; +$pagination-active-bg: $component-active-bg !default; +$pagination-active-border-color: $component-active-bg !default; + +$pagination-disabled-color: var(--#{$prefix}secondary-color) !default; +$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default; +$pagination-disabled-border-color: var(--#{$prefix}border-color) !default; + +$pagination-transition: + color 0.15s ease-in-out, + background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out !default; + +$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default; +$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default; + +// scss-docs-end pagination-variables + +// Placeholders + +// scss-docs-start placeholders +$placeholder-opacity-max: 0.5 !default; +$placeholder-opacity-min: 0.2 !default; + +// scss-docs-end placeholders + +// Cards + +// scss-docs-start card-variables +$card-spacer-y: $spacer !default; +$card-spacer-x: $spacer !default; +$card-title-spacer-y: $spacer * 0.5 !default; +$card-title-color: null !default; +$card-subtitle-color: null !default; +$card-border-width: var(--#{$prefix}border-width) !default; +$card-border-color: var(--#{$prefix}border-color-translucent) !default; +$card-border-radius: var(--#{$prefix}border-radius) !default; +$card-box-shadow: null !default; +$card-inner-border-radius: subtract( + $card-border-radius, + $card-border-width +) !default; +$card-cap-padding-y: $card-spacer-y * 0.5 !default; +$card-cap-padding-x: $card-spacer-x !default; +$card-cap-bg: rgb(var(--#{$prefix}body-color-rgb), 0.03) !default; +$card-cap-color: null !default; +$card-height: null !default; +$card-color: null !default; +$card-bg: var(--#{$prefix}body-bg) !default; +$card-img-overlay-padding: $spacer !default; +$card-group-margin: $grid-gutter-width * 0.5 !default; + +// scss-docs-end card-variables + +// Accordion + +// scss-docs-start accordion-variables +$accordion-padding-y: 1rem !default; +$accordion-padding-x: 1.25rem !default; +$accordion-color: var(--#{$prefix}body-color) !default; +$accordion-bg: var(--#{$prefix}body-bg) !default; +$accordion-border-width: var(--#{$prefix}border-width) !default; +$accordion-border-color: var(--#{$prefix}border-color) !default; +$accordion-border-radius: var(--#{$prefix}border-radius) !default; +$accordion-inner-border-radius: subtract( + $accordion-border-radius, + $accordion-border-width +) !default; + +$accordion-body-padding-y: $accordion-padding-y !default; +$accordion-body-padding-x: $accordion-padding-x !default; + +$accordion-button-padding-y: $accordion-padding-y !default; +$accordion-button-padding-x: $accordion-padding-x !default; +$accordion-button-color: var(--#{$prefix}body-color) !default; +$accordion-button-bg: var(--#{$prefix}accordion-bg) !default; +$accordion-transition: + $btn-transition, + border-radius 0.15s ease !default; +$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default; +$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default; + +// fusv-disable +$accordion-button-focus-border-color: $input-focus-border-color !default; // Deprecated in v5.3.3 +// fusv-enable +$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default; + +$accordion-icon-width: 1.25rem !default; +$accordion-icon-color: $body-color !default; +$accordion-icon-active-color: $primary-text-emphasis !default; +$accordion-icon-transition: transform 0.2s ease-in-out !default; +$accordion-icon-transform: rotate(-180deg) !default; + +$accordion-button-icon: url("data:image/svg+xml,") !default; +$accordion-button-active-icon: url("data:image/svg+xml,") !default; + +// scss-docs-end accordion-variables + +// Tooltips + +// scss-docs-start tooltip-variables +$tooltip-font-size: $font-size-sm !default; +$tooltip-max-width: 200px !default; +$tooltip-color: var(--#{$prefix}body-bg) !default; +$tooltip-bg: var(--#{$prefix}emphasis-color) !default; +$tooltip-border-radius: var(--#{$prefix}border-radius) !default; +$tooltip-opacity: 0.9 !default; +$tooltip-padding-y: $spacer * 0.25 !default; +$tooltip-padding-x: $spacer * 0.5 !default; +$tooltip-margin: null !default; // TODO: remove this in v6 + +$tooltip-arrow-width: 0.8rem !default; +$tooltip-arrow-height: 0.4rem !default; + +// fusv-disable +$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables +// fusv-enable +// scss-docs-end tooltip-variables + +// Form tooltips must come after regular tooltips +// scss-docs-start tooltip-feedback-variables +$form-feedback-tooltip-padding-y: $tooltip-padding-y !default; +$form-feedback-tooltip-padding-x: $tooltip-padding-x !default; +$form-feedback-tooltip-font-size: $tooltip-font-size !default; +$form-feedback-tooltip-line-height: null !default; +$form-feedback-tooltip-opacity: $tooltip-opacity !default; +$form-feedback-tooltip-border-radius: $tooltip-border-radius !default; + +// scss-docs-end tooltip-feedback-variables + +// Popovers + +// scss-docs-start popover-variables +$popover-font-size: $font-size-sm !default; +$popover-bg: var(--#{$prefix}body-bg) !default; +$popover-max-width: 276px !default; +$popover-border-width: var(--#{$prefix}border-width) !default; +$popover-border-color: var(--#{$prefix}border-color-translucent) !default; +$popover-border-radius: var(--#{$prefix}border-radius-lg) !default; +$popover-inner-border-radius: calc( + #{$popover-border-radius} - #{$popover-border-width} +) !default; // stylelint-disable-line function-disallowed-list +$popover-box-shadow: var(--#{$prefix}box-shadow) !default; + +$popover-header-font-size: $font-size-base !default; +$popover-header-bg: var(--#{$prefix}secondary-bg) !default; +$popover-header-color: $headings-color !default; +$popover-header-padding-y: 0.5rem !default; +$popover-header-padding-x: $spacer !default; + +$popover-body-color: var(--#{$prefix}body-color) !default; +$popover-body-padding-y: $spacer !default; +$popover-body-padding-x: $spacer !default; + +$popover-arrow-width: 1rem !default; +$popover-arrow-height: 0.5rem !default; + +// scss-docs-end popover-variables + +// fusv-disable +// Deprecated in Bootstrap 5.2.0 for CSS variables +$popover-arrow-color: $popover-bg !default; +$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default; + +// fusv-enable + +// Toasts + +// scss-docs-start toast-variables +$toast-max-width: 350px !default; +$toast-padding-x: 0.75rem !default; +$toast-padding-y: 0.5rem !default; +$toast-font-size: 0.875rem !default; +$toast-color: null !default; +$toast-background-color: rgb(var(--#{$prefix}body-bg-rgb), 0.85) !default; +$toast-border-width: var(--#{$prefix}border-width) !default; +$toast-border-color: var(--#{$prefix}border-color-translucent) !default; +$toast-border-radius: var(--#{$prefix}border-radius) !default; +$toast-box-shadow: var(--#{$prefix}box-shadow) !default; +$toast-spacing: $container-padding-x !default; + +$toast-header-color: var(--#{$prefix}secondary-color) !default; +$toast-header-background-color: rgb( + var(--#{$prefix}body-bg-rgb), + 0.85 +) !default; +$toast-header-border-color: $toast-border-color !default; + +// scss-docs-end toast-variables + +// Badges + +// scss-docs-start badge-variables +$badge-font-size: 0.75em !default; +$badge-font-weight: $font-weight-bold !default; +$badge-color: $white !default; +$badge-padding-y: 0.35em !default; +$badge-padding-x: 0.65em !default; +$badge-border-radius: var(--#{$prefix}border-radius) !default; + +// scss-docs-end badge-variables + +// Modals + +// scss-docs-start modal-variables +$modal-inner-padding: $spacer !default; + +$modal-footer-margin-between: 0.5rem !default; + +$modal-dialog-margin: 0.5rem !default; +$modal-dialog-margin-y-sm-up: 1.75rem !default; + +$modal-title-line-height: $line-height-base !default; + +$modal-content-color: var(--#{$prefix}body-color) !default; +$modal-content-bg: var(--#{$prefix}body-bg) !default; +$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default; +$modal-content-border-width: var(--#{$prefix}border-width) !default; +$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default; +$modal-content-inner-border-radius: subtract( + $modal-content-border-radius, + $modal-content-border-width +) !default; +$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default; +$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default; + +$modal-backdrop-bg: $black !default; +$modal-backdrop-opacity: 0.5 !default; + +$modal-header-border-color: var(--#{$prefix}border-color) !default; +$modal-header-border-width: $modal-content-border-width !default; +$modal-header-padding-y: $modal-inner-padding !default; +$modal-header-padding-x: $modal-inner-padding !default; +$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility + +$modal-footer-bg: null !default; +$modal-footer-border-color: $modal-header-border-color !default; +$modal-footer-border-width: $modal-header-border-width !default; + +$modal-sm: 300px !default; +$modal-md: 500px !default; +$modal-lg: 800px !default; +$modal-xl: 1140px !default; + +$modal-fade-transform: translate(0, -50px) !default; +$modal-show-transform: none !default; +$modal-transition: transform 0.3s ease-out !default; +$modal-scale-transform: scale(1.02) !default; + +// scss-docs-end modal-variables + +// Alerts +// +// Define alert colors, border radius, and padding. + +// scss-docs-start alert-variables +$alert-padding-y: $spacer !default; +$alert-padding-x: $spacer !default; +$alert-margin-bottom: 1rem !default; +$alert-border-radius: var(--#{$prefix}border-radius) !default; +$alert-link-font-weight: $font-weight-bold !default; +$alert-border-width: var(--#{$prefix}border-width) !default; +$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side +// scss-docs-end alert-variables + +// fusv-disable +$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6 +$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6 +$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6 +// fusv-enable + +// Progress bars + +// scss-docs-start progress-variables +$progress-height: 1rem !default; +$progress-font-size: $font-size-base * 0.75 !default; +$progress-bg: var(--#{$prefix}secondary-bg) !default; +$progress-border-radius: var(--#{$prefix}border-radius) !default; +$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default; +$progress-bar-color: $white !default; +$progress-bar-bg: $primary !default; +$progress-bar-animation-timing: 1s linear infinite !default; +$progress-bar-transition: width 0.6s ease !default; + +// scss-docs-end progress-variables + +// List group + +// scss-docs-start list-group-variables +$list-group-color: var(--#{$prefix}body-color) !default; +$list-group-bg: var(--#{$prefix}body-bg) !default; +$list-group-border-color: var(--#{$prefix}border-color) !default; +$list-group-border-width: var(--#{$prefix}border-width) !default; +$list-group-border-radius: var(--#{$prefix}border-radius) !default; + +$list-group-item-padding-y: $spacer * 0.5 !default; +$list-group-item-padding-x: $spacer !default; + +// fusv-disable +$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0 +$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0 +// fusv-enable + +$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default; +$list-group-active-color: $component-active-color !default; +$list-group-active-bg: $component-active-bg !default; +$list-group-active-border-color: $list-group-active-bg !default; + +$list-group-disabled-color: var(--#{$prefix}secondary-color) !default; +$list-group-disabled-bg: $list-group-bg !default; + +$list-group-action-color: var(--#{$prefix}secondary-color) !default; +$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default; + +$list-group-action-active-color: var(--#{$prefix}body-color) !default; +$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default; + +// scss-docs-end list-group-variables + +// Image thumbnails + +// scss-docs-start thumbnail-variables +$thumbnail-padding: 0.25rem !default; +$thumbnail-bg: var(--#{$prefix}body-bg) !default; +$thumbnail-border-width: var(--#{$prefix}border-width) !default; +$thumbnail-border-color: var(--#{$prefix}border-color) !default; +$thumbnail-border-radius: var(--#{$prefix}border-radius) !default; +$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default; + +// scss-docs-end thumbnail-variables + +// Figures + +// scss-docs-start figure-variables +$figure-caption-font-size: $small-font-size !default; +$figure-caption-color: var(--#{$prefix}secondary-color) !default; + +// scss-docs-end figure-variables + +// Breadcrumbs + +// scss-docs-start breadcrumb-variables +$breadcrumb-font-size: null !default; +$breadcrumb-padding-y: 0 !default; +$breadcrumb-padding-x: 0 !default; +$breadcrumb-item-padding-x: 0.5rem !default; +$breadcrumb-margin-bottom: 1rem !default; +$breadcrumb-bg: null !default; +$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default; +$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default; +$breadcrumb-divider: '/' !default; +$breadcrumb-divider-flipped: $breadcrumb-divider !default; +$breadcrumb-border-radius: null !default; + +// scss-docs-end breadcrumb-variables + +// Carousel + +// scss-docs-start carousel-variables +$carousel-control-color: $white !default; +$carousel-control-width: 15% !default; +$carousel-control-opacity: 0.5 !default; +$carousel-control-hover-opacity: 0.9 !default; +$carousel-control-transition: opacity 0.15s ease !default; +$carousel-control-icon-filter: null !default; + +$carousel-indicator-width: 30px !default; +$carousel-indicator-height: 3px !default; +$carousel-indicator-hit-area-height: 10px !default; +$carousel-indicator-spacer: 3px !default; +$carousel-indicator-opacity: 0.5 !default; +$carousel-indicator-active-bg: $white !default; +$carousel-indicator-active-opacity: 1 !default; +$carousel-indicator-transition: opacity 0.6s ease !default; + +$carousel-caption-width: 70% !default; +$carousel-caption-color: $white !default; +$carousel-caption-padding-y: 1.25rem !default; +$carousel-caption-spacer: 1.25rem !default; + +$carousel-control-icon-width: 2rem !default; + +$carousel-control-prev-icon-bg: url("data:image/svg+xml,") !default; +$carousel-control-next-icon-bg: url("data:image/svg+xml,") !default; + +$carousel-transition-duration: 0.6s !default; +$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`) +// scss-docs-end carousel-variables + +// scss-docs-start carousel-dark-variables +$carousel-dark-indicator-active-bg: $black !default; // Deprecated in v5.3.4 +$carousel-dark-caption-color: $black !default; // Deprecated in v5.3.4 +$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default; // Deprecated in v5.3.4 +// scss-docs-end carousel-dark-variables + +// Spinners + +// scss-docs-start spinner-variables +$spinner-width: 2rem !default; +$spinner-height: $spinner-width !default; +$spinner-vertical-align: -0.125em !default; +$spinner-border-width: 0.25em !default; +$spinner-animation-speed: 0.75s !default; + +$spinner-width-sm: 1rem !default; +$spinner-height-sm: $spinner-width-sm !default; +$spinner-border-width-sm: 0.2em !default; + +// scss-docs-end spinner-variables + +// Close + +// scss-docs-start close-variables +$btn-close-width: 1em !default; +$btn-close-height: $btn-close-width !default; +$btn-close-padding-x: 0.25em !default; +$btn-close-padding-y: $btn-close-padding-x !default; +$btn-close-color: $black !default; +$btn-close-bg: url("data:image/svg+xml,") !default; +$btn-close-focus-shadow: $focus-ring-box-shadow !default; +$btn-close-opacity: 0.5 !default; +$btn-close-hover-opacity: 0.75 !default; +$btn-close-focus-opacity: 1 !default; +$btn-close-disabled-opacity: 0.25 !default; +$btn-close-filter: null !default; +$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default; // Deprecated in v5.3.4 +// scss-docs-end close-variables + +// Offcanvas + +// scss-docs-start offcanvas-variables +$offcanvas-padding-y: $modal-inner-padding !default; +$offcanvas-padding-x: $modal-inner-padding !default; +$offcanvas-horizontal-width: 400px !default; +$offcanvas-vertical-height: 30vh !default; +$offcanvas-transition-duration: 0.3s !default; +$offcanvas-border-color: $modal-content-border-color !default; +$offcanvas-border-width: $modal-content-border-width !default; +$offcanvas-title-line-height: $modal-title-line-height !default; +$offcanvas-bg-color: var(--#{$prefix}body-bg) !default; +$offcanvas-color: var(--#{$prefix}body-color) !default; +$offcanvas-box-shadow: $modal-content-box-shadow-xs !default; +$offcanvas-backdrop-bg: $modal-backdrop-bg !default; +$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default; + +// scss-docs-end offcanvas-variables + +// Code + +$code-font-size: $small-font-size !default; +$code-color: $pink !default; + +$kbd-padding-y: 0.1875rem !default; +$kbd-padding-x: 0.375rem !default; +$kbd-font-size: $code-font-size !default; +$kbd-color: var(--#{$prefix}body-bg) !default; +$kbd-bg: var(--#{$prefix}body-color) !default; +$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6 + +$pre-color: null !default; diff --git a/src/templates/layout-default.html b/src/templates/layout-default.html deleted file mode 100644 index d528cad..0000000 --- a/src/templates/layout-default.html +++ /dev/null @@ -1,39 +0,0 @@ -{% set seoTitle %} -{% if (seo.title is defined and seo.title | length > 0) - or(title is defined and title | length > 0) %} - {{ (seo.title or title) | striptags }} -{% elseif SITE.seo.title is defined and SITE.seo.title | length > 0 %} -{% endif %} -{{ (SITE.seo.title ) | striptags }} -{% endset %} - - - - - - {{ seoTitle | striptags | trim }} - - - - - {% include "./partials/meta-seo.njk" %} - {% include "./partials/meta-open-graph.njk" %} - {% include "./partials/meta-twitter-cards.njk" %} - {% include "./partials/favicons.njk" %} - - - - {% if pageData.page_id === '404' %} - {% include "./partials/o-header.njk" %} - {% block content404 %}{% endblock %} - {% else %} - {% include "./partials/o-header.njk" %} - {% block content %}{% endblock %} - {% include "./partials/o-footer.njk" %} - {% endif %} - - - - - - diff --git a/src/templates/pages/404.html b/src/templates/pages/404.html deleted file mode 100644 index 53c2f39..0000000 --- a/src/templates/pages/404.html +++ /dev/null @@ -1,34 +0,0 @@ -{% extends "./layout-default.html" %} - -{% set pageData = { - page_id: '404', - template: 'index' -} %} - -{% set open_graph = { - use: 'false' -} %} - -{% set twitter_cards = { - use: 'false' -} %} - -{% set seo = { - title: '404 Page Not Found β€” Gulp DevStack', - robots: 'noindex,follow', - iclude_to_sitemap: 'false' -} %} - -{% block content404 %} - -
-
-

Oops!

-

We can’t seem to find the page you’re looking for.

-

- Error code: 404 -

-
-
- -{% endblock %} diff --git a/src/templates/pages/index.html b/src/templates/pages/index.html deleted file mode 100644 index 54a944a..0000000 --- a/src/templates/pages/index.html +++ /dev/null @@ -1,34 +0,0 @@ -{% extends "./layout-default.html" %} - -{% set pageData = { - page_id: 'home', - template: 'index' -} %} - -{% block content %} - - {% if hero %} -
-
- {% if hero.title is defined and hero.title | length > 0 %} -

{{ hero.title | safe }}

- {% endif %} - {% if hero.excerpt is defined and hero.excerpt | length > 0 %} -
{{ hero.excerpt | md | safe }}
- {% endif %} - {% if hero.content is defined and hero.content | length > 0 %} -
{{ hero.content | md | safe }}
- {% endif %} -
-
- {% endif %} - - {% if body %} -
-
- {{ body | safe }} -
- {% endif %} -
- -{% endblock %} diff --git a/src/templates/partials/meta-open-graph.njk b/src/templates/partials/meta-open-graph.njk deleted file mode 100644 index ca44521..0000000 --- a/src/templates/partials/meta-open-graph.njk +++ /dev/null @@ -1,59 +0,0 @@ -{% if open_graph.use is defined and open_graph.use === true %} - - {% if open_graph.type is defined and open_graph.type | length > 0 %} - - {% elseif SITE.open_graph.type is defined and SITE.open_graph.type | length > 0 %} - - {% endif %} - - {% if SITE.open_graph.app_id is defined and SITE.open_graph.app_id | length > 0 %} - - {% endif %} - - {% if SITE.open_graph.site_name is defined and SITE.open_graph.site_name | length > 0 %} - - {% endif %} - - {% if open_graph.title is defined and open_graph.title | length > 0 %} - - {% elseif seo.title is defined and seo.title | length > 0 %} - - {% elseif title is defined and title | length > 0 %} - - {% endif %} - - {% if open_graph.description is defined and open_graph.description | length > 0 %} - - {% elseif seo.description is defined and seo.description | length > 0 %} - - {% elseif description is defined and description | length > 0 %} - - {% elseif SITE.open_graph.description is defined and SITE.open_graph.description | length > 0 %} - - {% endif %} - - {% if open_graph - .image is defined and open_graph - .image[0] | length > 0 %} - {% for item in open_graph.image %} - {% set loopIndex = loop.index %} - {% if loopIndex == 1 %} - - {# #} - {# #} - {# #} - {% elseif loopIndex <= 9 %} - - {# #} - {# #} - {# #} - {% endif %} - {% endfor %} - {% elseif SITE.open_graph.image is defined and SITE.open_graph.image[0] | length > 0 %} - - - - - {% endif %} - -{% endif %} diff --git a/src/templates/partials/meta-seo.njk b/src/templates/partials/meta-seo.njk deleted file mode 100644 index 768f5f6..0000000 --- a/src/templates/partials/meta-seo.njk +++ /dev/null @@ -1,24 +0,0 @@ -{% if seo.canonical_self is defined and seo.canonical_self | length > 0 %} - -{% endif %} - -{% if canonical is defined and seo.canonical | length > 0 %} - -{% endif %} - -{% if seo.robots is defined and seo.robots | length > 0 %} - -{% elseif SITE.seo.robots is defined and SITE.seo.robots | length > 0 %} - -{% endif %} - -{% if (seo.description is defined and seo.description | length > 0) - or(description is defined and description | length > 0) %} - -{% elseif SITE.seo.description is defined and SITE.seo.description | length > 0 %} - -{% endif %} - -{% if SITE.meta.author is defined and SITE.meta.author | length > 0 %} - -{% endif %} \ No newline at end of file diff --git a/src/templates/partials/meta-twitter-cards.njk b/src/templates/partials/meta-twitter-cards.njk deleted file mode 100644 index 1c43e06..0000000 --- a/src/templates/partials/meta-twitter-cards.njk +++ /dev/null @@ -1,54 +0,0 @@ -{% if twitter_cards.use is defined and twitter_cards.use === true %} - - {% if twitter_cards.type is defined and twitter_cards.type | length > 0 %} - - {% elseif SITE.twitter_cards.type is defined and SITE.twitter_cards.type | length > 0 %} - - {% endif %} - - {% if SITE.twitter_cards.site is defined and SITE.twitter_cards.site | length > 0 %} - - {% endif %} - - {% if SITE.twitter_cards.creator is defined and SITE.twitter_cards.creator | length > 0 %} - - {% endif %} - - {% if twitter_cards.title is defined and twitter_cards.title | length > 0 %} - - {% endif %} - {% if not open_graph.title is defined and not open_graph.title | length > 0 %} - {% if seo.title is defined and seo.title | length > 0 %} - - {% elseif title is defined and title | length > 0 %} - - {% endif %} - {% endif %} - - {% if twitter_cards.description is defined and twitter_cards.description | length > 0 %} - - {% endif %} - {% if not open_graph.description is defined and not open_graph.description | length > 0 %} - {% if seo.description is defined and seo.description | length > 0 %} - - {% elseif description is defined and description | length > 0 %} - - {% endif %} - {% endif %} - - {% if twitter_cards - .image is defined and twitter_cards - .image[0] | length > 0 %} - {% for item in twitter_cards.image %} - {% set loopIndex = loop.index %} - {% if loopIndex == 1 %} - - {% elseif loopIndex <= 9 %} - - {% endif %} - {% endfor %} - {% elseif SITE.twitter_cards.image is defined and SITE.twitter_cards.image[0] | length > 0 %} - - {% endif %} - -{% endif %} diff --git a/src/templates/partials/o-footer.njk b/src/templates/partials/o-footer.njk deleted file mode 100644 index 21f8ef4..0000000 --- a/src/templates/partials/o-footer.njk +++ /dev/null @@ -1,5 +0,0 @@ -
-
- -
-
diff --git a/src/templates/partials/o-header.njk b/src/templates/partials/o-header.njk deleted file mode 100644 index 60de247..0000000 --- a/src/templates/partials/o-header.njk +++ /dev/null @@ -1,39 +0,0 @@ -{% set navItems = { - menu: [ - { - name: 'Home', - page_id: 'home', - url: '/' - } - ] -} %} - -
-
- -
-
\ No newline at end of file diff --git a/static/CNAME b/static/CNAME deleted file mode 100644 index 50327d0..0000000 --- a/static/CNAME +++ /dev/null @@ -1 +0,0 @@ -gulp-devstack.cebre.us \ No newline at end of file diff --git a/static/assets/images/gulp-devstack-open-graph.png b/static/assets/images/gulp-devstack-open-graph.png deleted file mode 100644 index 097c5fd..0000000 Binary files a/static/assets/images/gulp-devstack-open-graph.png and /dev/null differ diff --git a/static/humans.txt b/static/humans.txt deleted file mode 100644 index b5d0681..0000000 --- a/static/humans.txt +++ /dev/null @@ -1,15 +0,0 @@ -/* TEAM */ - - Frontend developer: Jaroslav VrΓ‘na - Site: https://www.cebre.us/ - Twitter: @cebreus69 - From: Brno, Czech Republic - - -/* SITE */ - - Last update: 2021/21/11 - Language: English - Doctype: HTML5 - Standards: HTML5, CSS3, BEM - IDE: VS Code diff --git a/static/robots.txt b/static/robots.txt deleted file mode 100644 index 651fb97..0000000 --- a/static/robots.txt +++ /dev/null @@ -1,4 +0,0 @@ -User-agent: * -Allow: /*.*? - -# Sitemap: https://gulp-devstack.cebre.us/sitemap.xml diff --git a/tests/e2e/dev-watch.test.js b/tests/e2e/dev-watch.test.js new file mode 100644 index 0000000..895dd2e --- /dev/null +++ b/tests/e2e/dev-watch.test.js @@ -0,0 +1,220 @@ +import assert from 'node:assert/strict' +import { spawn } from 'node:child_process' +import fs from 'node:fs/promises' +import path from 'node:path' +import process from 'node:process' +import { afterEach, describe, it } from 'node:test' +import { setTimeout as delay } from 'node:timers/promises' +import { chromium } from '@playwright/test' + +import { + cleanupSandbox, + createTestSandbox, + linkNodeModulesIntoSandbox, +} from '../test-helpers.js' + +const START_TIMEOUT_MS = 60000 +const RELOAD_TIMEOUT_MS = 30000 +const SHOWCASE_HEADING = 'What this project offers.' +const SHOWCASE_UPDATED_HEADING = 'What this project offers right now.' +const BLANK_HEADING = 'It works!' +const BLANK_UPDATED_HEADING = 'It works right now!' + +async function copyProjectFixture(sandboxPath) { + await Promise.all([ + fs.cp(path.resolve('gulp'), path.join(sandboxPath, 'gulp'), { + recursive: true, + }), + fs.cp(path.resolve('src'), path.join(sandboxPath, 'src'), { + recursive: true, + }), + fs.cp(path.resolve('public'), path.join(sandboxPath, 'public'), { + recursive: true, + force: true, + errorOnExist: false, + }), + fs.copyFile( + path.resolve('gulpfile.js'), + path.join(sandboxPath, 'gulpfile.js') + ), + fs.copyFile( + path.resolve('package.json'), + path.join(sandboxPath, 'package.json') + ), + ]) + await linkNodeModulesIntoSandbox(sandboxPath) +} + +async function waitForServer(url, childProcess, output) { + const deadline = Date.now() + START_TIMEOUT_MS + + while (Date.now() < deadline) { + if (childProcess.exitCode !== null) { + throw new Error( + `Dev server exited before becoming ready.\n${output.join('')}` + ) + } + + try { + const response = await fetch(url) + if (response.ok) { + return + } + } catch {} + + await delay(250) + } + + throw new Error(`Timed out waiting for ${url}.\n${output.join('')}`) +} + +async function stopProcess(childProcess) { + if (!childProcess || childProcess.exitCode !== null) { + return + } + + childProcess.kill('SIGTERM') + + const deadline = Date.now() + 5000 + while (childProcess.exitCode === null && Date.now() < deadline) { + await delay(100) + } + + if (childProcess.exitCode === null) { + childProcess.kill('SIGKILL') + } +} + +async function resolveWatchTarget(sandboxPath) { + const showcaseTemplatePath = path.join( + sandboxPath, + 'src/routes/about/index.njk' + ) + + try { + const showcaseTemplate = await fs.readFile(showcaseTemplatePath, 'utf8') + if (showcaseTemplate.includes(SHOWCASE_HEADING)) { + return { + urlPath: '/about/', + templatePath: showcaseTemplatePath, + originalHeading: SHOWCASE_HEADING, + updatedHeading: SHOWCASE_UPDATED_HEADING, + } + } + } catch {} + + const homepageTemplatePath = path.join(sandboxPath, 'src/routes/index.njk') + const homepageTemplate = await fs.readFile(homepageTemplatePath, 'utf8') + + if (homepageTemplate.includes(BLANK_HEADING)) { + return { + urlPath: '/', + templatePath: homepageTemplatePath, + originalHeading: BLANK_HEADING, + updatedHeading: BLANK_UPDATED_HEADING, + templateContent: homepageTemplate, + } + } + + const homepageDataPath = path.join(sandboxPath, 'src/routes/index.md') + const homepageData = await fs.readFile(homepageDataPath, 'utf8') + + return { + urlPath: '/', + templatePath: homepageDataPath, + originalHeading: BLANK_HEADING, + updatedHeading: BLANK_UPDATED_HEADING, + templateContent: homepageData, + } +} + +describe('E2E: Dev Watch Reload', { timeout: 120000 }, () => { + const sandboxesToCleanup = [] + + afterEach(async () => { + while (sandboxesToCleanup.length > 0) { + await cleanupSandbox(sandboxesToCleanup.pop()) + } + }) + + it('should rebuild Nunjucks pages and refresh the browser after saving', async () => { + const sandboxPath = await createTestSandbox('dev-watch') + sandboxesToCleanup.push(sandboxPath) + await copyProjectFixture(sandboxPath) + + const watchTarget = await resolveWatchTarget(sandboxPath) + const gulpBinPath = path.resolve('node_modules/gulp/bin/gulp.js') + const port = 3300 + Math.floor(Math.random() * 300) + const baseUrl = `http://127.0.0.1:${port}` + const childOutput = [] + + const devProcess = spawn(process.execPath, [gulpBinPath, 'dev'], { + cwd: sandboxPath, + env: { + ...process.env, + BUILD_MODE: 'dev', + BROWSERSYNC_PORT: String(port), + BROWSERSYNC_OPEN: 'false', + GULP_OUT_DIR: path.join(sandboxPath, 'build-dev'), + GULP_TEMP_DIR: path.join(sandboxPath, '.temp'), + }, + stdio: ['ignore', 'pipe', 'pipe'], + }) + + devProcess.stdout.on('data', (chunk) => { + childOutput.push(String(chunk)) + }) + devProcess.stderr.on('data', (chunk) => { + childOutput.push(String(chunk)) + }) + + const browser = await chromium.launch() + + try { + await waitForServer( + `${baseUrl}${watchTarget.urlPath}`, + devProcess, + childOutput + ) + + const page = await browser.newPage() + await page.goto(`${baseUrl}${watchTarget.urlPath}`, { + waitUntil: 'networkidle', + }) + await page.waitForFunction( + (text) => document.body.innerText.includes(text), + watchTarget.originalHeading + ) + + const template = + watchTarget.templateContent || + (await fs.readFile(watchTarget.templatePath, 'utf8')) + assert.ok( + template.includes(watchTarget.originalHeading), + `Fixture heading "${watchTarget.originalHeading}" was not found in sandbox template.` + ) + + await fs.writeFile( + watchTarget.templatePath, + template.replace( + watchTarget.originalHeading, + watchTarget.updatedHeading + ) + ) + + await page.waitForFunction( + (text) => document.body.innerText.includes(text), + watchTarget.updatedHeading, + { timeout: RELOAD_TIMEOUT_MS } + ) + + const renderedText = await page.locator('body').innerText() + assert.match(renderedText, new RegExp(watchTarget.updatedHeading)) + + await page.close() + } finally { + await browser.close() + await stopProcess(devProcess) + } + }) +}) diff --git a/tests/e2e/docs-sync.test.js b/tests/e2e/docs-sync.test.js new file mode 100644 index 0000000..af067c4 --- /dev/null +++ b/tests/e2e/docs-sync.test.js @@ -0,0 +1,64 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import { describe, it } from 'node:test' +import { glob } from 'glob' + +describe('Documentation Synchronization', () => { + it('should ensure all pnpm scripts mentioned in markdown exist in package.json', async () => { + const pkgContent = await fs.readFile('package.json', 'utf8') + const packageJson = JSON.parse(pkgContent) + const scripts = Object.keys(packageJson.scripts) + const standardCmds = new Set([ + 'install', + 'add', + 'i', + 'exec', + '-', + 'allowBuilds', + 'Overrides', + 'will', + ]) + + // Find all markdown files, ignoring node_modules, build folders, and sandboxes + const mdFiles = await glob('**/*.md', { + ignore: [ + 'node_modules/**', + 'build-*/**', + 'tests/.sandboxes/**', + 'graphify-out/**', + '.fallow/**', + ], + }) + + const regex = /pnpm\s+(?:run\s+)?([a-zA-Z0-9:-]+)/g + let hasError = false + + for (const file of mdFiles) { + const content = await fs.readFile(file, 'utf8') + let match + + while ((match = regex.exec(content)) !== null) { + const scriptName = match[1] + + // Skip standard pnpm commands or placeholder text + if (standardCmds.has(scriptName)) { + continue + } + + const exists = scripts.includes(scriptName) + + if (!exists) { + console.error( + `Documentation out of sync: File "${file}" mentions script "pnpm ${scriptName}" but "${scriptName}" is not defined in package.json.` + ) + hasError = true + } + } + } + + assert.ok( + !hasError, + 'Found npm scripts mentioned in documentation that do not exist in package.json.' + ) + }) +}) diff --git a/tests/e2e/page-asset-filter.js b/tests/e2e/page-asset-filter.js new file mode 100644 index 0000000..68e7230 --- /dev/null +++ b/tests/e2e/page-asset-filter.js @@ -0,0 +1,7 @@ +export function isCriticalPageAsset(url) { + if (typeof url !== 'string' || url.length === 0) { + return false + } + + return /\.(css|js)(?:[?#]|$)/u.test(url) +} diff --git a/tests/e2e/page-link-report.js b/tests/e2e/page-link-report.js new file mode 100644 index 0000000..48531a6 --- /dev/null +++ b/tests/e2e/page-link-report.js @@ -0,0 +1,13 @@ +export function formatBrokenLinksReport(brokenLinks) { + if (brokenLinks.length === 0) { + return 'Found 0 broken links/anchors.' + } + + const details = brokenLinks + .map((link) => { + return `- ${link.url} (Status: ${link.status}) found on ${link.parent}` + }) + .join('\n') + + return `Found ${brokenLinks.length} broken links/anchors.\n${details}` +} diff --git a/tests/e2e/pages.test.js b/tests/e2e/pages.test.js new file mode 100644 index 0000000..da0472b --- /dev/null +++ b/tests/e2e/pages.test.js @@ -0,0 +1,213 @@ +import assert from 'node:assert/strict' +import { execSync } from 'node:child_process' +import fs from 'node:fs' +import path from 'node:path' +import { after, afterEach, before, beforeEach, describe, it } from 'node:test' +import AxeBuilder from '@axe-core/playwright' +import { chromium } from '@playwright/test' +import bs from 'browser-sync' +import { LinkChecker } from 'linkinator' + +import { resolveConfig } from '../../gulp/config.js' +import { isCriticalPageAsset } from './page-asset-filter.js' + +let BASE_URL = process.env.E2E_BASE_URL + ? process.env.E2E_BASE_URL.replace(/\/$/, '') + : null + +let localServer = null +let browser = null +let context = null +let clientErrors = [] + +// E2E Hooks +before(async () => { + browser = await chromium.launch() + context = await browser.newContext() + + if (!BASE_URL) { + const mode = process.env.BUILD_MODE || 'build' + const config = resolveConfig(mode) + const buildDir = path.resolve(config.paths.build) + + if (!fs.existsSync(buildDir)) { + console.log( + `[E2E] ${mode} build not found in ${buildDir}. Running JIT build...` + ) + const buildScript = mode === 'export' ? 'export' : 'build' + execSync(`pnpm run ${buildScript}`, { + stdio: 'inherit', + env: { ...process.env, BUILD_MODE: mode }, + }) + } + + console.log(`[E2E] Starting test server for ${mode} artifacts...`) + localServer = bs.create() + await new Promise((resolve, reject) => { + localServer.init( + { + server: { + baseDir: buildDir, + serveStaticOptions: { extensions: ['html'] }, + }, + port: 3000, + open: false, + notify: false, + ui: false, + logLevel: 'silent', + }, + (err, bsInstance) => { + if (err) { + return reject(err) + } + const actualPort = bsInstance.options.get('port') + if (actualPort !== 3000) { + localServer.exit() + return reject( + new Error( + `[E2E] Port 3000 is required but busy (used port ${actualPort} instead). Please stop any other processes using port 3000 (like 'gulp dev') before running E2E tests.` + ) + ) + } + BASE_URL = `http://localhost:${actualPort}` + resolve() + } + ) + }) + } + + context.on('page', (page) => { + page.on('pageerror', (error) => { + clientErrors.push(`[PageError] ${error.message}`) + }) + page.on('console', (msg) => { + if ( + msg.type() === 'error' && + !msg.text().includes('Failed to load resource') + ) { + clientErrors.push(`[ConsoleError] ${msg.text()}`) + } + }) + }) +}) + +beforeEach(() => { + clientErrors = [] +}) + +afterEach(() => { + assert.strictEqual( + clientErrors.length, + 0, + `Unexpected client errors found: ${clientErrors.join(', ')}` + ) +}) + +after(async () => { + if (localServer) { + localServer.exit() + } + if (browser) { + await browser.close() + } +}) + +describe('E2E: Baseline Integrity (Universal)', { timeout: 120000 }, () => { + it('should serve the homepage with HTTP 200', async () => { + const page = await context.newPage() + const response = await page.goto(`${BASE_URL}/`) + assert.strictEqual(response.status(), 200) + await page.close() + }) + + it('should pass WCAG accessibility audit', async () => { + const page = await context.newPage() + await page.goto(`${BASE_URL}/`) + const results = await new AxeBuilder({ page }).analyze() + assert.strictEqual( + results.violations.length, + 0, + JSON.stringify(results.violations, null, 2) + ) + await page.close() + }) + + it('should have a valid title', async () => { + const page = await context.newPage() + await page.goto(`${BASE_URL}/`) + const title = await page.title() + assert.ok(title.length > 5, 'Page title is too short or missing') + await page.close() + }) + + it('should load CSS and JS without 404s', async () => { + const page = await context.newPage() + const requests = [] + page.on('request', (request) => requests.push(request)) + + await page.goto(`${BASE_URL}/`) + + const assets = requests.filter((req) => isCriticalPageAsset(req.url())) + for (const asset of assets) { + const response = await asset.response() + assert.strictEqual( + response.status(), + 200, + `Critical asset failed to load: ${asset.url()}` + ) + } + await page.close() + }) +}) + +describe('E2E: Blank Template Features', { timeout: 120000 }, () => { + it('should render the "It works!" greeting', async () => { + const page = await context.newPage() + await page.goto(`${BASE_URL}/`) + + const h1 = await page.locator('h1').textContent() + assert.ok(h1.includes('It works!'), 'Blank template greeting not found') + + await page.close() + }) + + it('should have a clean layout without showcase artifacts', async () => { + const page = await context.newPage() + await page.goto(`${BASE_URL}/`) + + // Check for old showcase-specific classes or components + const bentoCount = await page.locator('.u-bento-grid').count() + assert.strictEqual(bentoCount, 0, 'Showcase Bento grid should be gone') + + const headerCount = await page.locator('.o-header').count() + assert.strictEqual(headerCount, 0, 'Showcase header should be gone') + + await page.close() + }) +}) + +describe('E2E: Deep Link Integrity', { timeout: 120000 }, () => { + it('should have no broken internal links or anchors', async () => { + const checker = new LinkChecker() + + const result = await checker.check({ + path: BASE_URL, + recurse: true, + linksToSkip: [ + 'https://img.shields.io', + 'https://app.codacy.com', + 'https://github.com', + 'https://getbootstrap.com', + 'https://mozilla.github.io/nunjucks', + 'https://gulp-devstack.cebre.us', + ], + }) + + const brokenLinks = result.links.filter((x) => x.state === 'BROKEN') + assert.strictEqual( + brokenLinks.length, + 0, + `Found broken links: ${brokenLinks.map((l) => l.url).join(', ')}` + ) + }) +}) diff --git a/tests/fixtures/images/mismatched-extension.jpg b/tests/fixtures/images/mismatched-extension.jpg new file mode 100644 index 0000000..520f3f0 Binary files /dev/null and b/tests/fixtures/images/mismatched-extension.jpg differ diff --git a/tests/fixtures/images/synt-corrupted-signature.png b/tests/fixtures/images/synt-corrupted-signature.png new file mode 100644 index 0000000..7ff45d8 Binary files /dev/null and b/tests/fixtures/images/synt-corrupted-signature.png differ diff --git a/tests/fixtures/images/synt-metadata-heavy.png b/tests/fixtures/images/synt-metadata-heavy.png new file mode 100644 index 0000000..c128ab0 Binary files /dev/null and b/tests/fixtures/images/synt-metadata-heavy.png differ diff --git a/tests/fixtures/images/synt-not-png.png b/tests/fixtures/images/synt-not-png.png new file mode 100644 index 0000000..5e525bb --- /dev/null +++ b/tests/fixtures/images/synt-not-png.png @@ -0,0 +1 @@ +This is a text file that pretends to be a PNG. \ No newline at end of file diff --git a/tests/integration/assets.test.js b/tests/integration/assets.test.js new file mode 100644 index 0000000..9c1adba --- /dev/null +++ b/tests/integration/assets.test.js @@ -0,0 +1,78 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import generateRevision from '../../gulp/tasks/generate-revision.js' +import generateSri from '../../gulp/tasks/generate-sri.js' +import { streamToPromise } from '../../gulp/utils/index.js' +import { runInSandbox, silenceConsole, writeFixtures } from '../test-helpers.js' + +silenceConsole(beforeEach, afterEach, mock) + +describe('Asset Pipeline Integration', () => { + it('should fingerprint assets and update HTML references', async () => { + await runInSandbox('assets-revision', async (sandbox) => { + const testDir = path.join(sandbox, 'revision-test') + const buildBase = path.join(testDir, 'build') + const manifestPath = path.join(testDir, 'rev-manifest.json') + + const assetFixtures = { + 'build/assets/css/style.css': 'body { color: red; }', + 'build/index.html': + '', + } + await writeFixtures(testDir, assetFixtures) + + const results = await generateRevision({ + inputAssets: [path.join(buildBase, '**/*.css').replace(/\\/g, '/')], + inputHtml: [path.join(buildBase, '**/*.html').replace(/\\/g, '/')], + buildBase, + manifestPath, + }) + + const manifestContent = await fs.readFile(manifestPath, 'utf8') + const manifest = JSON.parse(manifestContent) + const revisionedName = manifest['assets/css/style.css'] + assert.ok(revisionedName.includes('style-')) + + await assert.rejects( + async () => { + await fs.access(path.join(buildBase, 'assets/css/style.css')) + }, + { code: 'ENOENT' } + ) + + const updatedHtmlContent = await fs.readFile( + path.join(buildBase, 'index.html'), + 'utf8' + ) + assert.ok(updatedHtmlContent.includes(revisionedName)) + }) + }) + + it('should inject SRI hashes into HTML', async () => { + await runInSandbox('assets-sri', async (sandbox) => { + const testDir = path.join(sandbox, 'sri-test') + const buildBase = path.join(testDir, 'build') + const sriFixtures = { + 'build/assets/js/app.js': 'console.log("hello");', + 'build/index.html': + '', + } + await writeFixtures(testDir, sriFixtures) + + const stream = await generateSri( + path.join(buildBase, '**/*.html').replace(/\\/g, '/'), + buildBase + ) + await streamToPromise(stream) + + const updatedHtmlContent = await fs.readFile( + path.join(buildBase, 'index.html'), + 'utf8' + ) + assert.ok(updatedHtmlContent.includes('integrity="sha384-')) + }) + }) +}) diff --git a/tests/integration/clean-build.test.js b/tests/integration/clean-build.test.js new file mode 100644 index 0000000..34923ec --- /dev/null +++ b/tests/integration/clean-build.test.js @@ -0,0 +1,89 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, beforeEach, describe, it } from 'node:test' + +import cleanBuild from '../../gulp/tasks/clean-build.js' + +describe('Clean Build Task', () => { + let testDir + + beforeEach(async () => { + testDir = await fs.mkdtemp(path.join(os.tmpdir(), 'clean-build-')) + }) + + afterEach(async () => { + await fs.rm(testDir, { recursive: true, force: true }) + }) + + it('should delete existing files and directories', async () => { + const fileToDelete = path.join(testDir, 'to-delete.txt') + const dirToDelete = path.join(testDir, 'to-delete-dir') + const nestedFile = path.join(dirToDelete, 'nested.txt') + + // Create test structure + await fs.mkdir(testDir, { recursive: true }) + await fs.writeFile(fileToDelete, 'content') + await fs.mkdir(dirToDelete, { recursive: true }) + await fs.writeFile(nestedFile, 'nested content') + + // Verify files exist before cleaning + assert.ok( + await fs + .access(fileToDelete) + .then(() => true) + .catch(() => false), + 'File should exist before cleaning' + ) + assert.ok( + await fs + .access(dirToDelete) + .then(() => true) + .catch(() => false), + 'Directory should exist before cleaning' + ) + + // Run clean + const deleted = await cleanBuild([fileToDelete, dirToDelete]) + + // Verify files are deleted + assert.ok( + await fs + .access(fileToDelete) + .then(() => false) + .catch(() => true), + 'File should be deleted' + ) + assert.ok( + await fs + .access(dirToDelete) + .then(() => false) + .catch(() => true), + 'Directory should be deleted' + ) + + // Verify return value + assert.deepStrictEqual( + deleted.map((p) => path.relative(process.cwd(), p)).sort(), + [fileToDelete, dirToDelete] + .map((p) => path.relative(process.cwd(), p)) + .sort() + ) + }) + + it('should return empty array for empty paths', async () => { + const deleted = await cleanBuild([]) + assert.deepStrictEqual(deleted, []) + + const deleted2 = await cleanBuild(null) + assert.deepStrictEqual(deleted2, []) + }) + + it('should handle non-existent paths gracefully', async () => { + const nonExistent = path.join(testDir, 'does-not-exist.txt') + const deleted = await cleanBuild(nonExistent) + // deleteAsync should return empty array for non-existent paths + assert.deepStrictEqual(deleted, []) + }) +}) diff --git a/tests/integration/copy-static.test.js b/tests/integration/copy-static.test.js new file mode 100644 index 0000000..a0bdfcd --- /dev/null +++ b/tests/integration/copy-static.test.js @@ -0,0 +1,134 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, beforeEach, describe, it } from 'node:test' + +import copyStatic from '../../gulp/tasks/copy-static.js' + +describe('Copy Static Task', () => { + let srcDir + let destDir + + beforeEach(async () => { + const sandbox = await fs.mkdtemp(path.join(os.tmpdir(), 'copy-static-')) + srcDir = path.join(sandbox, 'src') + destDir = path.join(sandbox, 'dest') + }) + + afterEach(async () => { + await fs.rm(path.dirname(srcDir), { recursive: true, force: true }) + }) + + it('should copy files from source to destination', async () => { + const testFile = path.join(srcDir, 'test.txt') + const nestedDir = path.join(srcDir, 'nested') + const nestedFile = path.join(nestedDir, 'nested.txt') + + // Create source files + await fs.mkdir(srcDir, { recursive: true }) + await fs.writeFile(testFile, 'Hello World') + await fs.mkdir(nestedDir, { recursive: true }) + await fs.writeFile(nestedFile, 'Nested Content') + + // Run copy task + await copyStatic( + path.join(srcDir, '**/*').replace(/\\/g, '/'), + srcDir, + destDir + ) + + // Verify files were copied + const copiedTestFile = path.join(destDir, 'test.txt') + const copiedNestedFile = path.join(destDir, 'nested', 'nested.txt') + + assert.ok( + await fs + .access(copiedTestFile) + .then(() => true) + .catch(() => false), + 'Test file should be copied' + ) + assert.ok( + await fs + .access(copiedNestedFile) + .then(() => true) + .catch(() => false), + 'Nested file should be copied' + ) + + // Verify content + const testContent = await fs.readFile(copiedTestFile, 'utf8') + assert.strictEqual(testContent, 'Hello World') + + const nestedContent = await fs.readFile(copiedNestedFile, 'utf8') + assert.strictEqual(nestedContent, 'Nested Content') + }) + + it('should filter out private files', async () => { + // Create source files including private ones + await fs.mkdir(srcDir, { recursive: true }) + await fs.writeFile(path.join(srcDir, 'public.txt'), 'Public') + await fs.writeFile(path.join(srcDir, '_private.txt'), 'Private') + await fs.writeFile(path.join(srcDir, '__hidden.txt'), 'Hidden') + await fs.mkdir(path.join(srcDir, 'subdir'), { recursive: true }) + await fs.writeFile( + path.join(srcDir, 'subdir', '_private.txt'), + 'Private in subdir' + ) + await fs.writeFile( + path.join(srcDir, 'subdir', 'public.txt'), + 'Public in subdir' + ) + + // Run copy task + await copyStatic( + path.join(srcDir, '**/*').replace(/\\/g, '/'), + srcDir, + destDir + ) + + // Verify only non-private files were copied + const publicFile = path.join(destDir, 'public.txt') + const subdirPublicFile = path.join(destDir, 'subdir', 'public.txt') + const privateFile = path.join(destDir, '_private.txt') + const hiddenFile = path.join(destDir, '__hidden.txt') + const subdirPrivateFile = path.join(destDir, 'subdir', '_private.txt') + + assert.ok( + await fs + .access(publicFile) + .then(() => true) + .catch(() => false), + 'Public file should be copied' + ) + assert.ok( + await fs + .access(subdirPublicFile) + .then(() => true) + .catch(() => false), + 'Public file in subdir should be copied' + ) + assert.ok( + await fs + .access(privateFile) + .then(() => false) + .catch(() => true), + 'Private file should NOT be copied' + ) + assert.ok( + await fs + .access(hiddenFile) + .then(() => false) + .catch(() => true), + 'Hidden file should NOT be copied' + ) + assert.ok( + await fs + .access(subdirPrivateFile) + .then(() => false) + .catch(() => true), + 'Private file in subdir should NOT be copied' + ) + }) +}) diff --git a/tests/integration/debug.test.js b/tests/integration/debug.test.js new file mode 100644 index 0000000..4dc1ad2 --- /dev/null +++ b/tests/integration/debug.test.js @@ -0,0 +1,100 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import { resolveConfig } from '../../gulp/config.js' +import debugBuild from '../../gulp/tasks/debug-build.js' +import { runInSandbox, silenceConsole } from '../test-helpers.js' + +silenceConsole(beforeEach, afterEach, mock) + +describe('Debug Task (Integration)', () => { + let mockConsoleWarn + let mockConsoleError + + beforeEach(() => { + mockConsoleWarn = mock.method(console, 'warn', () => {}) + mockConsoleError = mock.method(console, 'error', () => {}) + }) + + afterEach(() => { + mockConsoleWarn.mock.restore() + mockConsoleError.mock.restore() + }) + + it('should run diagnostic without crashing when files exist', async () => { + await runInSandbox('debug-exists', async (sandbox) => { + const routesDir = path.join(sandbox, 'src/routes') + const buildDir = path.join(sandbox, 'build-dev') + + fs.mkdirSync(routesDir, { recursive: true }) + fs.mkdirSync(buildDir, { recursive: true }) + + fs.writeFileSync(path.join(routesDir, 'index.njk'), '') + fs.writeFileSync(path.join(buildDir, 'index.html'), '') + + await debugBuild(resolveConfig('dev'), { + routesBaseOverride: routesDir, + buildBaseOverride: buildDir, + }) + + // When index.html exists, debugBuild must not emit any console.error calls + assert.strictEqual( + mockConsoleError.mock.calls.length, + 0, + 'No errors should be emitted when all expected files exist' + ) + // debugBuild only calls logger.warn on missing-path branches; the happy path + // (routes dir exists, build dir exists, index.html present) has no warn-level calls. + assert.strictEqual( + mockConsoleWarn.mock.calls.length, + 0, + 'No warnings should be emitted when all expected files exist' + ) + }) + }) + + it('should warn when build directory is present but index.html is missing', async () => { + await runInSandbox('debug-missing-index', async (sandbox) => { + const routesDir = path.join(sandbox, 'src/routes') + const buildDir = path.join(sandbox, 'build-dev') + + fs.mkdirSync(routesDir, { recursive: true }) + fs.mkdirSync(buildDir, { recursive: true }) + // routes dir has a file, but build has no index.html + fs.writeFileSync(path.join(routesDir, 'index.njk'), '') + + await debugBuild(resolveConfig('dev'), { + routesBaseOverride: routesDir, + buildBaseOverride: buildDir, + }) + + // debugBuild calls logger.error when index.html is missing in build dir + assert.ok( + mockConsoleError.mock.calls.length > 0, + 'Should emit a console.error when index.html is missing from build dir' + ) + }) + }) + + it('should warn when source routes directory is missing', async () => { + await runInSandbox('debug-missing-routes', async (sandbox) => { + const routesDir = path.join(sandbox, 'nonexistent-routes') + const buildDir = path.join(sandbox, 'build-dev') + + fs.mkdirSync(buildDir, { recursive: true }) + + await debugBuild(resolveConfig('dev'), { + routesBaseOverride: routesDir, + buildBaseOverride: buildDir, + }) + + // debugBuild calls logger.warn when routes base is missing + assert.ok( + mockConsoleWarn.mock.calls.length > 0, + 'Should emit a console.warn when routes directory does not exist' + ) + }) + }) +}) diff --git a/tests/integration/fonts.test.js b/tests/integration/fonts.test.js new file mode 100644 index 0000000..1b070bd --- /dev/null +++ b/tests/integration/fonts.test.js @@ -0,0 +1,69 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import processFonts from '../../gulp/tasks/process-fonts.js' +import { runInSandbox, silenceConsole } from '../test-helpers.js' + +silenceConsole(beforeEach, afterEach, mock) + +describe('Fonts Task (Integration)', () => { + let mockConsoleWarn + + beforeEach(() => { + mockConsoleWarn = mock.method(console, 'warn', () => {}) + }) + + afterEach(() => { + mockConsoleWarn.mock.restore() + }) + it('should skip processing if input or outputDir are missing', async () => { + await assert.doesNotReject(async () => { + await processFonts(null, null) + }) + // Guard-clause path: warn must have been emitted and no output directory created + assert.ok( + mockConsoleWarn.mock.calls.length > 0, + 'processFonts should emit a warn when called with null parameters' + ) + }) + + it('should skip processing if font definition file is empty', async () => { + await runInSandbox('fonts-empty', async (sandbox) => { + const input = path.join(sandbox, 'empty.list') + const output = path.join(sandbox, 'dist-empty') + fs.writeFileSync(input, '') + + await processFonts(input, output) + + assert.strictEqual(fs.existsSync(output), false) + }) + }) + + it('should identify when fonts are up to date and skip', async () => { + await runInSandbox('fonts-cached', async (sandbox) => { + const inputPath = path.join(sandbox, 'fonts-up-to-date.list') + const outputDir = path.join(sandbox, 'dist-cached') + const fontsOutputDir = path.join(outputDir, 'assets/fonts') + const cssOutputPath = path.join(outputDir, 'assets/css/fonts.css') + + fs.mkdirSync(fontsOutputDir, { recursive: true }) + fs.mkdirSync(path.dirname(cssOutputPath), { recursive: true }) + + fs.writeFileSync(inputPath, 'Inter:400') + fs.writeFileSync(cssOutputPath, '/* cached css */') + fs.writeFileSync(path.join(fontsOutputDir, 'inter.woff2'), 'binary') + + const now = new Date() + const past = new Date(now.getTime() - 10000) + fs.utimesSync(inputPath, past, past) + fs.utimesSync(cssOutputPath, now, now) + + await processFonts(inputPath, outputDir) + + const cachedContent = fs.readFileSync(cssOutputPath, 'utf8') + assert.strictEqual(cachedContent, '/* cached css */') + }) + }) +}) diff --git a/tests/integration/full-build.test.js b/tests/integration/full-build.test.js new file mode 100644 index 0000000..63f3bda --- /dev/null +++ b/tests/integration/full-build.test.js @@ -0,0 +1,111 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' +import { setTimeout as sleep } from 'node:timers/promises' + +import { runInSandbox, silenceConsole, writeFixtures } from '../test-helpers.js' + +silenceConsole(beforeEach, afterEach, mock) + +describe('Full Build Pipeline (E2E Integration)', () => { + it( + 'should complete a full production build without errors', + { timeout: 30000 }, + async () => { + await runInSandbox('full-build-e2e', async (sandboxPath) => { + process.env.BUILD_MODE = 'build' + process.env.GULP_OUT_DIR = path.join(sandboxPath, 'build-prod') + process.env.GULP_SKIP_INTEGRITY = 'true' + + const projectFixtures = { + 'src/routes/index.md': '---\ntitle: Home\n---\n# Welcome', + 'src/routes/index.njk': + '{% extends "layout-default.njk" %}{% block content %}{{ page.content | md }}{% endblock %}', + 'src/routes/layout-default.njk': + '{% block content %}{% endblock %}', + 'src/scss/main.scss': 'body { color: red; margin: 0; padding: 0; }', + 'src/scss/custom.scss': 'a { text-decoration: none; color: blue; }', + 'src/scss/variables.scss': + '$primary: #007bff; .u-var-test { color: $primary; }', + 'src/scss/variables-dark.scss': + '$primary-dark: #004085; .u-dark-test { color: $primary-dark; }', + 'src/scss/utils.scss': + '.u-test { display: block !important; visibility: visible; }', + 'src/scss/globals.scss': + 'html { box-sizing: border-box; height: 100%; }', + 'src/scss/bootstrap.scss': + '/* mock bootstrap */ .btn { padding: 10px; }', + 'src/scss/components.scss': '.c-mock { border: 1px solid black; }', + 'src/scss/u-devstack.scss': + '#devstack { position: fixed; bottom: 0; }', + 'src/js/main.js': + 'console.log("hello world content here for size and validity");', + 'src/config/site.js': + 'export const siteDefaults = { title: "Test Site", baseUrl: "http://localhost" }', + 'src/assets/icons/favicons-source.png': Buffer.alloc(100), + 'src/assets/fonts/fonts.list': '', + } + await writeFixtures(sandboxPath, projectFixtures) + + try { + const gulpfile = await import( + `../../gulpfile.js?cache-bust=${Date.now()}` + ) + const buildPipeline = gulpfile.build + + if (!buildPipeline) { + assert.fail('Build pipeline could not be loaded.') + } + + await new Promise((resolve, reject) => { + buildPipeline((err) => { + if (err) { + reject(err) + } else { + resolve() + } + }) + }) + + const buildOutputDir = process.env.GULP_OUT_DIR + const generatedFiles = await fs.readdir(buildOutputDir) + + assert.ok( + generatedFiles.includes('index.html'), + 'index.html should be generated' + ) + assert.ok( + generatedFiles.some((file) => { + return file.startsWith('assets') + }), + 'assets directory should exist' + ) + + // Verify HTML content β€” must be a real rendered page, not an empty file + const indexHtml = await fs.readFile( + path.join(buildOutputDir, 'index.html'), + 'utf8' + ) + assert.ok( + indexHtml.includes(' 200, + 'index.html must be a substantive rendered document, not an empty stub' + ) + } finally { + delete process.env.BUILD_MODE + delete process.env.GULP_OUT_DIR + delete process.env.GULP_SKIP_INTEGRITY + await sleep(500) + } + }) + } + ) +}) diff --git a/tests/integration/images-final.test.js b/tests/integration/images-final.test.js new file mode 100644 index 0000000..7271a7f --- /dev/null +++ b/tests/integration/images-final.test.js @@ -0,0 +1,175 @@ +import assert from 'node:assert/strict' +import { existsSync } from 'node:fs' +import fs from 'node:fs/promises' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import images from '../../gulp/tasks/process-images.js' +import { runInSandbox, silenceConsole } from '../test-helpers.js' + +silenceConsole(beforeEach, afterEach, mock) + +const IMAGE_FIXTURES = { + png: 'iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAALElEQVR42u3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8GcYKAEAAS99S7YAAAAASUVORK5CYII=', + jpg: '/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAKAAoDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAj/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAVAWMAH//Z', + svg: 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iYmxhY2siLz48L3N2Zz4=', +} + +async function writeImageToSandbox(sandbox, fileName, base64) { + const filePath = path.join(sandbox, 'src', fileName) + await fs.mkdir(path.dirname(filePath), { recursive: true }) + await fs.writeFile(filePath, Buffer.from(base64, 'base64')) + return filePath +} + +describe('Image Pipeline Final Integration', () => { + let mockConsoleError + + beforeEach(() => { + mockConsoleError = mock.method(console, 'error', () => {}) + }) + + afterEach(() => { + mockConsoleError.mock.restore() + }) + it('should handle JPG task without crashing even if sharp fails', async () => { + await runInSandbox('images-jpg', async (sandbox) => { + const srcPath = await writeImageToSandbox( + sandbox, + 'test.jpg', + IMAGE_FIXTURES.jpg + ) + const destDir = path.join(sandbox, 'build') + + await images.jpg(srcPath, destDir) + + const optimizedPath = path.join(destDir, 'test.jpg') + const outputBuffer = await fs.readFile(optimizedPath) + // JPEG magic bytes: FF D8 FF + assert.strictEqual( + outputBuffer[0], + 0xff, + 'Output should have JPEG magic byte 0' + ) + assert.strictEqual( + outputBuffer[1], + 0xd8, + 'Output should have JPEG magic byte 1' + ) + assert.ok(outputBuffer.length > 0, 'JPG output should not be empty') + }) + }) + + it('should handle PNG task without crashing even if Sharp fails', async () => { + await runInSandbox('images-png', async (sandbox) => { + const pngFixtureSource = path.resolve( + 'tests/fixtures/images/synt-metadata-heavy.png' + ) + const pngContent = await fs.readFile(pngFixtureSource) + const srcPath = path.join(sandbox, 'src/test.png') + await fs.mkdir(path.dirname(srcPath), { recursive: true }) + await fs.writeFile(srcPath, pngContent) + + const destDir = path.join(sandbox, 'build') + + await images.png(srcPath, destDir) + + const optimizedPath = path.join(destDir, 'test.png') + const outputBuffer = await fs.readFile(optimizedPath) + // PNG magic bytes: 89 50 4E 47 + assert.strictEqual( + outputBuffer[0], + 0x89, + 'Output should have PNG magic byte 0' + ) + assert.strictEqual( + outputBuffer[1], + 0x50, + 'Output should have PNG magic byte 1' + ) + assert.strictEqual( + outputBuffer[2], + 0x4e, + 'Output should have PNG magic byte 2' + ) + assert.strictEqual( + outputBuffer[3], + 0x47, + 'Output should have PNG magic byte 3' + ) + }) + }) + + it('should handle WebP task without crashing even if sharp fails', async () => { + await runInSandbox('images-webp', async (sandbox) => { + const pngFixtureSource = path.resolve( + 'tests/fixtures/images/synt-metadata-heavy.png' + ) + const pngContent = await fs.readFile(pngFixtureSource) + const srcPath = path.join(sandbox, 'src/convert.png') + await fs.mkdir(path.dirname(srcPath), { recursive: true }) + await fs.writeFile(srcPath, pngContent) + const destDir = path.join(sandbox, 'build') + + await images.webp(srcPath, destDir) + + // Output may be WebP (sharp succeeded) or PNG fallback (sharp unavailable) + const webpPath = path.join(destDir, 'convert.webp') + const pngPath = path.join(destDir, 'convert.png') + const webpExists = existsSync(webpPath) + const pngExists = existsSync(pngPath) + + assert.ok( + webpExists || pngExists, + 'Output file (WebP or PNG fallback) should exist in build' + ) + + // Verify the output file has a valid image signature for whichever format was produced + const outputBuffer = await fs.readFile(webpExists ? webpPath : pngPath) + assert.ok(outputBuffer.length > 0, 'Output image must not be empty') + + if (webpExists) { + // WebP magic bytes: RIFF....WEBP (bytes 0-3 = 'RIFF', bytes 8-11 = 'WEBP') + assert.strictEqual( + outputBuffer.toString('ascii', 0, 4), + 'RIFF', + 'WebP output should start with RIFF header' + ) + assert.strictEqual( + outputBuffer.toString('ascii', 8, 12), + 'WEBP', + 'WebP output should have WEBP marker at offset 8' + ) + } else { + // PNG fallback magic bytes: 89 50 4E 47 + assert.strictEqual( + outputBuffer[0], + 0x89, + 'PNG fallback should have PNG magic byte 0' + ) + assert.strictEqual( + outputBuffer[1], + 0x50, + 'PNG fallback should have PNG magic byte 1' + ) + } + }) + }) + + it('should optimize SVG and clean content', async () => { + await runInSandbox('images-svg', async (sandbox) => { + const srcPath = await writeImageToSandbox( + sandbox, + 'test.svg', + IMAGE_FIXTURES.svg + ) + const destDir = path.join(sandbox, 'build') + + await images.svg(srcPath, destDir) + + const optimizedPath = path.join(destDir, 'test.svg') + const optimizedContent = await fs.readFile(optimizedPath, 'utf8') + assert.ok(optimizedContent.startsWith(' { + const imagesFixturesDir = path.resolve('tests/fixtures/images') + let mockConsoleWarn + + beforeEach(() => { + mockConsoleWarn = mock.method(console, 'warn', () => {}) + }) + + afterEach(() => { + mockConsoleWarn.mock.restore() + }) + + it('should skip non-image files named as PNG', async () => { + await runInSandbox('mismatch-non-image', async (sandbox) => { + const srcPath = path.join(imagesFixturesDir, 'synt-not-png.png') + const outputDir = path.join(sandbox, 'output') + await fs.mkdir(outputDir, { recursive: true }) + + await imageTasks.png(srcPath, outputDir) + + const outputExists = await fs + .access(path.join(outputDir, 'synt-not-png.png')) + .then(() => { + return true + }) + .catch(() => { + return false + }) + + assert.strictEqual( + outputExists, + false, + 'Non-image file should not be in output' + ) + }) + }) + + it('should skip corrupted signature PNG files', async () => { + await runInSandbox('mismatch-corrupted', async (sandbox) => { + const srcPath = path.join( + imagesFixturesDir, + 'synt-corrupted-signature.png' + ) + const outputDir = path.join(sandbox, 'output') + await fs.mkdir(outputDir, { recursive: true }) + + await imageTasks.png(srcPath, outputDir) + + const outputExists = await fs + .access(path.join(outputDir, 'synt-corrupted-signature.png')) + .then(() => { + return true + }) + .catch(() => { + return false + }) + + assert.strictEqual( + outputExists, + false, + 'Corrupted file should not be in output' + ) + }) + }) + + it('should process PNG file named as JPG (mismatched extension)', async () => { + await runInSandbox('mismatch-extension', async (sandbox) => { + const srcPath = path.join(imagesFixturesDir, 'mismatched-extension.jpg') + const outputDir = path.join(sandbox, 'output') + await fs.mkdir(outputDir, { recursive: true }) + + await imageTasks.jpg(srcPath, outputDir) + + const outputExists = await fs + .access(path.join(outputDir, 'mismatched-extension.jpg')) + .then(() => { + return true + }) + .catch(() => { + return false + }) + + assert.strictEqual( + outputExists, + true, + 'Mismatched file should be processed if it is a valid image' + ) + + const imageBuffer = await fs.readFile( + path.join(outputDir, 'mismatched-extension.jpg') + ) + assert.strictEqual( + imageBuffer[0], + 0x89, + 'Should still have PNG signature' + ) + assert.strictEqual( + imageBuffer[1], + 0x50, + 'Should still have PNG signature' + ) + }) + }) +}) diff --git a/tests/integration/process-data.test.js b/tests/integration/process-data.test.js new file mode 100644 index 0000000..c677bcb --- /dev/null +++ b/tests/integration/process-data.test.js @@ -0,0 +1,51 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import processData from '../../gulp/tasks/process-data.js' +import { runInSandbox, silenceConsole, writeFixtures } from '../test-helpers.js' + +silenceConsole(beforeEach, afterEach, mock) + +describe('processData Integration', () => { + it('should transform homepage markdown fixture into JSON dataset and menu', async () => { + await runInSandbox('process-data', async (sandboxPath) => { + const testSrcDir = path.join(sandboxPath, 'src') + const testOutputDir = path.join(sandboxPath, 'output') + const sourceFilePath = path.join(testSrcDir, 'index.md') + + await writeFixtures(sandboxPath, { + 'src/index.md': + '---\ntitle: Home\nlayout: layout-default.njk\nmenuMain:\n order: 1\n---\n# Home Content', + }) + + const stream = processData(sourceFilePath, testOutputDir, { + routesRoot: testSrcDir, + }) + + await new Promise((resolve, reject) => { + stream.on('end', resolve) + stream.on('error', reject) + stream.on('finish', resolve) + stream.resume() + }) + + const indexJsonPath = path.join(testOutputDir, 'index.json') + const menuJsonPath = path.join(testOutputDir, 'menu.json') + + const indexContent = await fs.readFile(indexJsonPath, 'utf8') + const menuContent = await fs.readFile(menuJsonPath, 'utf8') + + const indexData = JSON.parse(indexContent) + const menuData = JSON.parse(menuContent) + + assert.strictEqual(indexData.title, 'Home') + assert.strictEqual(indexData.content, '# Home Content') + assert.strictEqual(indexData.readingTime.words, 2) + assert.strictEqual(indexData.readingTime.minutes, 1) + assert.ok(Array.isArray(menuData.menu)) + assert.strictEqual(menuData.menu[0].name, 'Home') + }) + }) +}) diff --git a/tests/integration/process-html.test.js b/tests/integration/process-html.test.js new file mode 100644 index 0000000..137ca0f --- /dev/null +++ b/tests/integration/process-html.test.js @@ -0,0 +1,101 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import processHtml from '../../gulp/tasks/process-html.js' +import { runInSandbox, silenceConsole, writeFixtures } from '../test-helpers.js' + +describe('Process HTML Task (Integration)', () => { + silenceConsole(beforeEach, afterEach, mock) + + it( + 'should compile Nunjucks templates and write HTML to build directory', + { timeout: 10000 }, + async () => { + await runInSandbox('process-html', async (sandbox) => { + const config = { + routesBase: path.join(sandbox, 'src', 'routes'), + srcBase: path.join(sandbox, 'src'), + imagesBase: path.join(sandbox, 'src', 'assets', 'images'), + iconsBase: path.join(sandbox, 'src', 'assets', 'icons'), + tempBase: path.join(sandbox, '.tmp'), + paths: { build: path.join(sandbox, 'build') }, + globalInjectAssets: ['css/*.css'], + formatCode: false, + } + + await writeFixtures(sandbox, { + 'src/routes/index.njk': ` + + + {{ page.title | default("World") }} + +

Hello {{ page.title | default("World") }}

+

This is enough padding to exceed the 50 byte minimum integrity check in processHtml.

+ + + `, + '.tmp/pages/index.json': JSON.stringify({ title: 'Sandbox' }), + 'build/css/dummy.css': 'body {}', + }) + + await processHtml(config) + + const outputHtmlPath = path.join(config.paths.build, 'index.html') + const outputHtml = await fs.readFile(outputHtmlPath, 'utf8') + + assert.ok( + outputHtml.includes('

Hello Sandbox

'), + 'Output HTML should contain rendered template data' + ) + }) + } + ) + + it( + 'should render site and menu data loaded through route artifacts', + { timeout: 10000 }, + async () => { + await runInSandbox('process-html-global-context', async (sandbox) => { + const config = { + routesBase: path.join(sandbox, 'src', 'routes'), + srcBase: path.join(sandbox, 'src'), + imagesBase: path.join(sandbox, 'src', 'assets', 'images'), + iconsBase: path.join(sandbox, 'src', 'assets', 'icons'), + tempBase: path.join(sandbox, '.tmp'), + paths: { build: path.join(sandbox, 'build') }, + globalInjectAssets: ['css/*.css'], + formatCode: false, + } + + await writeFixtures(sandbox, { + 'src/routes/index.njk': ` + + + {{ site.title }} + +

{{ site.title }}

+ +

This is enough padding to exceed the 50 byte minimum integrity check in processHtml.

+ + + `, + '.tmp/site.json': JSON.stringify({ title: 'Sandbox Site' }), + '.tmp/pages/menu.json': JSON.stringify({ + menu: [{ name: 'About', order: 1, path: '/about/' }], + }), + 'build/css/dummy.css': 'body {}', + }) + + await processHtml(config) + + const outputHtmlPath = path.join(config.paths.build, 'index.html') + const outputHtml = await fs.readFile(outputHtmlPath, 'utf8') + + assert.ok(outputHtml.includes('

Sandbox Site

')) + assert.ok(outputHtml.includes('')) + }) + } + ) +}) diff --git a/tests/integration/process-js-routes.test.js b/tests/integration/process-js-routes.test.js new file mode 100644 index 0000000..cd8d7d1 --- /dev/null +++ b/tests/integration/process-js-routes.test.js @@ -0,0 +1,87 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import { resolveConfig } from '../../gulp/config.js' +import processJs, { processAllJs } from '../../gulp/tasks/process-js.js' +import { runInSandbox, silenceConsole, writeFixtures } from '../test-helpers.js' + +silenceConsole(beforeEach, afterEach, mock) + +describe('Route JS Integration', () => { + it('should preserve nested route structure for route-level scripts', async () => { + await runInSandbox('process-js-routes', async (sandbox) => { + await writeFixtures(sandbox, { + 'src/routes/index.js': 'console.log("home")', + 'src/routes/about/index.js': 'console.log("about")', + 'src/routes/blog/post.js': 'console.log("post")', + }) + + const config = resolveConfig('dev') + const routesBase = path.join(sandbox, 'src', 'routes') + const outputDir = path.join(sandbox, 'dist') + + await processJs( + config, + path.join(routesBase, '**/*.js').replace(/\\/g, '/'), + outputDir, + { + bundle: config.concatFiles, + minify: false, + sourceMaps: false, + base: routesBase, + } + ) + + const expectedFiles = ['index.js', 'about/index.js', 'blog/post.js'] + + for (const relativePath of expectedFiles) { + const assetPath = path.join(outputDir, relativePath) + const content = await fs.readFile(assetPath, 'utf8') + assert.ok( + content.length > 0, + `Expected non-empty JS file: ${relativePath}` + ) + } + }) + }) + + it('should compile both global and route-level scripts into their documented output paths', async () => { + await runInSandbox('process-all-js', async (sandbox) => { + await writeFixtures(sandbox, { + 'src/js/main.js': 'console.log("global")', + 'src/routes/about/index.js': 'console.log("about")', + }) + + const baseConfig = resolveConfig('dev') + const srcBase = path.join(sandbox, 'src') + const routesBase = path.join(srcBase, 'routes') + const outputDir = path.join(sandbox, 'dist') + const config = { + ...baseConfig, + srcBase, + routesBase, + jsFiles: path.join(srcBase, 'js', '**/*.js').replace(/\\/g, '/'), + paths: { + ...baseConfig.paths, + js: outputDir, + }, + } + + await processAllJs(config) + + const globalScript = await fs.readFile( + path.join(outputDir, 'main.js'), + 'utf8' + ) + const routeScript = await fs.readFile( + path.join(outputDir, 'about', 'index.js'), + 'utf8' + ) + + assert.ok(globalScript.includes('global')) + assert.ok(routeScript.includes('about')) + }) + }) +}) diff --git a/tests/integration/sass-structure.test.js b/tests/integration/sass-structure.test.js new file mode 100644 index 0000000..238d648 --- /dev/null +++ b/tests/integration/sass-structure.test.js @@ -0,0 +1,59 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import { resolveConfig } from '../../gulp/config.js' +import processSass from '../../gulp/tasks/process-sass.js' +import { runInSandbox, silenceConsole, writeFixtures } from '../test-helpers.js' + +silenceConsole(beforeEach, afterEach, mock) + +describe('Sass Nested Routes Preservation', () => { + it('should preserve nested directory structure for route styles', async () => { + await runInSandbox('sass-nesting', async (sandbox) => { + const sassFixtures = { + 'src/routes/index.scss': + 'body { background: white; color: black; margin: 0; }', + 'src/routes/about/index.scss': + 'body { background: blue; color: white; padding: 20px; }', + 'src/routes/deep/nested/style.scss': + 'body { background: red; display: flex; align-items: center; }', + } + await writeFixtures(sandbox, sassFixtures) + + const routesSourceBase = path.join(sandbox, 'src/routes') + const stylesDestBase = path.join(sandbox, 'dist') + + const devConfig = resolveConfig('dev') + await processSass( + devConfig, + path.join(routesSourceBase, '**/*.scss').replace(/\\/g, '/'), + stylesDestBase, + { + base: routesSourceBase, + skipIntegrity: true, + } + ) + + const expectedCssFiles = [ + { path: 'index.css', expectedSelector: 'background' }, + { path: 'about/index.css', expectedSelector: 'background' }, + { path: 'deep/nested/style.css', expectedSelector: 'background' }, + ] + + for (const { path: relativePath, expectedSelector } of expectedCssFiles) { + const fullOutputPath = path.join(stylesDestBase, relativePath) + const cssContent = await fs.readFile(fullOutputPath, 'utf8') + assert.ok( + cssContent.length > 0, + `Expected non-empty CSS file: ${relativePath}` + ) + assert.ok( + cssContent.includes(expectedSelector), + `Expected selector '${expectedSelector}' in ${relativePath}, got: ${cssContent}` + ) + } + }) + }) +}) diff --git a/tests/integration/sass.test.js b/tests/integration/sass.test.js new file mode 100644 index 0000000..faf8a55 --- /dev/null +++ b/tests/integration/sass.test.js @@ -0,0 +1,231 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import { resolveConfig } from '../../gulp/config.js' +import processSass, { + compileRouteStyles, + processAllSass, +} from '../../gulp/tasks/process-sass.js' +import { runInSandbox, silenceConsole, writeFixtures } from '../test-helpers.js' + +silenceConsole(beforeEach, afterEach, mock) + +function buildSandboxSassConfig(sandbox) { + const devConfig = resolveConfig('dev') + const srcBase = path.join(sandbox, 'src') + + return { + ...devConfig, + srcBase, + routesBase: path.join(srcBase, 'routes'), + sassBase: path.join(srcBase, 'scss'), + sassBootstrap: path.join(srcBase, 'scss/bootstrap.scss'), + sassCustom: path.join(srcBase, 'scss/custom.scss'), + sassComponents: path.join(srcBase, 'scss/components.scss'), + paths: { + ...devConfig.paths, + sass: path.join(sandbox, 'dist'), + }, + skipIntegrity: true, + } +} + +describe('Sass Pipeline Integration', () => { + let mockConsoleError + + beforeEach(() => { + mockConsoleError = mock.method(console, 'error', () => {}) + }) + + afterEach(() => { + mockConsoleError.mock.restore() + }) + + async function testProcessSass(sandbox, options = {}) { + const outputDir = path.join(sandbox, 'dist') + const devConfig = resolveConfig('dev') + await processSass( + devConfig, + path.join(sandbox, 'src/style.scss'), + outputDir, + { skipIntegrity: true, ...options } + ) + return outputDir + } + + it('should catch and handle sass compilation errors', async () => { + await runInSandbox('sass-error', async (sandbox) => { + const errorFixtures = { + 'src/style.scss': 'body { color: $non-existent-variable; }', + } + await writeFixtures(sandbox, errorFixtures) + const outputDir = await testProcessSass(sandbox) + + const cssFileExists = await fs + .access(path.join(outputDir, 'style.css')) + .then(() => { + return true + }) + .catch(() => { + return false + }) + assert.strictEqual( + cssFileExists, + false, + 'CSS file should not exist on compilation error' + ) + }) + }) + + it('should return immediately when no route styles are found', async () => { + await runInSandbox('sass-empty-routes', async (sandbox) => { + await writeFixtures(sandbox, { + 'src/scss/custom.scss': '.custom-layer { color: red; }', + }) + + const devConfig = buildSandboxSassConfig(sandbox) + let compiledCount + await assert.doesNotReject(async () => { + compiledCount = await compileRouteStyles(devConfig) + }) + assert.strictEqual( + compiledCount, + undefined, + 'compileRouteStyles should return undefined when no route SCSS files are found' + ) + }) + }) + + it('should support custom postcss plugins', async () => { + await runInSandbox('sass-postcss', async (sandbox) => { + const postcssFixtures = { + 'src/style.scss': + 'body { display: flex; color: blue; background: green; }', + } + await writeFixtures(sandbox, postcssFixtures) + const outputDir = await testProcessSass(sandbox, { minify: false }) + + const generatedCss = await fs.readFile( + path.join(outputDir, 'style.css'), + 'utf8' + ) + assert.ok(generatedCss.length > 0) + assert.ok(generatedCss.includes('display: flex')) + }) + }) + + it('should emit external Sass source maps in dev mode', async () => { + await runInSandbox('sass-sourcemaps-dev', async (sandbox) => { + await writeFixtures(sandbox, { + 'src/style.scss': 'body { color: blue; }', + }) + const outputDir = await testProcessSass(sandbox) + + const generatedCss = await fs.readFile( + path.join(outputDir, 'style.css'), + 'utf8' + ) + const generatedMap = await fs.readFile( + path.join(outputDir, 'style.css.map'), + 'utf8' + ) + + assert.ok( + generatedCss.includes('sourceMappingURL=style.css.map'), + 'CSS should link to an external source map' + ) + assert.ok(generatedMap.includes('"sources"')) + }) + }) + + it('should compile Bootstrap from the project Sass entrypoint', async () => { + await runInSandbox('sass-project-bootstrap', async (sandbox) => { + await writeFixtures(sandbox, { + 'src/scss/bootstrap.scss': + '.from-project-bootstrap { color: rgb(1, 2, 3); }', + 'src/scss/custom.scss': '.custom-layer { color: red; }', + 'src/scss/components.scss': '.component-layer { color: blue; }', + 'src/routes/index.scss': '.route-layer { color: green; }', + }) + + const devConfig = buildSandboxSassConfig(sandbox) + await processAllSass(devConfig, 'dev') + + const bootstrapCss = await fs.readFile( + path.join(devConfig.paths.sass, 'bootstrap.css'), + 'utf8' + ) + const componentsCss = await fs.readFile( + path.join(devConfig.paths.sass, 'components.css'), + 'utf8' + ) + + assert.ok(bootstrapCss.includes('.from-project-bootstrap')) + assert.ok(componentsCss.includes('.component-layer')) + }) + }) + + it('should recompile route styles when shared route abstracts change', async () => { + await runInSandbox('sass-route-abstracts', async (sandbox) => { + await writeFixtures(sandbox, { + 'src/scss/_route-abstracts.scss': '$route-color: red;', + 'src/routes/index.scss': + "@import '../scss/route-abstracts'; .route { color: $route-color; }", + }) + + const devConfig = buildSandboxSassConfig(sandbox) + await compileRouteStyles(devConfig, [], { skipNewer: true }) + + const routeCssPath = path.join(devConfig.paths.sass, 'index.css') + const initialCss = await fs.readFile(routeCssPath, 'utf8') + assert.ok(initialCss.includes('color: red')) + + await fs.writeFile( + path.join(sandbox, 'src/scss/_route-abstracts.scss'), + '$route-color: blue;' + ) + await compileRouteStyles(devConfig, [], { skipNewer: true }) + + const updatedCss = await fs.readFile(routeCssPath, 'utf8') + assert.ok(updatedCss.includes('color: blue')) + }) + }) + + it('should skip unchanged route styles while preserving import invalidation', async () => { + await runInSandbox('sass-route-cache', async (sandbox) => { + await writeFixtures(sandbox, { + 'src/scss/_route-abstracts.scss': '$route-color: red;', + 'src/routes/index.scss': + "@import '../scss/route-abstracts'; .route { color: $route-color; }", + }) + + const devConfig = buildSandboxSassConfig(sandbox) + const firstRun = await compileRouteStyles(devConfig, [], { + skipNewer: true, + }) + const routeCssPath = path.join(devConfig.paths.sass, 'index.css') + const firstStats = await fs.stat(routeCssPath) + + const secondRun = await compileRouteStyles(devConfig, [], { + skipNewer: true, + }) + const secondStats = await fs.stat(routeCssPath) + + assert.deepStrictEqual(secondRun, []) + assert.deepStrictEqual(firstRun, [routeCssPath]) + assert.strictEqual(secondStats.mtimeMs, firstStats.mtimeMs) + + await fs.writeFile( + path.join(sandbox, 'src/scss/_route-abstracts.scss'), + '$route-color: blue;' + ) + const thirdRun = await compileRouteStyles(devConfig, [], { + skipNewer: true, + }) + + assert.deepStrictEqual(thirdRun, [routeCssPath]) + }) + }) +}) diff --git a/tests/test-helpers.js b/tests/test-helpers.js new file mode 100644 index 0000000..bb9b610 --- /dev/null +++ b/tests/test-helpers.js @@ -0,0 +1,93 @@ +import fs from 'node:fs' +import path from 'node:path' +import process from 'node:process' + +export async function createTestSandbox(prefix = 'test-run') { + const rootDir = path.join(process.cwd(), 'tests/.sandboxes') + if (!fs.existsSync(rootDir)) { + await fs.promises.mkdir(rootDir, { recursive: true }) + } + + const timestamp = Date.now() + const random = Math.floor(Math.random() * 1000) + const tempDir = path.join(rootDir, `${prefix}-${timestamp}-${random}`) + + await fs.promises.mkdir(tempDir, { recursive: true }) + return tempDir +} + +export async function cleanupSandbox(sandboxPath) { + if (!sandboxPath || sandboxPath === '/') { + return + } + + const nodeModulesPath = path.join(sandboxPath, 'node_modules') + + try { + const stats = await fs.promises.lstat(nodeModulesPath) + if (stats.isSymbolicLink()) { + await fs.promises.unlink(nodeModulesPath) + } + } catch {} + + try { + await fs.promises.rm(sandboxPath, { recursive: true, force: true }) + } catch (error) { + if (error.code !== 'ENOTEMPTY') { + throw error + } + + await fs.promises.rm(sandboxPath, { recursive: true, force: true }) + } +} + +export async function runInSandbox(prefix, testFunction) { + const sandboxPath = await createTestSandbox(prefix) + try { + await testFunction(sandboxPath) + } finally { + await cleanupSandbox(sandboxPath) + } +} + +export function createMockEnvironment(overrides = {}) { + return { + BUILD_MODE: 'dev', + SITE_BASE_URL: 'http://localhost:3000', + ...overrides, + } +} + +export async function writeFixtures(sandboxPath, files) { + for (const [filePath, content] of Object.entries(files)) { + const fullPath = path.join(sandboxPath, filePath) + await fs.promises.mkdir(path.dirname(fullPath), { recursive: true }) + await fs.promises.writeFile(fullPath, content) + } +} + +export async function linkNodeModulesIntoSandbox(sandboxPath) { + const linkType = process.platform === 'win32' ? 'junction' : 'dir' + + try { + await fs.promises.symlink( + path.resolve('node_modules'), + path.join(sandboxPath, 'node_modules'), + linkType + ) + } catch (error) { + if (error.code !== 'EEXIST') { + throw error + } + } +} + +export function silenceConsole(beforeEachFn, afterEachFn, mockObj) { + let mockLog + beforeEachFn(() => { + mockLog = mockObj.method(console, 'log', () => {}) + }) + afterEachFn(() => { + mockLog.mock.restore() + }) +} diff --git a/tests/unit/assets.test.js b/tests/unit/assets.test.js new file mode 100644 index 0000000..1452e4d --- /dev/null +++ b/tests/unit/assets.test.js @@ -0,0 +1,163 @@ +import assert from 'node:assert/strict' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import { resolveConfig } from '../../gulp/config.js' +import processJs, { getEsbuildConfig } from '../../gulp/tasks/process-js.js' +import { + clearScssDiscoveryCache, + discoverScssSources, + getSassCompilerOptions, +} from '../../gulp/tasks/process-sass.js' +import purgeCss from '../../gulp/tasks/purge-css.js' +import { createMockEnvironment } from '../test-helpers.js' + +describe('Asset Pipeline Utilities', () => { + describe('getEsbuildConfig', () => { + it('should return dev configuration when flags are missing', () => { + createMockEnvironment({ BUILD_MODE: 'dev' }) + + const esConfig = getEsbuildConfig({}, resolveConfig('dev')) + + assert.strictEqual(esConfig.minify, false) + assert.strictEqual(esConfig.sourcemap, 'external') + }) + + it('should return production configuration for build mode', () => { + createMockEnvironment({ BUILD_MODE: 'build' }) + + const esConfig = getEsbuildConfig( + { minify: true, sourceMaps: false }, + resolveConfig('build') + ) + + assert.strictEqual(esConfig.minify, true) + assert.strictEqual(esConfig.sourcemap, false) + }) + }) + + describe('getSassCompilerOptions', () => { + it('should return expanded style for dev', () => { + const conf = resolveConfig('dev') + const options = getSassCompilerOptions({}, false, conf) + assert.strictEqual(options.outputStyle, 'expanded') + }) + + it('should return compressed style for production', () => { + const conf = resolveConfig('build') + const options = getSassCompilerOptions({}, true, conf) + assert.strictEqual(options.outputStyle, 'compressed') + }) + + it('should include core paths in includePaths', () => { + const conf = resolveConfig('dev') + const options = getSassCompilerOptions({}, false, conf) + assert.ok( + options.includePaths.some((p) => { + return p.includes('scss') + }) + ) + assert.ok( + options.includePaths.some((p) => { + return p.includes('node_modules') + }) + ) + }) + }) + + describe('task guard clauses', () => { + let mockConsoleWarn + + beforeEach(() => { + mockConsoleWarn = mock.method(console, 'warn', () => {}) + }) + + afterEach(() => { + mockConsoleWarn.mock.restore() + }) + + it('processJs should resolve gracefully when input file list is empty', async () => { + await assert.doesNotReject(async () => { + await processJs(resolveConfig('dev'), [], 'build-dev/assets/js') + }) + // Guard-clause path: warn should have been emitted, no file created + assert.ok( + mockConsoleWarn.mock.calls.length > 0, + 'processJs should emit a warn when file list is empty' + ) + }) + + it('purgeCss should return an empty readable stream for invalid parameters', async () => { + const stream = await purgeCss('', '', '') + const chunks = [] + + await assert.doesNotReject(async () => { + for await (const chunk of stream) { + chunks.push(chunk) + } + }) + + assert.strictEqual(chunks.length, 0) + }) + }) + + describe('discoverScssSources cache', () => { + it('should reuse cached SCSS discovery entries during TTL window', async () => { + clearScssDiscoveryCache() + + let calls = 0 + const fakeGlob = async () => { + calls += 1 + return ['/tmp/a.scss', '/tmp/b.scss'] + } + + const first = await discoverScssSources('/tmp/source', { + ttlMs: 5_000, + now: () => { + return 1_000 + }, + globFn: fakeGlob, + }) + + const second = await discoverScssSources('/tmp/source', { + ttlMs: 5_000, + now: () => { + return 1_001 + }, + globFn: fakeGlob, + }) + + assert.deepStrictEqual(first, ['/tmp/a.scss', '/tmp/b.scss']) + assert.deepStrictEqual(second, ['/tmp/a.scss', '/tmp/b.scss']) + assert.strictEqual(calls, 1) + }) + + it('should refresh cache after TTL expiry', async () => { + clearScssDiscoveryCache() + + let calls = 0 + const fakeGlob = async () => { + calls += 1 + return calls === 1 ? ['/tmp/old.scss'] : ['/tmp/new.scss'] + } + + await discoverScssSources('/tmp/source-ttl', { + ttlMs: 100, + now: () => { + return 10 + }, + globFn: fakeGlob, + }) + + const refreshed = await discoverScssSources('/tmp/source-ttl', { + ttlMs: 100, + now: () => { + return 200 + }, + globFn: fakeGlob, + }) + + assert.deepStrictEqual(refreshed, ['/tmp/new.scss']) + assert.strictEqual(calls, 2) + }) + }) +}) diff --git a/tests/unit/changed-filter.test.js b/tests/unit/changed-filter.test.js new file mode 100644 index 0000000..147131e --- /dev/null +++ b/tests/unit/changed-filter.test.js @@ -0,0 +1,104 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { describe, it } from 'node:test' + +import createChangedFilter from '../../gulp/utils/changed-filter.js' +import { runInSandbox, writeFixtures } from '../test-helpers.js' + +describe('Changed Filter Utility', () => { + function createMockFile(filePath, base) { + return { path: filePath, base } + } + + async function collectFilteredFiles(filter, files) { + const chunks = [] + + filter.on('data', (chunk) => { + chunks.push(chunk) + }) + + const completion = new Promise((resolve, reject) => { + filter.on('end', resolve) + filter.on('error', reject) + }) + + for (const file of files) { + filter.write(file) + } + filter.end() + await completion + + return chunks + } + + it('should filter out unchanged files and let through changed ones', async () => { + await runInSandbox('changed-filter', async (sandbox) => { + const srcDir = path.join(sandbox, 'src') + const destDir = path.join(sandbox, 'dest') + + await fs.mkdir(srcDir, { recursive: true }) + await fs.mkdir(destDir, { recursive: true }) + + const srcFile = path.join(srcDir, 'file.txt') + const destFile = path.join(destDir, 'file.txt') + + await fs.writeFile(srcFile, 'source') + await fs.writeFile(destFile, 'destination') + + // Make destination newer than source to simulate unchanged + const now = new Date() + const future = new Date(now.getTime() + 10000) + await fs.utimes(destFile, future, future) + + const newSrcFile = path.join(srcDir, 'new.txt') + await fs.writeFile(newSrcFile, 'new') + + const filter = createChangedFilter(destDir) + const chunks = await collectFilteredFiles(filter, [ + createMockFile(srcFile, srcDir), + createMockFile(newSrcFile, srcDir), + ]) + + assert.strictEqual(chunks.length, 1) + assert.strictEqual(chunks[0].path, newSrcFile) + }) + }) + + it('should preserve nested paths from file.base when file.relative is missing', async () => { + await runInSandbox('changed-filter-base', async (sandbox) => { + const srcDir = path.join(sandbox, 'src') + const destDir = path.join(sandbox, 'dest') + const srcFile = path.join(srcDir, 'nested', 'file.txt') + const destFile = path.join(destDir, 'nested', 'file.txt') + + await fs.mkdir(path.dirname(srcFile), { recursive: true }) + await fs.mkdir(path.dirname(destFile), { recursive: true }) + await fs.writeFile(srcFile, 'source') + await fs.writeFile(destFile, 'destination') + + const future = new Date(Date.now() + 10000) + await fs.utimes(destFile, future, future) + + const filter = createChangedFilter(destDir) + const chunks = await collectFilteredFiles(filter, [ + { path: srcFile, base: srcDir }, + ]) + + assert.deepStrictEqual(chunks, []) + }) + }) + + it('should reject files without relative path context', async () => { + await runInSandbox('changed-filter-missing-relative', async (sandbox) => { + const srcFile = path.join(sandbox, 'file.txt') + await fs.writeFile(srcFile, 'source') + + const filter = createChangedFilter(path.join(sandbox, 'dest')) + + await assert.rejects(async () => { + await collectFilteredFiles(filter, [{ path: srcFile }]) + }, /file\.relative is required/) + }) + }) +}) diff --git a/tests/unit/config.test.js b/tests/unit/config.test.js new file mode 100644 index 0000000..72861e8 --- /dev/null +++ b/tests/unit/config.test.js @@ -0,0 +1,118 @@ +import assert from 'node:assert/strict' +import { describe, it } from 'node:test' + +import * as configModule from '../../gulp/config.js' +import { resolveConfig } from '../../gulp/config.js' + +describe('Configuration System (Approach B)', () => { + describe('resolveConfig', () => { + it('should return correct object for dev mode', () => { + const config = resolveConfig('dev') + + assert.strictEqual(config.version, 'dev') + assert.strictEqual(config.minifyJs, false) + assert.strictEqual(config.sourceMaps, true) + assert.strictEqual(config.paths.build, './build-dev') + assert.strictEqual(config.paths.sass, './build-dev/assets/css') + }) + + it('should return correct object for build mode', () => { + const config = resolveConfig('build') + + assert.strictEqual(config.version, 'prod') + assert.strictEqual(config.minifyJs, true) + assert.strictEqual(config.sourceMaps, false) + assert.strictEqual(config.paths.build, './build-prod') + }) + + it('should return correct object for export mode', () => { + const config = resolveConfig('export') + + assert.strictEqual(config.version, 'export') + assert.strictEqual(config.minifyJs, false) + assert.strictEqual(config.optimizeImages, true) + assert.strictEqual(config.formatCode, true) + }) + + it('should throw error for invalid build mode', () => { + assert.throws(() => { + resolveConfig('invalid') + }, /Invalid BUILD_MODE/) + }) + + it('should throw error when mode is missing', () => { + assert.throws(() => { + resolveConfig() + }, /Invalid BUILD_MODE/) + }) + + it('should expose only resolveConfig as named public API', () => { + assert.ok('resolveConfig' in configModule) + assert.ok(!('srcBase' in configModule)) + assert.ok(!('routesBase' in configModule)) + assert.ok(!('staticBase' in configModule)) + assert.ok(!('tempBase' in configModule)) + assert.ok(!('assetsBase' in configModule)) + assert.ok(!('componentsPath' in configModule)) + assert.ok(!('sassBase' in configModule)) + assert.ok(!('sassBootstrap' in configModule)) + assert.ok(!('sassCustom' in configModule)) + assert.ok(!('sassComponents' in configModule)) + }) + }) + + describe('Path Consistency', () => { + it('should have consistent asset path structure across modes', () => { + const dev = resolveConfig('dev') + const prod = resolveConfig('build') + + assert.ok(dev.paths.js.endsWith('/assets/js')) + assert.ok(prod.paths.js.endsWith('/assets/js')) + assert.ok(dev.sassBase.includes('/scss')) + }) + + it('should split Sass watch scopes by compile target', () => { + const config = resolveConfig('dev') + + assert.ok(config.bootstrapWatch.includes('./src/scss/bootstrap.scss')) + assert.ok(config.projectSassWatch.includes('./src/scss/components.scss')) + assert.ok( + config.routeSassWatch.includes('./src/scss/_route-abstracts.scss') + ) + }) + }) + + describe('Lazy Environment Resolution', () => { + it('should pick up SITE_BASE_URL from process.env at resolution time', () => { + const oldUrl = process.env.SITE_BASE_URL + try { + process.env.SITE_BASE_URL = 'http://test.local' + + const config = resolveConfig('dev') + assert.strictEqual(config.faviconGen.url, 'http://test.local') + } finally { + process.env.SITE_BASE_URL = oldUrl + } + }) + + it('should normalize environment output paths for POSIX globs', () => { + const oldOutDir = process.env.GULP_OUT_DIR + const oldTempDir = process.env.GULP_TEMP_DIR + + try { + process.env.GULP_OUT_DIR = 'build\\prod' + process.env.GULP_TEMP_DIR = '.temp\\pages' + + const config = resolveConfig('build') + + assert.strictEqual(config.buildBase, 'build/prod') + assert.strictEqual(config.tempBase, '.temp/pages') + assert.strictEqual(config.paths.sass, 'build/prod/assets/css') + assert.strictEqual(config.datasetPagesBuild, '.temp/pages/pages') + } finally { + process.env.GULP_OUT_DIR = oldOutDir + process.env.GULP_TEMP_DIR = oldTempDir + } + }) + }) +}) diff --git a/tests/unit/content-metrics.test.js b/tests/unit/content-metrics.test.js new file mode 100644 index 0000000..d3abfd8 --- /dev/null +++ b/tests/unit/content-metrics.test.js @@ -0,0 +1,61 @@ +import assert from 'node:assert/strict' +import { describe, it } from 'node:test' + +import { calculateReadingTime } from '../../gulp/utils/content-metrics.js' + +describe('Content Metrics Utility - calculateReadingTime', () => { + it('should return zeros for empty or null content', () => { + const expected = { minutes: 0, words: 0 } + + assert.deepStrictEqual(calculateReadingTime(''), expected) + assert.deepStrictEqual(calculateReadingTime(null), expected) + assert.deepStrictEqual(calculateReadingTime(undefined), expected) + }) + + it('should return 1 minute for short content (less than WPM threshold)', () => { + const content = 'This is a short sentence.' + const result = calculateReadingTime(content) + + assert.strictEqual(result.minutes, 1) + assert.strictEqual(result.words, 5) + }) + + it('should calculate correctly for long content', () => { + // 250 words should be 2 minutes at 200 WPM + const words = new Array(250).fill('word').join(' ') + const result = calculateReadingTime(words) + + assert.strictEqual(result.minutes, 2) + assert.strictEqual(result.words, 250) + }) + + it('should respect custom wordsPerMinute option', () => { + const words = new Array(100).fill('word').join(' ') + // 100 words at 50 WPM should be 2 minutes + const result = calculateReadingTime(words, { wordsPerMinute: 50 }) + + assert.strictEqual(result.minutes, 2) + assert.strictEqual(result.words, 100) + }) + + it('should ignore Markdown syntax for word count', () => { + const markdown = + '# Header\n\nThis is a [link](https://example.com) and some **bold text**.' + // Expected words: "Header", "This", "is", "a", "link", "and", "some", "bold", "text" (9 words) + const result = calculateReadingTime(markdown) + + assert.strictEqual(result.words, 9) + }) + + it('should throw or handle non-positive wordsPerMinute', () => { + const content = 'Test' + assert.throws( + () => calculateReadingTime(content, { wordsPerMinute: 0 }), + /wordsPerMinute must be positive/ + ) + assert.throws( + () => calculateReadingTime(content, { wordsPerMinute: -1 }), + /wordsPerMinute must be positive/ + ) + }) +}) diff --git a/tests/unit/env.test.js b/tests/unit/env.test.js new file mode 100644 index 0000000..5d9a5fd --- /dev/null +++ b/tests/unit/env.test.js @@ -0,0 +1,35 @@ +import assert from 'node:assert/strict' +import { describe, it } from 'node:test' + +import { getEnv } from '../../gulp/utils/index.js' + +describe('Environment Utilities', () => { + it('should return fallback for undefined values', () => { + const environment = {} + assert.strictEqual( + getEnv('MISSING_KEY', 'fallback', environment), + 'fallback' + ) + }) + + it('should coerce boolean strings', () => { + const environment = { BOOL_TRUE: 'true', BOOL_FALSE: 'false' } + + assert.strictEqual(getEnv('BOOL_TRUE', null, environment), true) + assert.strictEqual(getEnv('BOOL_FALSE', null, environment), false) + }) + + it('should coerce numeric strings', () => { + const environment = { INT_VAL: '42', FLOAT_VAL: '3.14' } + + assert.strictEqual(getEnv('INT_VAL', null, environment), 42) + assert.strictEqual(getEnv('FLOAT_VAL', null, environment), 3.14) + }) + + it('should preserve non-numeric/non-boolean strings', () => { + const environment = { MODE: 'development', MIXED: '42px' } + + assert.strictEqual(getEnv('MODE', null, environment), 'development') + assert.strictEqual(getEnv('MIXED', null, environment), '42px') + }) +}) diff --git a/tests/unit/generate-favicons.test.js b/tests/unit/generate-favicons.test.js new file mode 100644 index 0000000..e136cfa --- /dev/null +++ b/tests/unit/generate-favicons.test.js @@ -0,0 +1,85 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import generateFavicons from '../../gulp/tasks/generate-favicons.js' +import { runInSandbox } from '../test-helpers.js' + +const MINIMAL_PNG = Buffer.from( + 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==', + 'base64' +) + +describe('Generate Favicons Task', () => { + describe('generateFavicons', () => { + it('should throw error when sourcePath is invalid', async () => { + const mockError = mock.method(console, 'error', () => {}) + const sourcePath = './nonexistent.png' + const outputDir = './output' + const faviconConfig = { + appName: 'Test App', + appShortName: 'Test', + appDescription: 'Test Description', + developerName: 'Test Dev', + background: '#000000', + path: '/', + display: 'standalone', + icons: { + android: true, + appleIcon: true, + windows: true, + favicons: true, + }, + } + + try { + await assert.rejects( + async () => { + await generateFavicons(sourcePath, outputDir, faviconConfig) + }, + (err) => { + return err.message.includes('Favicon source image not found') + } + ) + } finally { + mockError.mock.restore() + } + }) + + it('should throw error when outputDir is invalid', async () => { + await runInSandbox('favicon', async (sandbox) => { + const sourcePath = path.join(sandbox, 'source.png') + const outputDir = null // Invalid + const faviconConfig = { + appName: 'Test App', + appShortName: 'Test', + appDescription: 'Test Description', + developerName: 'Test Dev', + background: '#000000', + path: '/', + display: 'standalone', + icons: { + android: true, + appleIcon: true, + windows: true, + favicons: true, + }, + } + + await fs.writeFile(sourcePath, MINIMAL_PNG) + + await assert.rejects( + async () => { + await generateFavicons(sourcePath, outputDir, faviconConfig) + }, + (err) => { + return err.message.includes( + 'Favicon task skipped: invalid source or destination' + ) + } + ) + }) + }) + }) +}) diff --git a/tests/unit/gulpfile.test.js b/tests/unit/gulpfile.test.js new file mode 100644 index 0000000..fc3d75a --- /dev/null +++ b/tests/unit/gulpfile.test.js @@ -0,0 +1,139 @@ +import assert from 'node:assert/strict' +import { execSync } from 'node:child_process' +import { describe, it } from 'node:test' + +describe('Gulpfile (Boundary/Smoke)', () => { + it('should successfully parse and export public pipeline tasks', async () => { + // We dynamically import to catch syntax/parsing errors within the test execution phase + // rather than crashing the test runner at module load time. + process.env.BUILD_MODE = 'dev' + const gulpfile = await import('../../gulpfile.js') + + const expectedTasks = [ + 'clean', + 'copy', + 'css', + 'js', + 'dataset', + 'html', + 'images', + 'favicons', + 'fonts', + 'purge', + 'revision', + 'sri', + 'validate', + 'debug', + 'reload', + 'refreshCss', + 'resolveCssReloadPaths', + 'dev', + 'build', + 'export', + 'default', + ] + + for (const task of expectedTasks) { + assert.ok( + typeof gulpfile[task] === 'function', + `Missing or invalid export: ${task}` + ) + } + }) + + it('should throw an error when BUILD_MODE is not set', () => { + assert.throws(() => { + execSync('node -e "import(\'./gulpfile.js\')"', { + cwd: process.cwd(), + env: { ...process.env, BUILD_MODE: '' }, + stdio: 'pipe', + }) + }, /BUILD_MODE must be set/) + }) + + it('should export correct default pipeline based on BUILD_MODE', async () => { + // Bust ESM cache with query strings to test different initialization branches + process.env.BUILD_MODE = 'export' + const gulpfileExport = await import('../../gulpfile.js?mode=export') + assert.strictEqual( + gulpfileExport.default, + gulpfileExport.export, + 'export pipeline should be default when BUILD_MODE=export' + ) + + process.env.BUILD_MODE = 'build' + const gulpfileBuild = await import('../../gulpfile.js?mode=build') + assert.strictEqual( + gulpfileBuild.default, + gulpfileBuild.build, + 'build pipeline should be default when BUILD_MODE=build' + ) + + process.env.BUILD_MODE = 'dev' + const gulpfileDev = await import('../../gulpfile.js?mode=dev') + assert.strictEqual( + gulpfileDev.default, + gulpfileDev.dev, + 'dev pipeline should be default when BUILD_MODE=dev' + ) + }) + + it('should register template rebuilds for change, add, and unlink events', async () => { + process.env.BUILD_MODE = 'dev' + const gulpfile = await import('../../gulpfile.js?watchers=templates') + const handlers = new Map() + const watchedPaths = [] + const gulpApi = { + series(...taskList) { + return () => { + return taskList + } + }, + watch(paths) { + watchedPaths.push(paths) + return { + on(eventName, task) { + handlers.set(eventName, task) + }, + } + }, + } + const tasks = { + lintTemplates: () => {}, + dataset: () => {}, + html: () => {}, + reload: () => {}, + } + const config = { + templateWatchPaths: ['src/**/*.njk', 'src/**/*.md'], + } + + gulpfile.registerTemplateWatcher({ config, tasks, gulpApi }) + + assert.deepStrictEqual(watchedPaths, [config.templateWatchPaths]) + assert.deepStrictEqual([...handlers.keys()], ['change', 'add', 'unlink']) + for (const eventName of ['change', 'add', 'unlink']) { + assert.equal( + typeof handlers.get(eventName), + 'function', + `${eventName} should run a template rebuild task` + ) + } + }) + + it('should resolve BrowserSync CSS reload paths from written files', async () => { + process.env.BUILD_MODE = 'dev' + const gulpfile = await import('../../gulpfile.js?css-reload-paths') + const buildRoot = '/project/build-dev' + + assert.deepStrictEqual( + gulpfile.resolveCssReloadPaths(buildRoot, [ + '/project/build-dev/assets/css/custom.css', + '/project/build-dev/assets/css/custom.css.map', + '/project/build-dev/assets/css/custom.css.deps.json', + '/project/build-dev/assets/css/about/index.css', + ]), + ['assets/css/custom.css', 'assets/css/about/index.css'] + ) + }) +}) diff --git a/tests/unit/helpers.test.js b/tests/unit/helpers.test.js new file mode 100644 index 0000000..e1313ef --- /dev/null +++ b/tests/unit/helpers.test.js @@ -0,0 +1,238 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs' +import path from 'node:path' +import { describe, it } from 'node:test' + +import * as utilsModule from '../../gulp/utils/index.js' +import { + ensureDirectoryExists, + getDirFromGlob, + getRelativePath, + handleEmptyPaths, + isPrivateFile, + streamToPromise, + suppressOutdatedBootstrapWarnings, + toKebabCase, +} from '../../gulp/utils/index.js' +import { cleanupSandbox, createTestSandbox } from '../test-helpers.js' + +describe('Helpers Utility - public API boundaries', () => { + it('should expose only explicit shared seams from the utils barrel', () => { + assert.ok(!('applySeoDefaults' in utilsModule)) + assert.ok(!('buildGlobalContext' in utilsModule)) + assert.ok(!('buildMenuData' in utilsModule)) + assert.ok(!('buildPageData' in utilsModule)) + assert.ok(!('buildRouteExpressionContext' in utilsModule)) + assert.ok(!('buildTemplateContext' in utilsModule)) + assert.equal(typeof utilsModule.calculateReadingTime, 'function') + assert.equal(typeof utilsModule.cleanHtmlComments, 'function') + assert.equal(typeof utilsModule.createLogger, 'function') + assert.ok(!('deepTrimStrings' in utilsModule)) + assert.ok(!('discoverRouteAssets' in utilsModule)) + assert.equal(typeof utilsModule.discoverRouteScripts, 'function') + assert.equal(typeof utilsModule.discoverRouteStyles, 'function') + assert.equal(typeof utilsModule.detectType, 'function') + assert.ok(!('extractMenuEntry' in utilsModule)) + assert.equal(typeof utilsModule.getLqsPlaceholder, 'function') + assert.ok(!('getMenuDataArtifactPath' in utilsModule)) + assert.ok(!('getPageDataArtifactPath' in utilsModule)) + assert.ok(!('getRouteDataArtifactsDir' in utilsModule)) + assert.ok(!('getSiteDataArtifactPath' in utilsModule)) + assert.equal(typeof utilsModule.optimizeWithSharp, 'function') + assert.equal(typeof utilsModule.resolveInjectionUrl, 'function') + assert.ok(!('resolveMetadataUrls' in utilsModule)) + assert.ok(!('resolvePageLocation' in utilsModule)) + assert.equal(typeof utilsModule.stripXhtmlSlashes, 'function') + assert.ok(!('toBooleanFlag' in utilsModule)) + }) +}) + +describe('Helpers Utility - getRelativePath', () => { + it('should return relative path from current working directory', () => { + const absolutePath = path.join(process.cwd(), 'src/assets/css/main.css') + const expected = 'src/assets/css/main.css' + + const result = getRelativePath(absolutePath) + + assert.strictEqual(result, expected) + }) +}) + +describe('Helpers Utility - ensureDirectoryExists', () => { + it('should create directory if it does not exist', async () => { + const sandbox = await createTestSandbox() + const targetDir = path.join(sandbox, 'new/nested/dir') + + await ensureDirectoryExists(targetDir) + + const stats = await fs.promises.stat(targetDir) + assert.ok(stats.isDirectory()) + + await cleanupSandbox(sandbox) + }) + + it('should not throw if directory already exists', async () => { + const sandbox = await createTestSandbox() + + await assert.doesNotReject(async () => { + await ensureDirectoryExists(sandbox) + }) + + // Verify directory still exists and was not altered + const stats = await fs.promises.stat(sandbox) + assert.ok( + stats.isDirectory(), + 'Sandbox directory should still exist after no-op call' + ) + + await cleanupSandbox(sandbox) + }) +}) + +describe('Helpers Utility - toKebabCase', () => { + it('should convert mixed case and spaces to kebab-case', () => { + assert.strictEqual(toKebabCase('Hello World'), 'hello-world') + assert.strictEqual(toKebabCase('My Custom Property'), 'my-custom-property') + }) + + it('should handle special characters and extra dashes', () => { + assert.strictEqual(toKebabCase('Hello! @World'), 'hello-world') + assert.strictEqual( + toKebabCase('---multiple---dashes---'), + 'multiple-dashes' + ) + }) +}) + +describe('Helpers Utility - getDirFromGlob', () => { + it('should extract base directory from simple glob', () => { + assert.strictEqual( + getDirFromGlob('src/assets/js/**/*.js'), + 'src/assets/js/' + ) + assert.strictEqual( + getDirFromGlob('src\\assets\\js\\**\\*.js'), + 'src\\assets\\js\\' + ) + }) + + it('should handle array of globs by taking the first one', () => { + assert.strictEqual( + getDirFromGlob(['src/css/*.css', 'other/*.css']), + 'src/css/' + ) + }) + + it('should return empty string for empty input', () => { + assert.strictEqual(getDirFromGlob(''), '') + assert.strictEqual(getDirFromGlob(), '') + assert.strictEqual(getDirFromGlob([]), '') + }) +}) + +describe('Helpers Utility - handleEmptyPaths', () => { + it('should return true and log for empty array', () => { + assert.strictEqual(handleEmptyPaths([], 'Empty list'), true) + }) + + it('should return true for null or undefined', () => { + assert.strictEqual(handleEmptyPaths(null, 'Null path'), true) + assert.strictEqual(handleEmptyPaths(undefined, 'Undefined path'), true) + }) + + it('should return false for valid paths', () => { + assert.strictEqual(handleEmptyPaths(['src/main.js'], 'Valid list'), false) + assert.strictEqual(handleEmptyPaths('src/style.css', 'Valid string'), false) + }) +}) + +describe('Helpers Utility - ensureDirectoryExists (Array)', () => { + it('should create multiple directories recursively', async () => { + const sandbox = await createTestSandbox() + const targets = [ + path.join(sandbox, 'multi/dir1'), + path.join(sandbox, 'multi/dir2'), + ] + + await ensureDirectoryExists(targets) + + for (const target of targets) { + const stats = await fs.promises.stat(target) + assert.ok(stats.isDirectory()) + } + + await cleanupSandbox(sandbox) + }) +}) + +describe('Helpers Utility - suppressOutdatedBootstrapWarnings', () => { + it('should return true for deprecation warnings', () => { + assert.strictEqual( + suppressOutdatedBootstrapWarnings('Deprecation: this is old'), + true + ) + assert.strictEqual( + suppressOutdatedBootstrapWarnings('slash as division is deprecated'), + true + ) + }) + + it('should return false for other messages', () => { + assert.strictEqual( + suppressOutdatedBootstrapWarnings('Compilation success'), + false + ) + assert.strictEqual(suppressOutdatedBootstrapWarnings(null), false) + }) +}) + +describe('Helpers Utility - isPrivateFile', () => { + it('should return true for files starting with _ or __', () => { + assert.strictEqual(isPrivateFile('_private.njk'), true) + assert.strictEqual(isPrivateFile('__hidden.js'), true) + }) + + it('should return true if any parent directory starts with _ or __', () => { + assert.strictEqual(isPrivateFile('src/lib/components/_debug/test.js'), true) + assert.strictEqual(isPrivateFile('_drafts/post.md'), true) + assert.strictEqual(isPrivateFile('src/__tests/helper.js'), true) + }) + + it('should return false for standard files and paths', () => { + assert.strictEqual(isPrivateFile('src/main.js'), false) + assert.strictEqual(isPrivateFile('index.njk'), false) + assert.strictEqual(isPrivateFile('assets/css/_variables.scss'), true) + }) + + it('should return false for empty or null input', () => { + assert.strictEqual(isPrivateFile(''), false) + assert.strictEqual(isPrivateFile(null), false) + }) +}) + +describe('Helpers Utility - streamToPromise', () => { + it('should resolve when stream ends', async () => { + const { PassThrough } = await import('node:stream') + const stream = new PassThrough() + const chunks = [] + stream.on('data', (chunk) => { + chunks.push(chunk) + }) + const promise = streamToPromise(stream) + stream.end('test data') + await promise + assert.strictEqual( + Buffer.concat(chunks).toString(), + 'test data', + 'Stream should have emitted the written data before resolving' + ) + }) + + it('should reject when stream emits error', async () => { + const { PassThrough } = await import('node:stream') + const stream = new PassThrough() + const promise = streamToPromise(stream) + stream.destroy(new Error('Stream error')) + await assert.rejects(promise, /Stream error/) + }) +}) diff --git a/tests/unit/html-helpers.test.js b/tests/unit/html-helpers.test.js new file mode 100644 index 0000000..aa71964 --- /dev/null +++ b/tests/unit/html-helpers.test.js @@ -0,0 +1,162 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { describe, it } from 'node:test' + +import { + clearRouteAssetCache, + discoverRouteStyles, +} from '../../gulp/utils/navigation-assets.js' +import { + getMenuDataArtifactPath, + getPageDataArtifactPath, + getRouteDataArtifactsDir, + getSiteDataArtifactPath, + loadPageDataArtifact, + loadRouteArtifactsContext, + writeMenuDataArtifact, + writePageDataArtifact, +} from '../../gulp/utils/route-data.js' +import { runInSandbox } from '../test-helpers.js' + +describe('HTML Helpers (Unit)', () => { + describe('route content artifacts', () => { + it('should resolve route artifacts into the pages temp directory', () => { + assert.strictEqual( + getRouteDataArtifactsDir('/tmp/build-data'), + path.join('/tmp/build-data', 'pages') + ) + }) + + it('should resolve the site and menu artifact paths', () => { + const artifactsBase = path.join('/tmp/build-data', 'pages') + + assert.strictEqual( + getSiteDataArtifactPath('/tmp/build-data'), + path.join('/tmp/build-data', 'site.json') + ) + assert.strictEqual( + getMenuDataArtifactPath(artifactsBase), + path.join(artifactsBase, 'menu.json') + ) + }) + + it('should resolve a page artifact from the route path', () => { + const artifactPath = getPageDataArtifactPath({ + artifactsBase: '/tmp/build-data/pages', + routesBase: '/tmp/project/src/routes', + filePath: '/tmp/project/src/routes/about/index.njk', + }) + + assert.strictEqual( + artifactPath, + path.join('/tmp/build-data/pages', 'about/index.json') + ) + }) + + it('should write and reload page and menu artifacts through route-data seam', async () => { + await runInSandbox('route-artifact-io', async (sandbox) => { + const tempBase = path.join(sandbox, '.tmp') + const routesBase = path.join(sandbox, 'src', 'routes') + const filePath = path.join(routesBase, 'about', 'index.md') + const artifactsBase = getRouteDataArtifactsDir(tempBase) + const pageData = { title: 'About', pageId: 'about', path: '/about/' } + + await writePageDataArtifact({ + artifactsBase, + routesBase, + filePath, + pageData, + }) + await writeMenuDataArtifact(artifactsBase, [ + { name: 'About', order: 2, path: '/about/' }, + ]) + await fs.mkdir(tempBase, { recursive: true }) + await fs.writeFile( + getSiteDataArtifactPath(tempBase), + JSON.stringify({ title: 'Sandbox Site' }, null, 2) + ) + + const loadedPage = await loadPageDataArtifact({ + artifactsBase, + routesBase, + filePath, + }) + const loadedContext = await loadRouteArtifactsContext(tempBase) + + assert.deepStrictEqual(loadedPage, pageData) + assert.deepStrictEqual(loadedContext, { + siteData: { title: 'Sandbox Site' }, + menuData: { + menu: [{ name: 'About', order: 2, path: '/about/' }], + }, + }) + }) + }) + + it('should return empty objects when route artifacts are missing', async () => { + await runInSandbox('route-artifact-empty', async (sandbox) => { + const tempBase = path.join(sandbox, '.tmp') + const loadedContext = await loadRouteArtifactsContext(tempBase) + + assert.deepStrictEqual(loadedContext, { + siteData: {}, + menuData: {}, + }) + }) + }) + + it('should throw with cause when a route artifact contains invalid json', async () => { + await runInSandbox('route-artifact-invalid-json', async (sandbox) => { + const tempBase = path.join(sandbox, '.tmp') + const routesBase = path.join(sandbox, 'src', 'routes') + const artifactsBase = getRouteDataArtifactsDir(tempBase) + const filePath = path.join(routesBase, 'about', 'index.njk') + const artifactPath = getPageDataArtifactPath({ + artifactsBase, + routesBase, + filePath, + }) + + await fs.mkdir(path.dirname(artifactPath), { recursive: true }) + await fs.writeFile(artifactPath, '{invalid json') + + await assert.rejects( + () => + loadPageDataArtifact({ + artifactsBase, + routesBase, + filePath, + }), + (error) => { + assert.match(error.message, /Failed to read route artifact/) + assert.ok(error.cause instanceof Error) + return true + } + ) + }) + }) + }) + + describe('route asset discovery', () => { + it('should expose newly added route styles after cache clear', async () => { + await runInSandbox('route-asset-cache', async (sandbox) => { + const assetDir = path.join(sandbox, 'assets/css/about') + await fs.mkdir(assetDir, { recursive: true }) + + const emptyResult = await discoverRouteStyles('about', 'index', sandbox) + assert.deepStrictEqual(emptyResult, []) + + await fs.writeFile(path.join(assetDir, 'index.css'), '.about {}') + clearRouteAssetCache() + + const updatedResult = await discoverRouteStyles( + 'about', + 'index', + sandbox + ) + assert.deepStrictEqual(updatedResult, ['/assets/css/about/index.css']) + }) + }) + }) +}) diff --git a/tests/unit/html.test.js b/tests/unit/html.test.js new file mode 100644 index 0000000..2dc94de --- /dev/null +++ b/tests/unit/html.test.js @@ -0,0 +1,120 @@ +import assert from 'node:assert/strict' +import path from 'node:path' +import { describe, it } from 'node:test' + +import { + cleanHtmlComments, + resolveInjectionUrl, + sortGlobalAssetPaths, + stripTrailingLineWhitespace, + stripXhtmlSlashes, +} from '../../gulp/utils/html-output.js' + +describe('HTML Pipeline Utilities', () => { + describe('stripXhtmlSlashes', () => { + it('should remove self-closing slashes from void elements', () => { + const input = '
' + const expected = '
' + assert.strictEqual(stripXhtmlSlashes(input), expected) + }) + + it('should remove explicit closing tags for void elements', () => { + const input = '' + const expected = '' + assert.strictEqual(stripXhtmlSlashes(input), expected) + }) + + it('should remove explicit closing tags for all tracked void elements', () => { + const input = '' + const expected = '' + assert.strictEqual(stripXhtmlSlashes(input), expected) + }) + + it('should preserve self-closing slashes in SVG elements', () => { + const input = + '' + const expected = + '' + assert.strictEqual(stripXhtmlSlashes(input), expected) + }) + }) + + describe('cleanHtmlComments', () => { + it('should remove standard HTML comments', () => { + const input = '
Content
' + const expected = '
Content
' + assert.strictEqual(cleanHtmlComments(input), expected) + }) + + it('should preserve IE conditional comments', () => { + const input = '' + assert.strictEqual(cleanHtmlComments(input), input) + }) + + it('should not remove comments inside scripts or styles', () => { + const input = '' + assert.strictEqual(cleanHtmlComments(input), input) + }) + + it('should preserve comments inside scripts after comparison operators', () => { + const input = + '' + assert.strictEqual(cleanHtmlComments(input), input) + }) + + it('should remove comments after a closed script block', () => { + const input = + '
' + const expected = '
' + assert.strictEqual(cleanHtmlComments(input), expected) + }) + }) + + describe('stripTrailingLineWhitespace', () => { + it('should remove trailing whitespace from each rendered line', () => { + const input = '
\n Test\t\n
' + const expected = '
\n Test\n
' + + assert.strictEqual(stripTrailingLineWhitespace(input), expected) + }) + }) + + describe('resolveInjectionUrl', () => { + it('should resolve absolute URL path relative to build output', () => { + const buildOutput = '/abs/path/to/build-prod' + const assetPath = '/abs/path/to/build-prod/assets/css/main.css' + assert.strictEqual( + resolveInjectionUrl(assetPath, buildOutput), + '/assets/css/main.css' + ) + }) + + it('should handle backslashes by converting to forward slashes', () => { + const root = process.cwd() + const buildOutput = path.join(root, 'fake-build') + const assetPath = path.join(buildOutput, 'assets\\js\\app.js') + assert.strictEqual( + resolveInjectionUrl(assetPath, buildOutput), + '/assets/js/app.js' + ) + }) + }) + + describe('sortGlobalAssetPaths', () => { + it('should sort global assets by explicit build priority', () => { + const result = sortGlobalAssetPaths([ + '/build/assets/css/main.css', + '/build/assets/css/bootstrap.css', + '/build/assets/css/u-devstack.css', + '/build/assets/css/components.css', + ]) + + assert.deepStrictEqual(result, [ + '/build/assets/css/bootstrap.css', + '/build/assets/css/components.css', + '/build/assets/css/main.css', + '/build/assets/css/u-devstack.css', + ]) + }) + }) +}) diff --git a/tests/unit/images-logic.test.js b/tests/unit/images-logic.test.js new file mode 100644 index 0000000..b1ef00e --- /dev/null +++ b/tests/unit/images-logic.test.js @@ -0,0 +1,157 @@ +import assert from 'node:assert/strict' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import { validateImage } from '../../gulp/tasks/process-images.js' +import { + detectType, + optimizeWithSharp, +} from '../../gulp/utils/image-helpers.js' + +describe('Image Processing Logic (Unit)', () => { + describe('detectType', () => { + it('should return null for short or empty buffers', () => { + assert.strictEqual(detectType(null), null) + assert.strictEqual(detectType(Buffer.from([0x00, 0x01])), null) + }) + + it('should identify PNG signature', () => { + const buf = Buffer.from([0x89, 0x50, 0x4e, 0x47]) + assert.strictEqual(detectType(buf), 'png') + }) + + it('should identify JPG signature', () => { + const buf = Buffer.from([0xff, 0xd8, 0xff]) + assert.strictEqual(detectType(buf), 'jpg') + }) + + it('should identify WebP signature', () => { + const buf = Buffer.alloc(12) + buf.write('RIFF', 0) + buf.write('WEBP', 8) + assert.strictEqual(detectType(buf), 'webp') + }) + + it('should identify SVG signature', () => { + assert.strictEqual(detectType(Buffer.from('\n { + assert.strictEqual( + detectType(Buffer.from('not an image at all but quite a long string')), + null + ) + }) + }) + + describe('validateImage stream', () => { + let mockConsoleWarn + let mockConsoleError + + beforeEach(() => { + mockConsoleWarn = mock.method(console, 'warn', () => {}) + mockConsoleError = mock.method(console, 'error', () => {}) + }) + + afterEach(() => { + mockConsoleWarn.mock.restore() + mockConsoleError.mock.restore() + }) + + function createMockImageFile(filePath, contents) { + return { + path: filePath, + contents, + isBuffer: () => { + return Boolean(contents) + }, + isNull: () => { + return !contents + }, + } + } + + function testValidateImage(format, fileName, content, expectedIsInvalid) { + return new Promise((resolve) => { + const stream = validateImage(format) + const file = createMockImageFile(fileName, content) + + stream.on('data', (f) => { + if (expectedIsInvalid) { + assert.strictEqual(f._isInvalid, true) + } else { + assert.ok(!f._isInvalid) + } + resolve() + }) + stream.write(file) + }) + } + + it('should pass through non-buffer files', () => { + return new Promise((resolve) => { + const stream = validateImage('jpg') + const file = createMockImageFile('test.jpg', null) + + stream.on('data', (f) => { + assert.strictEqual(f.contents, null) + resolve() + }) + stream.write(file) + }) + }) + + it('should flag UTF-8 corrupted files', () => { + return testValidateImage( + 'png', + 'corrupted.png', + Buffer.from([0xef, 0xbf, 0xbd, 0x50, 0x4e, 0x47]), + true + ) + }) + + it('should flag unknown content as invalid', () => { + return testValidateImage( + 'jpg', + 'text.jpg', + Buffer.from('this is just some plain text that is long enough'), + true + ) + }) + + it('should accept valid matching content', () => { + return testValidateImage( + 'png', + 'valid.png', + Buffer.from([0x89, 0x50, 0x4e, 0x47]), + false + ) + }) + + it('should note mismatched extensions but not invalidate', () => { + return testValidateImage( + 'jpg', + 'actually-png.jpg', + Buffer.from([0x89, 0x50, 0x4e, 0x47]), + false + ) + }) + }) + + describe('optimizeWithSharp (failure state)', () => { + it('should throw an error when given an unsupported image buffer', async () => { + const inputBuffer = Buffer.from('not a valid image buffer') + await assert.rejects( + async () => { + await optimizeWithSharp(inputBuffer, 'jpg', 80) + }, + (err) => { + return err.message.includes('unsupported image format') + } + ) + }) + }) +}) diff --git a/tests/unit/lint-templates.test.js b/tests/unit/lint-templates.test.js new file mode 100644 index 0000000..6103679 --- /dev/null +++ b/tests/unit/lint-templates.test.js @@ -0,0 +1,54 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import lintTemplates from '../../gulp/tasks/lint-templates.js' +import { runInSandbox } from '../test-helpers.js' + +const originalCwd = process.cwd() + +describe('Lint Templates Task', { concurrency: false }, () => { + afterEach(() => { + process.chdir(originalCwd) + }) + + describe('lintTemplates', () => { + it('should log verbose message when no templates found', async () => { + await runInSandbox('lint', async (sandbox) => { + process.chdir(sandbox) + + process.env.VERBOSE = 'true' + const mockLog = mock.method(console, 'log', () => {}) + + try { + await lintTemplates() + + assert.ok( + mockLog.mock.calls.length > 0, + 'Should have called console.log' + ) + const loggedArgs = mockLog.mock.calls[0].arguments + assert.ok( + loggedArgs.some( + (arg) => + typeof arg === 'string' && + arg.includes('No templates found to lint') + ) + ) + } finally { + process.chdir(originalCwd) + mockLog.mock.restore() + delete process.env.VERBOSE + } + }) + }) + + it('should not throw error to prevent Gulp watch from crashing', async () => { + // The key behavior is that it catches errors and doesn't throw + await assert.doesNotReject(async () => { + await lintTemplates() + }) + }) + }) +}) diff --git a/tests/unit/page-asset-filter.test.js b/tests/unit/page-asset-filter.test.js new file mode 100644 index 0000000..33bd94e --- /dev/null +++ b/tests/unit/page-asset-filter.test.js @@ -0,0 +1,32 @@ +import assert from 'node:assert/strict' +import { describe, it } from 'node:test' + +import { isCriticalPageAsset } from '../e2e/page-asset-filter.js' + +describe('E2E page asset filter', () => { + it('should treat local CSS and JS as critical page assets', () => { + assert.strictEqual( + isCriticalPageAsset('http://localhost:3000/assets/css/index.css'), + true + ) + assert.strictEqual( + isCriticalPageAsset('http://localhost:3000/assets/js/main.js?cache=1'), + true + ) + }) + + it('should ignore non-CSS and non-JS assets such as external badges', () => { + assert.strictEqual( + isCriticalPageAsset( + 'https://github.com/cebreus/gulp-devstack/actions/workflows/github-pages-deploy-pnpm.yml/badge.svg' + ), + false + ) + assert.strictEqual( + isCriticalPageAsset( + 'https://img.shields.io/github/license/cebreus/gulp-devstack' + ), + false + ) + }) +}) diff --git a/tests/unit/page-link-report.test.js b/tests/unit/page-link-report.test.js new file mode 100644 index 0000000..b744d07 --- /dev/null +++ b/tests/unit/page-link-report.test.js @@ -0,0 +1,37 @@ +import assert from 'node:assert/strict' +import { describe, it } from 'node:test' + +import { formatBrokenLinksReport } from '../e2e/page-link-report.js' + +describe('Page Link Report', () => { + it('should include detailed broken-link lines in the assertion message', () => { + const message = formatBrokenLinksReport([ + { + url: 'https://example.test/missing', + status: 404, + parent: 'http://localhost:3000/about/', + }, + { + url: 'https://example.test/anchor', + status: 'BROKEN_ANCHOR', + parent: 'http://localhost:3000/', + }, + ]) + + assert.match(message, /Found 2 broken links\/anchors\./) + assert.match( + message, + /- https:\/\/example\.test\/missing \(Status: 404\) found on http:\/\/localhost:3000\/about\// + ) + assert.match( + message, + /- https:\/\/example\.test\/anchor \(Status: BROKEN_ANCHOR\) found on http:\/\/localhost:3000\// + ) + }) + + it('should return a short zero-count summary when no links are broken', () => { + const message = formatBrokenLinksReport([]) + + assert.strictEqual(message, 'Found 0 broken links/anchors.') + }) +}) diff --git a/tests/unit/private-streams.test.js b/tests/unit/private-streams.test.js new file mode 100644 index 0000000..5141d85 --- /dev/null +++ b/tests/unit/private-streams.test.js @@ -0,0 +1,80 @@ +import assert from 'node:assert/strict' +import { afterEach, beforeEach, describe, it } from 'node:test' + +import { + createPrivateFileFilter, + createTrackedFileCollector, +} from '../../gulp/utils/private-streams.js' + +describe('Private Streams Utility', () => { + function createMockFile(filePath) { + return { + path: filePath, + contents: Buffer.from('test'), + isBuffer: () => { + return true + }, + isNull: () => { + return false + }, + } + } + + describe('createPrivateFileFilter', () => { + it('should filter files based on the provided predicate', async () => { + const filter = createPrivateFileFilter((filePath) => { + return filePath.includes('private') + }) + const chunks = [] + + filter.on('data', (chunk) => { + chunks.push(chunk) + }) + + const p = new Promise((resolve, reject) => { + filter.on('end', resolve) + filter.on('error', reject) + }) + + filter.write(createMockFile('public.txt')) + filter.write(createMockFile('private.txt')) + filter.end() + + await p + + assert.strictEqual(chunks.length, 1) + assert.strictEqual(chunks[0].path, 'public.txt') + }) + }) + + describe('createTrackedFileCollector', () => { + it('should collect file paths and transform them', async () => { + const collection = [] + const collector = createTrackedFileCollector(collection, (filePath) => { + return `relative/${filePath}` + }) + + const chunks = [] + collector.on('data', (chunk) => { + chunks.push(chunk) + }) + + const p = new Promise((resolve, reject) => { + collector.on('end', resolve) + collector.on('error', reject) + }) + + collector.write(createMockFile('file1.txt')) + collector.write(createMockFile('file2.txt')) + collector.end() + + await p + + assert.strictEqual(chunks.length, 2) + assert.deepStrictEqual(collection, [ + 'relative/file1.txt', + 'relative/file2.txt', + ]) + }) + }) +}) diff --git a/tests/unit/process-data.test.js b/tests/unit/process-data.test.js new file mode 100644 index 0000000..db7787c --- /dev/null +++ b/tests/unit/process-data.test.js @@ -0,0 +1,178 @@ +import assert from 'node:assert/strict' +import path from 'node:path' +import { describe, it } from 'node:test' + +import { resolveDataExpressions } from '../../gulp/tasks/process-data.js' +import { + applySeoDefaults, + buildMenuData, + buildPageData, + buildRouteExpressionContext, + resolvePageLocation, +} from '../../gulp/utils/route-data.js' + +describe('Process Data Pure Logic - resolveDataExpressions', () => { + const context = { + site: { version: '4.5.0' }, + page: { title: 'Home' }, + } + + it('should leave plain strings untouched', () => { + const input = 'Hello World' + const result = resolveDataExpressions(input, context) + assert.strictEqual(result, 'Hello World') + }) + + it('should resolve simple Nunjucks expressions', () => { + const input = 'Version {{ site.version }}' + const result = resolveDataExpressions(input, context) + assert.strictEqual(result, 'Version 4.5.0') + }) + + it('should resolve expressions in nested objects', () => { + const input = { + hero: { + badge: 'v{{ site.version }}', + text: 'Welcome to {{ page.title }}', + }, + } + const expected = { + hero: { + badge: 'v4.5.0', + text: 'Welcome to Home', + }, + } + const result = resolveDataExpressions(input, context) + assert.deepStrictEqual(result, expected) + }) + + it('should resolve expressions in arrays', () => { + const input = ['{{ site.version }}', 'other'] + const expected = ['4.5.0', 'other'] + const result = resolveDataExpressions(input, context) + assert.deepStrictEqual(result, expected) + }) + + it('should handle invalid expressions gracefully by returning original string', () => { + const input = '{{ site.invalid.path }}' + let result + assert.doesNotThrow(() => { + result = resolveDataExpressions(input, context) + }) + // Graceful degradation: must return a string (either empty or original) + assert.strictEqual( + typeof result, + 'string', + 'Result must be a string on invalid expression' + ) + }) + + it('should throw an error for malformed nunjucks syntax', () => { + const input = '{% if true %}' // Missing endif causes a Nunjucks compile error + assert.throws( + () => resolveDataExpressions(input, context), + /\[ProcessData\] Failed to render expression/ + ) + }) +}) + +describe('Process Data Pure Logic - buildRouteExpressionContext', () => { + it('should expose site and page objects for frontmatter rendering', () => { + const result = buildRouteExpressionContext({ + frontmatter: { title: 'Home' }, + siteConfig: { version: '4.5.0' }, + }) + + assert.deepStrictEqual(result, { + site: { version: '4.5.0' }, + page: { title: 'Home' }, + }) + }) +}) + +describe('Process Data Pure Logic - resolvePageLocation', () => { + const routesRoot = './src/routes' + const absRoutesRoot = path.resolve(routesRoot) + + it('should resolve root index correctly', () => { + const filePath = path.join(absRoutesRoot, 'index.md') + const result = resolvePageLocation(filePath, 'index', routesRoot) + assert.strictEqual(result.pagePath, '/') + assert.strictEqual(result.relativeDir, '') + }) + + it('should resolve nested index correctly', () => { + const filePath = path.join(absRoutesRoot, 'about/index.md') + const result = resolvePageLocation(filePath, 'index', routesRoot) + assert.strictEqual(result.pagePath, '/about/') + assert.strictEqual(result.relativeDir, 'about') + }) + + it('should resolve deep nested file correctly', () => { + const filePath = path.join(absRoutesRoot, 'blog/2024/post.md') + const result = resolvePageLocation(filePath, 'post', routesRoot) + assert.strictEqual(result.pagePath, '/blog/2024/post') + assert.strictEqual(result.relativeDir, 'blog/2024') + }) +}) + +describe('Process Data Pure Logic - applySeoDefaults', () => { + it('should generate canonical URL correctly', () => { + const pageData = { title: 'Test' } + const siteConfig = { baseUrl: 'https://example.com' } + const result = applySeoDefaults(pageData, '/my-page', siteConfig) + + assert.strictEqual(result.seo.canonicalSelf, 'https://example.com/my-page') + assert.strictEqual(result.openGraph.url, 'https://example.com/my-page') + }) + + it('should preserve existing SEO metadata', () => { + const pageData = { seo: { title_suffix: ' - Custom' } } + const result = applySeoDefaults(pageData, '/', { baseUrl: '' }) + assert.strictEqual(result.seo.title_suffix, ' - Custom') + }) +}) + +describe('Process Data Pure Logic - buildPageData', () => { + it('should assemble full page payload with auto pageId', () => { + const frontmatter = { title: 'Hello' } + const content = '# Body' + const result = buildPageData({ + frontmatter, + content, + fileName: 'my-file', + pagePath: '/blog/my-file', + }) + + assert.strictEqual(result.title, 'Hello') + assert.strictEqual(result.content, '# Body') + assert.strictEqual(result.pageId, 'my-file') + assert.strictEqual(result.path, '/blog/my-file') + }) + + it('should use "home" as pageId for root index', () => { + const result = buildPageData({ + frontmatter: {}, + content: '', + fileName: 'index', + pagePath: '/', + }) + assert.strictEqual(result.pageId, 'home') + }) +}) + +describe('Process Data Pure Logic - buildMenuData', () => { + it('should sort menu entries by order', () => { + const result = buildMenuData([ + { name: 'Second', order: 2 }, + { name: 'First', order: 1 }, + ]) + + assert.deepStrictEqual(result, { + menu: [ + { name: 'First', order: 1 }, + { name: 'Second', order: 2 }, + ], + }) + }) +}) diff --git a/tests/unit/process-js.test.js b/tests/unit/process-js.test.js new file mode 100644 index 0000000..96ad7a1 --- /dev/null +++ b/tests/unit/process-js.test.js @@ -0,0 +1,62 @@ +import assert from 'node:assert/strict' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import processJs, { getEsbuildConfig } from '../../gulp/tasks/process-js.js' + +describe('JS Pipeline (Unit)', () => { + const MOCK_BUILD_CONFIG = { + minifyJs: true, + sourceMaps: false, + } + + describe('getEsbuildConfig', () => { + it('should return default config when no options provided', () => { + const esConfig = getEsbuildConfig({}, MOCK_BUILD_CONFIG) + assert.strictEqual(esConfig.bundle, false) + assert.strictEqual(esConfig.minify, true) + assert.strictEqual(esConfig.sourcemap, false) + }) + + it('should override global config with local options', () => { + const esConfig = getEsbuildConfig( + { minify: false, sourceMaps: true }, + MOCK_BUILD_CONFIG + ) + assert.strictEqual(esConfig.minify, false) + assert.strictEqual(esConfig.sourcemap, 'external') + }) + + it('should use explicit ESM format by default', () => { + const esConfig = getEsbuildConfig({}, MOCK_BUILD_CONFIG) + assert.strictEqual(esConfig.format, 'esm') + }) + }) + + describe('processJs Guard Clauses', () => { + let mockConsoleWarn + + beforeEach(() => { + mockConsoleWarn = mock.method(console, 'warn', () => {}) + }) + + afterEach(() => { + mockConsoleWarn.mock.restore() + }) + + it('should resolve early when no files provided', async () => { + await processJs(MOCK_BUILD_CONFIG, [], './dist') + await processJs(MOCK_BUILD_CONFIG, null, './dist') + + assert.strictEqual( + MOCK_BUILD_CONFIG.minifyJs, + true, + 'Precondition: mock config must be prod-like' + ) + assert.strictEqual( + mockConsoleWarn.mock.calls.length, + 2, + 'Should emit exactly one warn per empty call' + ) + }) + }) +}) diff --git a/tests/unit/run-njklint.test.js b/tests/unit/run-njklint.test.js new file mode 100644 index 0000000..587bfd6 --- /dev/null +++ b/tests/unit/run-njklint.test.js @@ -0,0 +1,49 @@ +import assert from 'node:assert/strict' +import { describe, it } from 'node:test' + +import { filterNjkLintOutput, isDirectRun } from '../../scripts/run-njklint.js' + +describe('run-njklint', () => { + it('should remove noisy directory and file banner lines', () => { + const output = [ + 'Linting directory: /repo/src', + 'Linting file: /repo/src/index.njk', + 'No errors found! πŸŽ‰', + 'Found 1 issue(s):', + ].join('\n') + + assert.strictEqual( + filterNjkLintOutput(output), + ['No errors found! πŸŽ‰', 'Found 1 issue(s):'].join('\n') + ) + }) + + it('should preserve unrelated output exactly', () => { + const output = 'Fixed issues in src/index.njk\nNo errors found! πŸŽ‰' + + assert.strictEqual(filterNjkLintOutput(output), output) + }) + + it('should compare direct-run paths after URL and argv normalization', () => { + const repoPath = process.platform === 'win32' ? 'C:\\repo' : '/repo' + const scriptPath = + repoPath + + (process.platform === 'win32' + ? '\\scripts\\run-njklint.js' + : '/scripts/run-njklint.js') + const moduleUrl = + 'file://' + + (process.platform === 'win32' + ? '/' + scriptPath.replace(/\\/g, '/') + : scriptPath) + + assert.equal(isDirectRun(moduleUrl, scriptPath), true) + assert.equal( + isDirectRun( + moduleUrl, + repoPath + (process.platform === 'win32' ? '\\other.js' : '/other.js') + ), + false + ) + }) +}) diff --git a/tests/unit/sass-helpers.test.js b/tests/unit/sass-helpers.test.js new file mode 100644 index 0000000..2e486e0 --- /dev/null +++ b/tests/unit/sass-helpers.test.js @@ -0,0 +1,54 @@ +import assert from 'node:assert/strict' +import path from 'node:path' +import { describe, it } from 'node:test' + +import { resolveConfig } from '../../gulp/config.js' +import * as sassModule from '../../gulp/tasks/process-sass.js' +import { buildSassIncludePaths } from '../../gulp/tasks/process-sass.js' + +describe('Sass Helpers (Unit)', () => { + const config = resolveConfig('dev') + + describe('public API boundaries', () => { + it('should keep pipeline glue internal and expose only explicit seams', () => { + assert.ok('buildSassIncludePaths' in sassModule) + assert.ok('getSassCompilerOptions' in sassModule) + assert.ok(!('buildSassPipeline' in sassModule)) + assert.ok(!('processSass' in sassModule)) + }) + }) + + describe('buildSassIncludePaths', () => { + it('should return standard include paths by default', () => { + const paths = buildSassIncludePaths(null, config) + + const hasSrc = paths.some((p) => { + return p.endsWith('src') + }) + const hasNodeModules = paths.some((p) => { + return p.endsWith('node_modules') + }) + const hasCwd = paths.includes(process.cwd()) + + assert.ok(hasSrc, 'Should include src directory') + assert.ok(hasNodeModules, 'Should include node_modules') + assert.ok(hasCwd, 'Should include current working directory') + }) + + it('should append extra path when provided', () => { + const extraPath = 'src/components/special' + const paths = buildSassIncludePaths(extraPath, config) + + const hasExtra = paths.includes(path.resolve(extraPath)) + assert.ok(hasExtra, 'Should include the extra specified path') + }) + + it('should correctly resolve paths with custom buildConfig', () => { + const mockConfig = { sassBase: './custom/scss' } + const paths = buildSassIncludePaths(null, mockConfig) + + const hasCustomBase = paths.includes(path.resolve(mockConfig.sassBase)) + assert.ok(hasCustomBase, 'Should respect sassBase from provided config') + }) + }) +}) diff --git a/tests/unit/validate-html.test.js b/tests/unit/validate-html.test.js new file mode 100644 index 0000000..70f20a9 --- /dev/null +++ b/tests/unit/validate-html.test.js @@ -0,0 +1,124 @@ +import assert from 'node:assert/strict' +import path from 'node:path' +import { afterEach, beforeEach, describe, it, mock } from 'node:test' + +import validateHtml from '../../gulp/tasks/validate-html.js' +import { runInSandbox, writeFixtures } from '../test-helpers.js' + +describe('Validate HTML Task', () => { + let mockConsoleError + let mockConsoleWarn + let mockConsoleLog + + beforeEach(() => { + mockConsoleError = mock.method(console, 'error', () => {}) + mockConsoleWarn = mock.method(console, 'warn', () => {}) + mockConsoleLog = mock.method(console, 'log', () => {}) + }) + + afterEach(() => { + mockConsoleError.mock.restore() + mockConsoleWarn.mock.restore() + mockConsoleLog.mock.restore() + }) + + describe('validateHtml', () => { + it('should return a Transform stream', () => { + const stream = validateHtml('src/**/*.html') + assert.ok( + stream.constructor.name === 'Transform', + 'Should return a Transform stream' + ) + }) + + it('should filter out private files and process public files', async () => { + await runInSandbox('validate-html', async (sandboxPath) => { + await writeFixtures(sandboxPath, { + 'src/public.html': + 'Test

Public

', + 'src/_private.html': + 'Test

Private

', + }) + + const globPath = path + .join(sandboxPath, 'src/**/*.html') + .replace(/\\/g, '/') + const stream = validateHtml(globPath) + const processedFiles = [] + + stream.on('data', (file) => { + processedFiles.push(path.basename(file.path)) + }) + + await new Promise((resolve, reject) => { + stream.on('finish', resolve) + stream.on('error', reject) + }) + + assert.strictEqual( + processedFiles.length, + 1, + 'Should only process one file' + ) + assert.strictEqual( + processedFiles[0], + 'public.html', + 'Should process public.html and filter out _private.html' + ) + }) + }) + + it('should reject stream when HTML contains validation errors', async () => { + await runInSandbox('validate-html-error', async (sandboxPath) => { + //
is deprecated and triggers an error in recommended rules + await writeFixtures(sandboxPath, { + 'src/invalid.html': + 'Test
Invalid
', + }) + + const globPath = path + .join(sandboxPath, 'src/**/*.html') + .replace(/\\/g, '/') + const stream = validateHtml(globPath) + + await assert.rejects( + () => + new Promise((resolve, reject) => { + stream.on('finish', resolve) + stream.on('error', reject) + }), + /HTML validation finished: \d+ errors/ + ) + + assert.ok( + mockConsoleError.mock.calls.length > 0, + 'Expected validation errors to be intercepted by the test console mock' + ) + assert.strictEqual(mockConsoleWarn.mock.calls.length, 0) + assert.strictEqual(mockConsoleLog.mock.calls.length, 0) + }) + }) + + it('should ignore empty directories (null files)', async () => { + await runInSandbox('validate-html-null', async (sandboxPath) => { + // Write just a directory, src() without allowEmpty will skip it or read it as null if dot/allowEmpty + await writeFixtures(sandboxPath, { + 'src/empty_dir/.keep': '', + }) + + // By targeting the directory itself with allowEmpty: true, or just letting src() read it. + // Actually, validateHtml uses `src(input)` with default options. + // It's easier to verify it doesn't crash on an empty directory match. + const globPath = path + .join(sandboxPath, 'src/empty_dir') + .replace(/\\/g, '/') + const stream = validateHtml(globPath) + + await new Promise((resolve, reject) => { + stream.on('finish', resolve) + stream.on('error', reject) + }) + }) + }) + }) +}) diff --git a/tests/unit/windows-compat.test.js b/tests/unit/windows-compat.test.js new file mode 100644 index 0000000..226fd83 --- /dev/null +++ b/tests/unit/windows-compat.test.js @@ -0,0 +1,81 @@ +import assert from 'node:assert/strict' +import { describe, it } from 'node:test' + +import { getDirFromGlob } from '../../gulp/utils/core.js' +import { resolvePageLocation } from '../../gulp/utils/route-data.js' +import { isDirectRun } from '../../scripts/run-njklint.js' + +describe('Windows Compatibility Robustness (Cross-Platform Logic)', () => { + describe('getDirFromGlob', () => { + it('should extract directory using forward slashes', () => { + assert.strictEqual(getDirFromGlob('src/assets/**/*.js'), 'src/assets/') + }) + + it('should extract directory using backward slashes (Windows style)', () => { + assert.strictEqual( + getDirFromGlob('src\\assets\\**\\*.js'), + 'src\\assets\\' + ) + }) + + it('should handle mixed slashes gracefully', () => { + assert.strictEqual( + getDirFromGlob('src/assets\\scripts/**/*.js'), + 'src/assets\\scripts/' + ) + }) + }) + + describe('resolvePageLocation (Routing)', () => { + const routesRoot = '/absolute/repo/src/routes' + + it('should normalize Windows paths to POSIX URLs', () => { + const filePath = '/absolute/repo/src/routes/nested\\page.njk' + const { relativeDir, pagePath } = resolvePageLocation( + filePath, + 'page', + routesRoot + ) + + assert.strictEqual( + relativeDir, + 'nested', + 'relativeDir should use forward slashes' + ) + assert.strictEqual( + pagePath, + '/nested/page', + 'pagePath should be a valid URL' + ) + }) + + it('should handle deep Windows nesting', () => { + const filePath = '/absolute/repo/src/routes/a\\b\\c\\index.njk' + const { relativeDir, pagePath } = resolvePageLocation( + filePath, + 'index', + routesRoot + ) + + assert.strictEqual(relativeDir, 'a/b/c') + assert.strictEqual(pagePath, '/a/b/c/') + }) + }) + + describe('isDirectRun (Case Sensitivity & Drive Letters)', () => { + it('should return true for case-insensitive matches on Windows', () => { + const moduleUrl = 'file:///C:/Repo/scripts/hook.js' + const argvPath = 'c:\\repo\\scripts\\hook.js' + + if (process.platform === 'win32') { + assert.strictEqual(isDirectRun(moduleUrl, argvPath), true) + } else { + assert.strictEqual(isDirectRun('file:///repo/a.js', '/repo/a.js'), true) + assert.strictEqual( + isDirectRun('file:///repo/A.js', '/repo/a.js'), + false + ) + } + }) + }) +}) diff --git a/tests/visual/helpers.js b/tests/visual/helpers.js new file mode 100644 index 0000000..a680292 --- /dev/null +++ b/tests/visual/helpers.js @@ -0,0 +1,180 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs' +import { createServer } from 'node:http' +import path from 'node:path' +import sharp from 'sharp' + +const DEFAULT_HTML_EXTENSIONS = ['.html'] +const CONTENT_TYPES = { + '.css': 'text/css; charset=utf-8', + '.html': 'text/html; charset=utf-8', + '.ico': 'image/x-icon', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.js': 'text/javascript; charset=utf-8', + '.json': 'application/json; charset=utf-8', + '.png': 'image/png', + '.svg': 'image/svg+xml; charset=utf-8', + '.txt': 'text/plain; charset=utf-8', + '.webp': 'image/webp', + '.woff': 'font/woff', + '.woff2': 'font/woff2', +} +const PIXEL_CHANNELS = 4 +const PIXEL_DIFF_THRESHOLD = 16 + +function normalizeRequestPath(pathname) { + if (!pathname || pathname === '/') { + return '/index.html' + } + + if (pathname.endsWith('/')) { + return `${pathname}index.html` + } + + return pathname +} + +function resolveStaticFile(rootDir, requestPath) { + const normalizedPath = normalizeRequestPath(requestPath) + const decodedPath = decodeURIComponent(normalizedPath) + const unsafePath = path.join(rootDir, decodedPath) + const resolvedPath = path.resolve(unsafePath) + const resolvedRoot = path.resolve(rootDir) + + if (!resolvedPath.startsWith(resolvedRoot)) { + return null + } + + if (fs.existsSync(resolvedPath) && fs.statSync(resolvedPath).isFile()) { + return resolvedPath + } + + const parsedPath = path.parse(resolvedPath) + if (parsedPath.ext) { + return null + } + + for (const extension of DEFAULT_HTML_EXTENSIONS) { + const extensionCandidate = `${resolvedPath}${extension}` + if ( + fs.existsSync(extensionCandidate) && + fs.statSync(extensionCandidate).isFile() + ) { + return extensionCandidate + } + } + + return null +} + +function getContentType(filePath) { + const extension = path.extname(filePath).toLowerCase() + return CONTENT_TYPES[extension] || 'application/octet-stream' +} + +export async function startStaticServer(rootDir) { + const server = createServer(async (req, res) => { + try { + const origin = `http://${req.headers.host || '127.0.0.1'}` + const url = new URL(req.url || '/', origin) + const filePath = resolveStaticFile(rootDir, url.pathname) + + if (!filePath) { + res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' }) + res.end('Not found') + return + } + + const content = await fs.promises.readFile(filePath) + res.writeHead(200, { 'Content-Type': getContentType(filePath) }) + res.end(content) + } catch (error) { + res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' }) + res.end(`Server error: ${error.message}`) + } + }) + + await new Promise((resolve, reject) => { + server.once('error', reject) + server.listen(0, '127.0.0.1', resolve) + }) + + const address = server.address() + assert.ok(address && typeof address === 'object', 'Server did not bind') + + return { + baseUrl: `http://127.0.0.1:${address.port}`, + close: async () => { + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + return reject(error) + } + resolve() + }) + }) + }, + } +} + +async function readRawImage(imageBuffer) { + const { data, info } = await sharp(imageBuffer) + .ensureAlpha() + .raw() + .toBuffer({ resolveWithObject: true }) + + return { data, width: info.width, height: info.height } +} + +function getChannelDifference(channelA, channelB) { + return Math.abs(channelA - channelB) +} + +function compareRawPixels(leftData, rightData) { + let diffPixels = 0 + const totalPixels = leftData.length / PIXEL_CHANNELS + + for (let index = 0; index < leftData.length; index += PIXEL_CHANNELS) { + const redDiff = getChannelDifference(leftData[index], rightData[index]) + const greenDiff = getChannelDifference( + leftData[index + 1], + rightData[index + 1] + ) + const blueDiff = getChannelDifference( + leftData[index + 2], + rightData[index + 2] + ) + const alphaDiff = getChannelDifference( + leftData[index + 3], + rightData[index + 3] + ) + + if ( + redDiff > PIXEL_DIFF_THRESHOLD || + greenDiff > PIXEL_DIFF_THRESHOLD || + blueDiff > PIXEL_DIFF_THRESHOLD || + alphaDiff > PIXEL_DIFF_THRESHOLD + ) { + diffPixels += 1 + } + } + + return { + diffPixels, + totalPixels, + diffRatio: totalPixels === 0 ? 0 : diffPixels / totalPixels, + } +} + +export async function compareScreenshots(leftImage, rightImage) { + const [left, right] = await Promise.all([ + readRawImage(leftImage), + readRawImage(rightImage), + ]) + + assert.strictEqual(left.width, right.width, 'Screenshot widths differ') + assert.strictEqual(left.height, right.height, 'Screenshot heights differ') + + return compareRawPixels(left.data, right.data) +} diff --git a/tests/visual/parity.test.js b/tests/visual/parity.test.js new file mode 100644 index 0000000..eb89b55 --- /dev/null +++ b/tests/visual/parity.test.js @@ -0,0 +1,165 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { after, before, describe, it } from 'node:test' +import { chromium } from '@playwright/test' + +import { compareScreenshots, startStaticServer } from './helpers.js' + +const ROUTES = ['/', '/404.html'] +const THEMES = ['light', 'dark'] +const VIEWPORTS = [ + { name: 'xs', width: 390, height: 844 }, + { name: 'sm', width: 576, height: 900 }, + { name: 'md', width: 768, height: 1024 }, + { name: 'lg', width: 992, height: 1000 }, + { name: 'xl', width: 1200, height: 1000 }, + { name: 'xxl', width: 1400, height: 1000 }, +] +const MAX_DIFF_PIXEL_RATIO = 0 +const DEFAULT_WAIT_AFTER_THEME_MS = 150 + +let browser = null +let buildServer = null +let exportServer = null + +function toSnapshotName(routePath) { + if (routePath === '/') { + return 'home' + } + + return routePath + .replace('.html', '') + .replaceAll('/', '-') + .replace(/^-|-$/g, '') +} + +async function assertArtifactsExist() { + const rootDir = process.cwd() + await Promise.all([ + fs.access(path.join(rootDir, 'build-prod', 'index.html')), + fs.access(path.join(rootDir, 'build-export', 'index.html')), + ]) +} + +async function applyTheme(page, theme) { + await page.emulateMedia({ colorScheme: theme }) + await page.evaluate((nextTheme) => { + document.documentElement.dataset.bsTheme = nextTheme + if (document.body) { + document.body.dataset.bsTheme = nextTheme + } + }, theme) + await page.waitForTimeout(DEFAULT_WAIT_AFTER_THEME_MS) +} + +async function stabilizePage(page) { + await page.waitForLoadState('networkidle') + await page.evaluate(async () => { + await document.fonts.ready + }) + await page.addStyleTag({ + content: ` + *, *::before, *::after { + animation: none !important; + transition: none !important; + caret-color: transparent !important; + } + html { + scrollbar-width: none !important; + -webkit-font-smoothing: antialiased !important; + -moz-osx-font-smoothing: grayscale !important; + } + ::-webkit-scrollbar { + display: none !important; + } + `, + }) +} + +async function capturePageScreenshot(baseUrl, routePath, viewport, theme) { + const context = await browser.newContext({ + viewport: { + width: viewport.width, + height: viewport.height, + }, + deviceScaleFactor: 1, + }) + + try { + const page = await context.newPage() + await page.goto(`${baseUrl}${routePath}`) + await stabilizePage(page) + await applyTheme(page, theme) + return await page.screenshot({ fullPage: true }) + } finally { + await context.close() + } +} + +describe('Visual Pipeline Parity', { timeout: 60000 }, () => { + before(async () => { + await assertArtifactsExist() + browser = await chromium.launch() + + const rootDir = process.cwd() + ;[buildServer, exportServer] = await Promise.all([ + startStaticServer(path.join(rootDir, 'build-prod')), + startStaticServer(path.join(rootDir, 'build-export')), + ]) + }) + + after(async () => { + if (browser) { + await browser.close() + } + + if (buildServer) { + await buildServer.close() + } + + if (exportServer) { + await exportServer.close() + } + }) + + async function assertVisualParity(routePath, theme, viewportName) { + const viewport = VIEWPORTS.find((v) => { + return v.name === viewportName + }) + assert.ok( + viewport, + `Unknown viewport "${viewportName}". Available viewports: ${VIEWPORTS.map((v) => v.name).join(', ')}.` + ) + + const testName = `${toSnapshotName(routePath)} | ${theme} | ${viewport.name}` + + const [buildScreenshot, exportScreenshot] = await Promise.all([ + capturePageScreenshot(buildServer.baseUrl, routePath, viewport, theme), + capturePageScreenshot(exportServer.baseUrl, routePath, viewport, theme), + ]) + + const diff = await compareScreenshots(buildScreenshot, exportScreenshot) + + assert.ok( + diff.diffRatio <= MAX_DIFF_PIXEL_RATIO, + [ + `Visual mismatch between build-prod and build-export for ${testName}.`, + `Different pixels: ${diff.diffPixels}/${diff.totalPixels}.`, + `Diff ratio: ${diff.diffRatio}.`, + ].join(' ') + ) + } + + it('should keep build and export visually identical for Home (Mobile Light)', async () => { + await assertVisualParity('/', 'light', 'xs') + }) + + it('should keep build and export visually identical for Home (Desktop Dark)', async () => { + await assertVisualParity('/', 'dark', 'xl') + }) + + it('should keep build and export visually identical for 404 (Desktop Light)', async () => { + await assertVisualParity('/404.html', 'light', 'xl') + }) +})