diff --git a/.github/workflows/deploy_docs_3x.yml b/.github/workflows/deploy_docs_3x.yml
index 1e6d73515..dfd9facaf 100644
--- a/.github/workflows/deploy_docs_3x.yml
+++ b/.github/workflows/deploy_docs_3x.yml
@@ -21,3 +21,4 @@ jobs:
with:
git_remote_url: 'ssh://dokku@apps.cakephp.org:22/bake-docs-3'
ssh_private_key: ${{ secrets.DOKKU_SSH_PRIVATE_KEY }}
+ branch: '3.x'
diff --git a/.github/workflows/docs-validation.yml b/.github/workflows/docs-validation.yml
new file mode 100644
index 000000000..3b558cbed
--- /dev/null
+++ b/.github/workflows/docs-validation.yml
@@ -0,0 +1,27 @@
+name: Documentation Validation
+
+on:
+ push:
+ branches:
+ - 3.x
+ paths:
+ - 'docs/**'
+ - '.github/**'
+ pull_request:
+ paths:
+ - 'docs/**'
+ - '.github/**'
+
+jobs:
+ validate:
+ uses: cakephp/.github/.github/workflows/docs-validation.yml@5.x
+ with:
+ docs-path: 'docs'
+ vitepress-path: 'docs/.vitepress'
+ enable-config-js-check: true
+ enable-json-lint: true
+ enable-toc-check: true
+ enable-spell-check: true
+ enable-markdown-lint: true
+ enable-link-check: true
+ tools-ref: '3.x'
diff --git a/Dockerfile b/Dockerfile
index 7acfb27ee..832f6bc1c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,26 +1,36 @@
-# Basic docker based environment
-# Necessary to trick dokku into building the documentation
-# using dockerfile instead of herokuish
-FROM ubuntu:22.04
-
-# Add basic tools
-RUN apt-get update && \
- apt-get install -y build-essential \
- software-properties-common \
- curl \
- git \
- libxml2 \
- libffi-dev \
- libssl-dev
-
-# Prevent interactive timezone input
-ENV DEBIAN_FRONTEND=noninteractive
-RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php && \
- apt-get update && \
- apt-get install -y php8.1-cli php8.1-mbstring php8.1-xml php8.1-zip php8.1-intl php8.1-opcache php8.1-sqlite
-
-WORKDIR /code
-
-VOLUME ["/code"]
-
-CMD [ '/bin/bash' ]
+# ----------------------
+# 1. Build stage
+# ----------------------
+FROM node:22-alpine AS builder
+
+# Git is required because docs/package.json pulls a dependency from GitHub.
+RUN apk add --no-cache git openssh-client
+
+WORKDIR /app/docs
+
+# Copy dependency manifests first to preserve Docker layer caching.
+COPY docs/ ./
+RUN npm ci
+
+# Increase max-old-space-size to avoid memory issues during build
+ENV NODE_OPTIONS="--max-old-space-size=8192"
+
+# Build the site.
+RUN npm run docs:build
+
+# ----------------------
+# 2. Runtime stage (nginx)
+# ----------------------
+FROM nginx:1.27-alpine AS runner
+
+# Copy built files
+COPY --from=builder /app/docs/.vitepress/dist /usr/share/nginx/html
+
+# Expose port
+EXPOSE 80
+
+# Health check (optional)
+HEALTHCHECK CMD wget --quiet --tries=1 --spider http://localhost:80/ || exit 1
+
+# Start nginx
+CMD ["nginx", "-g", "daemon off;"]
diff --git a/docs.Dockerfile b/docs.Dockerfile
deleted file mode 100644
index eb134b0ee..000000000
--- a/docs.Dockerfile
+++ /dev/null
@@ -1,24 +0,0 @@
-# Generate the HTML output.
-FROM ghcr.io/cakephp/docs-builder as builder
-
-# Copy entire repo in with .git so we can build all versions in one image.
-COPY docs /data/docs
-
-RUN cd /data/docs-builder \
- && make website LANGS="en es fr ja pt ru" SOURCE=/data/docs DEST=/data/website/
-
-# Build a small nginx container with just the static site in it.
-FROM ghcr.io/cakephp/docs-builder:runtime as runtime
-
-# Configure search index script
-ENV LANGS="en es fr ja pt ru"
-ENV SEARCH_SOURCE="/usr/share/nginx/html"
-ENV SEARCH_URL_PREFIX="/bake/3"
-
-COPY --from=builder /data/docs /data/docs
-COPY --from=builder /data/website /data/website
-COPY --from=builder /data/docs-builder/nginx.conf /etc/nginx/conf.d/default.conf
-
-# Copy docs into place.
-RUN cp -R /data/website/html/* /usr/share/nginx/html \
- && rm -rf /data/website
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 000000000..974d64e40
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,4 @@
+node_modules
+*/public/
+.vitepress/cache
+.vitepress/dist
diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js
new file mode 100644
index 000000000..8f6f2041d
--- /dev/null
+++ b/docs/.vitepress/config.js
@@ -0,0 +1,92 @@
+import baseConfig from '@cakephp/docs-skeleton/config'
+import { createRequire } from 'module'
+
+const require = createRequire(import.meta.url)
+const tocEn = require('./toc_en.json')
+const tocEs = require('./toc_es.json')
+const tocFr = require('./toc_fr.json')
+const tocJa = require('./toc_ja.json')
+const tocPt = require('./toc_pt.json')
+const tocRu = require('./toc_ru.json')
+
+const versions = {
+ text: '3.x',
+ items: [
+ { text: '3.x (current)', link: 'https://book.cakephp.org/bake/3/', target: '_self' },
+ { text: '2.x', link: 'https://book.cakephp.org/bake/2.x/', target: '_self' },
+ { text: '1.x', link: 'https://book.cakephp.org/bake/1.x/', target: '_self' },
+ ],
+}
+
+export default {
+ extends: baseConfig,
+ srcDir: '.',
+ title: 'Bake',
+ description: 'CakePHP Bake Documentation',
+ base: '/bake/3/',
+ rewrites: {
+ 'en/:slug*': ':slug*',
+ },
+ sitemap: {
+ hostname: 'https://book.cakephp.org/bake/3/',
+ },
+ themeConfig: {
+ socialLinks: [
+ { icon: 'github', link: 'https://github.com/cakephp/bake' },
+ ],
+ editLink: {
+ pattern: 'https://github.com/cakephp/bake/edit/3.x/docs/:path',
+ text: 'Edit this page on GitHub',
+ },
+ sidebar: tocEn,
+ nav: [
+ { text: 'CakePHP', link: 'https://cakephp.org' },
+ { text: 'API', link: 'https://api.cakephp.org/bake/' },
+ { ...versions },
+ ],
+ },
+ locales: {
+ root: {
+ label: 'English',
+ lang: 'en',
+ themeConfig: {
+ sidebar: tocEn,
+ },
+ },
+ es: {
+ label: 'Español',
+ lang: 'es',
+ themeConfig: {
+ sidebar: tocEs,
+ },
+ },
+ fr: {
+ label: 'Français',
+ lang: 'fr',
+ themeConfig: {
+ sidebar: tocFr,
+ },
+ },
+ ja: {
+ label: '日本語',
+ lang: 'ja',
+ themeConfig: {
+ sidebar: tocJa,
+ },
+ },
+ pt: {
+ label: 'Português',
+ lang: 'pt',
+ themeConfig: {
+ sidebar: tocPt,
+ },
+ },
+ ru: {
+ label: 'Русский',
+ lang: 'ru',
+ themeConfig: {
+ sidebar: tocRu,
+ },
+ },
+ },
+}
diff --git a/docs/.vitepress/theme/index.js b/docs/.vitepress/theme/index.js
new file mode 100644
index 000000000..e33e19ec9
--- /dev/null
+++ b/docs/.vitepress/theme/index.js
@@ -0,0 +1 @@
+export { default } from '@cakephp/docs-skeleton'
diff --git a/docs/.vitepress/toc_en.json b/docs/.vitepress/toc_en.json
new file mode 100644
index 000000000..ae8a22c60
--- /dev/null
+++ b/docs/.vitepress/toc_en.json
@@ -0,0 +1,13 @@
+{
+ "/": [
+ {
+ "text": "CakePHP Bake",
+ "collapsed": false,
+ "items": [
+ { "text": "Bake Console", "link": "/" },
+ { "text": "Code Generation with Bake", "link": "/usage" },
+ { "text": "Extending Bake", "link": "/development" }
+ ]
+ }
+ ]
+}
diff --git a/docs/.vitepress/toc_es.json b/docs/.vitepress/toc_es.json
new file mode 100644
index 000000000..98b6e2cb0
--- /dev/null
+++ b/docs/.vitepress/toc_es.json
@@ -0,0 +1,13 @@
+{
+ "/es/": [
+ {
+ "text": "CakePHP Bake",
+ "collapsed": false,
+ "items": [
+ { "text": "Consola Bake", "link": "/es/" },
+ { "text": "Crear código con Bake", "link": "/es/usage" },
+ { "text": "Extending Bake", "link": "/es/development" }
+ ]
+ }
+ ]
+}
diff --git a/docs/.vitepress/toc_fr.json b/docs/.vitepress/toc_fr.json
new file mode 100644
index 000000000..eceb87131
--- /dev/null
+++ b/docs/.vitepress/toc_fr.json
@@ -0,0 +1,13 @@
+{
+ "/fr/": [
+ {
+ "text": "CakePHP Bake",
+ "collapsed": false,
+ "items": [
+ { "text": "Console Bake", "link": "/fr/" },
+ { "text": "Génération de code avec Bake", "link": "/fr/usage" },
+ { "text": "Étendre Bake", "link": "/fr/development" }
+ ]
+ }
+ ]
+}
diff --git a/docs/.vitepress/toc_ja.json b/docs/.vitepress/toc_ja.json
new file mode 100644
index 000000000..a459e238c
--- /dev/null
+++ b/docs/.vitepress/toc_ja.json
@@ -0,0 +1,13 @@
+{
+ "/ja/": [
+ {
+ "text": "CakePHP Bake",
+ "collapsed": false,
+ "items": [
+ { "text": "Bake コンソール", "link": "/ja/" },
+ { "text": "Bake でコード生成", "link": "/ja/usage" },
+ { "text": "Bake の拡張", "link": "/ja/development" }
+ ]
+ }
+ ]
+}
diff --git a/docs/.vitepress/toc_pt.json b/docs/.vitepress/toc_pt.json
new file mode 100644
index 000000000..70af9e386
--- /dev/null
+++ b/docs/.vitepress/toc_pt.json
@@ -0,0 +1,13 @@
+{
+ "/pt/": [
+ {
+ "text": "CakePHP Bake",
+ "collapsed": false,
+ "items": [
+ { "text": "Console Bake", "link": "/pt/" },
+ { "text": "Geração de Código com Bake", "link": "/pt/usage" },
+ { "text": "Estendendo o Bake", "link": "/pt/development" }
+ ]
+ }
+ ]
+}
diff --git a/docs/.vitepress/toc_ru.json b/docs/.vitepress/toc_ru.json
new file mode 100644
index 000000000..38d8ea36d
--- /dev/null
+++ b/docs/.vitepress/toc_ru.json
@@ -0,0 +1,13 @@
+{
+ "/ru/": [
+ {
+ "text": "CakePHP Bake",
+ "collapsed": false,
+ "items": [
+ { "text": "Консоль Bake", "link": "/ru/" },
+ { "text": "Генерация кода с помощью Bake", "link": "/ru/usage" },
+ { "text": "Расширение возможностей Bake", "link": "/ru/development" }
+ ]
+ }
+ ]
+}
diff --git a/docs/config/__init__.py b/docs/config/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/docs/config/all.py b/docs/config/all.py
deleted file mode 100644
index cfeecdc20..000000000
--- a/docs/config/all.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Global configuration information used across all the
-# translations of documentation.
-#
-# Import the base theme configuration
-from cakephpsphinx.config.all import *
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-
-# The full version, including alpha/beta/rc tags.
-release = '3.x'
-
-# The search index version.
-search_version = 'bake-3'
-
-# The marketing display name for the book.
-version_name = ''
-
-# Project name shown in the black header bar
-project = 'CakePHP Bake'
-
-# Other versions that display in the version picker menu.
-version_list = [
- {'name': '1.x', 'number': '/bake/1.x', 'title': '1.x'},
- {'name': '2.x', 'number': '/bake/2.x', 'title': '2.x'},
- {'name': '3.x', 'number': '/bake/3.x', 'title': '3.x', 'current': True},
-]
-
-# Languages available.
-languages = ['en', 'es', 'fr', 'ja', 'pt', 'ru']
-
-# The GitHub branch name for this version of the docs
-# for edit links to point at.
-branch = '2.x'
-
-# Current version being built
-version = '2.x'
-
-# Language in use for this directory.
-language = 'en'
-
-show_root_link = True
-
-repository = 'cakephp/bake'
-
-source_path = 'docs/'
-
-hide_page_contents = ('search', '404', 'contents')
diff --git a/docs/en/conf.py b/docs/en/conf.py
deleted file mode 100644
index f638bda22..000000000
--- a/docs/en/conf.py
+++ /dev/null
@@ -1,9 +0,0 @@
-import sys, os
-
-# Append the top level directory of the docs, so we can import from the config dir.
-sys.path.insert(0, os.path.abspath('..'))
-
-# Pull in all the configuration options defined in the global config file..
-from config.all import *
-
-language = 'en'
diff --git a/docs/en/contents.rst b/docs/en/contents.rst
deleted file mode 100644
index 08c3e957c..000000000
--- a/docs/en/contents.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-.. toctree::
- :maxdepth: 2
- :caption: CakePHP Bake
-
- /index
- /usage
- /development
diff --git a/docs/en/development.md b/docs/en/development.md
new file mode 100644
index 000000000..bc7d608a8
--- /dev/null
+++ b/docs/en/development.md
@@ -0,0 +1,315 @@
+# Extending Bake
+
+Bake features an extensible architecture that allows your application or plugins
+to modify or add to the base functionality.
+Bake makes use of a dedicated view class that uses the [Twig](https://twig.symfony.com/) template engine.
+
+## Bake Events
+
+As a view class, `BakeView` emits the same events as any other view class, plus one extra initialize event.
+However, whereas standard view classes use the event prefix `View.`, `BakeView` uses the event prefix `Bake.`.
+
+The initialize event can be used to make changes that apply to all baked output.
+For example, to add another helper to the bake view class:
+
+```php
+on('Bake.initialize', function (EventInterface $event) {
+ $view = $event->getSubject();
+
+ // In my bake templates, allow the use of the MySpecial helper
+ $view->loadHelper('MySpecial', ['some' => 'config']);
+
+ // And add an $author variable so it's always available
+ $view->set('author', 'Andy');
+});
+```
+
+Bake events can also be handy for making small changes to existing templates.
+For example, to change the variable names used when baking controller and template files, listen for `Bake.beforeRender`:
+
+```php
+on('Bake.beforeRender', function (EventInterface $event) {
+ $view = $event->getSubject();
+
+ // Use $rows for the main data variable in indexes
+ if ($view->get('pluralName')) {
+ $view->set('pluralName', 'rows');
+ }
+ if ($view->get('pluralVar')) {
+ $view->set('pluralVar', 'rows');
+ }
+
+ // Use $theOne for the main data variable in view/edit
+ if ($view->get('singularName')) {
+ $view->set('singularName', 'theOne');
+ }
+ if ($view->get('singularVar')) {
+ $view->set('singularVar', 'theOne');
+ }
+});
+```
+
+You may also scope `Bake.beforeRender` and `Bake.afterRender` events to a specific generated file.
+For instance, if you want to add specific actions to your `UsersController` when generating from a `Controller/controller.twig` file:
+
+```php
+on(
+ 'Bake.beforeRender.Controller.controller',
+ function (EventInterface $event) {
+ $view = $event->getSubject();
+ if ($view->get('name') === 'Users') {
+ // add the login and logout actions to the Users controller
+ $view->set('actions', [
+ 'login',
+ 'logout',
+ 'index',
+ 'view',
+ 'add',
+ 'edit',
+ 'delete',
+ ]);
+ }
+ }
+);
+```
+
+By scoping event listeners to specific bake templates, you can simplify your bake-related event logic and provide callbacks that are easier to test.
+
+## Bake Template Syntax
+
+Bake template files use the [Twig](https://twig.symfony.com/) template syntax.
+
+For example, when baking a command like this:
+
+```bash
+bin/cake bake command Foo
+```
+
+The template used at `vendor/cakephp/bake/templates/bake/Command/command.twig` looks like this:
+
+```php
+Test->classSuffixes[$this->name()])) {
+ $this->Test->classSuffixes[$this->name()] = 'Foo';
+ }
+
+ $name = ucfirst($this->name());
+ if (!isset($this->Test->classTypes[$name])) {
+ $this->Test->classTypes[$name] = 'Foo';
+ }
+
+ parent::bakeTest($className, $args, $io);
+}
+```
+
+- The **class suffix** is appended to the name provided in your `bake` call. In the example above, that would create `ExampleFooTest.php`.
+- The **class type** is the sub-namespace used to reach your file relative to the app or plugin you are baking into. In the example above, that would create the test namespace `App\Test\TestCase\Foo`.
+
+## Configuring the BakeView Class
+
+Bake commands use the `BakeView` class to render templates.
+You can access the instance by listening to the `Bake.initialize` event:
+
+```php
+on(
+ 'Bake.initialize',
+ function ($event, $view) {
+ $view->loadHelper('Foo');
+ }
+);
+```
diff --git a/docs/en/development.rst b/docs/en/development.rst
deleted file mode 100644
index 5abcda45c..000000000
--- a/docs/en/development.rst
+++ /dev/null
@@ -1,343 +0,0 @@
-Extending Bake
-##############
-
-Bake features an extensible architecture that allows your application or plugins
-to modify or add-to the base functionality. Bake makes use of a dedicated
-view class which uses the `Twig `_ template engine.
-
-Bake Events
-===========
-
-As a view class, ``BakeView`` emits the same events as any other view class,
-plus one extra initialize event. However, whereas standard view classes use the
-event prefix "View.", ``BakeView`` uses the event prefix "Bake.".
-
-The initialize event can be used to make changes which apply to all baked
-output, for example to add another helper to the bake view class this event can
-be used::
-
- on('Bake.initialize', function (EventInterface $event) {
- $view = $event->getSubject();
-
- // In my bake templates, allow the use of the MySpecial helper
- $view->loadHelper('MySpecial', ['some' => 'config']);
-
- // And add an $author variable so it's always available
- $view->set('author', 'Andy');
- });
-
-Bake events can be handy for making small changes to existing templates.
-For example, to change the variable names used when baking controller/template
-files one can use a function listening for ``Bake.beforeRender`` to modify the
-variables used in the bake templates::
-
- on('Bake.beforeRender', function (EventInterface $event) {
- $view = $event->getSubject();
-
- // Use $rows for the main data variable in indexes
- if ($view->get('pluralName')) {
- $view->set('pluralName', 'rows');
- }
- if ($view->get('pluralVar')) {
- $view->set('pluralVar', 'rows');
- }
-
- // Use $theOne for the main data variable in view/edit
- if ($view->get('singularName')) {
- $view->set('singularName', 'theOne');
- }
- if ($view->get('singularVar')) {
- $view->set('singularVar', 'theOne');
- }
- });
-
-You may also scope the ``Bake.beforeRender`` and ``Bake.afterRender`` events to
-a specific generated file. For instance, if you want to add specific actions to
-your UsersController when generating from a **Controller/controller.twig** file,
-you can use the following event::
-
- on(
- 'Bake.beforeRender.Controller.controller',
- function (EventInterface $event) {
- $view = $event->getSubject();
- if ($view->get('name') === 'Users') {
- // add the login and logout actions to the Users controller
- $view->set('actions', [
- 'login',
- 'logout',
- 'index',
- 'view',
- 'add',
- 'edit',
- 'delete',
- ]);
- }
- }
- );
-
-By scoping event listeners to specific bake templates, you can simplify your
-bake related event logic and provide callbacks that are easier to test.
-
-Bake Template Syntax
-====================
-
-Bake template files use the `Twig `__ template syntax.
-
-So, for example, when baking a command like so:
-
-.. code-block:: bash
-
- bin/cake bake command Foo
-
-The template used (**vendor/cakephp/bake/templates/bake/Command/command.twig**)
-looks like this::
-
- Test->classSuffixes[$this->name()])) {
- $this->Test->classSuffixes[$this->name()] = 'Foo';
- }
-
- $name = ucfirst($this->name());
- if (!isset($this->Test->classTypes[$name])) {
- $this->Test->classTypes[$name] = 'Foo';
- }
-
- parent::bakeTest($className, $args, $io);
- }
-
-* The **class suffix** will be appended to the name provided in your ``bake``
- call. In the previous example, it would create a ``ExampleFooTest.php`` file.
-* The **class type** will be the sub-namespace used that will lead to your
- file (relative to the app or the plugin you are baking into). In the previous
- example, it would create your test with the namespace ``App\Test\TestCase\Foo``.
-
-Configuring the BakeView class
-==============================
-
-The bake commands use the ``BakeView`` class to render the templates. You can
-access the instance by listening to the ``Bake.initialize`` event. For example, here's
-how you can load your own helper so that it can be used in bake templates::
-
- on(
- 'Bake.initialize',
- function ($event, $view) {
- $view->loadHelper('Foo');
- }
- );
-
-.. meta::
- :title lang=en: Extending Bake
- :keywords lang=en: command line interface, development, bake view, bake template syntax, twig, erb tags, percent tags
diff --git a/docs/en/index.md b/docs/en/index.md
new file mode 100644
index 000000000..4f8b7808b
--- /dev/null
+++ b/docs/en/index.md
@@ -0,0 +1,25 @@
+# Bake Console
+
+CakePHP's bake console is another effort to get you up and running in CakePHP fast.
+The bake console can create any of CakePHP's basic ingredients: models,
+behaviors, views, helpers, controllers, components, test cases, fixtures, and plugins.
+Bake can create far more than skeleton classes and is a natural next step once an application has been scaffolded.
+
+## Installation
+
+Before trying to use or extend Bake, make sure it is installed in your application.
+Bake is provided as a plugin that you can install with Composer:
+
+```bash
+composer require --dev cakephp/bake:"^3.0"
+```
+
+The above installs Bake as a development dependency, so it will not be installed during production deployments.
+
+When using Twig templates, make sure you are loading the `Cake/TwigView` plugin with its bootstrap.
+You can also omit it completely, which makes the Bake plugin load it on demand.
+
+## Documentation Map
+
+- [Code Generation with Bake](/usage) covers running the console, listing commands, baking models and enums, and changing bake themes.
+- [Extending Bake](/development) covers events, Twig templates, custom themes, application template overrides, and creating custom bake commands.
diff --git a/docs/en/index.rst b/docs/en/index.rst
deleted file mode 100644
index 38c7d2f89..000000000
--- a/docs/en/index.rst
+++ /dev/null
@@ -1,28 +0,0 @@
-Bake Console
-############
-
-CakePHP's bake console is another effort to get you up and running in CakePHP
-– fast. The bake console can create any of CakePHP's basic ingredients: models,
-behaviors, views, helpers, controllers, components, test cases, fixtures and plugins.
-And we aren't just talking skeleton classes: Bake can create a fully functional
-application in just a few minutes. In fact, Bake is a natural step to take once
-an application has been scaffolded.
-
-Installation
-============
-
-Before trying to use or extend bake, make sure it is installed in your
-application. Bake is provided as a plugin that you can install with Composer::
-
- composer require --dev cakephp/bake:"^3.0"
-
-The above will install bake as a development dependency. This means that it will
-not be installed when you do production deployments.
-
-When using the Twig templates make sure you are loading the
-``Cake/TwigView`` plugin with its bootstrap. You can also omit it
-completely which then makes Bake plugin load this plugin on demand.
-
-.. meta::
- :title lang=en: Bake Console
- :keywords lang=en: command line interface,development,bake view, bake template syntax,erb tags,asp tags,percent tags
diff --git a/docs/en/usage.md b/docs/en/usage.md
new file mode 100644
index 000000000..76b226d9f
--- /dev/null
+++ b/docs/en/usage.md
@@ -0,0 +1,124 @@
+# Code Generation with Bake
+
+The Bake console is run using the PHP CLI.
+If you have problems running the script, ensure that:
+
+1. You have the PHP CLI installed and that it has the proper modules enabled, such as MySQL and `intl`.
+2. If the database host is `localhost`, try `127.0.0.1` instead, as `localhost` can cause issues with PHP CLI.
+3. Depending on how your computer is configured, you may need to set execute rights on the Cake shell script to call it using `bin/cake bake`.
+
+Before running Bake you should make sure you have at least one database connection configured.
+
+You can get the list of available bake commands by running `bin/cake bake --help`.
+For Windows usage use `bin\cake bake --help`:
+
+```bash
+$ bin/cake bake --help
+Current Paths:
+
+* app: src/
+* root: /path/to/your/app/
+* core: /path/to/your/app/vendor/cakephp/cakephp/
+
+Available Commands:
+
+Bake:
+- bake all
+- bake behavior
+- bake cell
+- bake command
+- bake command_helper
+- bake component
+- bake controller
+- bake controller all
+- bake enum
+- bake fixture
+- bake fixture all
+- bake form
+- bake helper
+- bake mailer
+- bake middleware
+- bake model
+- bake model all
+- bake plugin
+- bake template
+- bake template all
+- bake test
+
+To run a command, type `cake command_name [args|options]`
+To get help on a specific command, type `cake command_name --help`
+```
+
+## Bake Models
+
+Models are generically baked from existing database tables.
+CakePHP conventions apply, so Bake detects relations based on `thing_id` foreign keys to `things` tables with their `id` primary keys.
+
+For non-conventional relations, you can use references in constraints or foreign key definitions for Bake to detect relations:
+
+```php
+->addForeignKey('billing_country_id', 'countries') // defaults to `id`
+->addForeignKey('shipping_country_id', 'countries', 'cid')
+```
+
+## Bake Enums
+
+You can use Bake to generate [backed enums](https://www.php.net/manual/en/language.enumerations.backed.php) for use in your models.
+Enums are placed in `src/Model/Enum/` and implement `EnumLabelInterface`, which provides a `label()` method for human-readable display.
+
+To bake a string-backed enum:
+
+```bash
+bin/cake bake enum ArticleStatus draft,published,archived
+```
+
+This generates `src/Model/Enum/ArticleStatus.php`:
+
+```php
+namespace App\Model\Enum;
+
+use Cake\Database\Type\EnumLabelInterface;
+use Cake\Utility\Inflector;
+
+enum ArticleStatus: string implements EnumLabelInterface
+{
+ case Draft = 'draft';
+ case Published = 'published';
+ case Archived = 'archived';
+
+ public function label(): string
+ {
+ return Inflector::humanize(Inflector::underscore($this->name));
+ }
+}
+```
+
+For int-backed enums, use the `-i` option and provide values with colons:
+
+```bash
+bin/cake bake enum Priority low:1,medium:2,high:3 -i
+```
+
+This generates an int-backed enum:
+
+```php
+enum Priority: int implements EnumLabelInterface
+{
+ case Low = 1;
+ case Medium = 2;
+ case High = 3;
+
+ // ...
+}
+```
+
+You can also bake enums into plugins:
+
+```bash
+bin/cake bake enum MyPlugin.OrderStatus pending,processing,shipped
+```
+
+## Bake Themes
+
+The `theme` option is common to all bake commands and allows changing the bake template files used when baking.
+To create your own templates, see [Creating a Bake Theme](/development#creating-a-bake-theme).
diff --git a/docs/en/usage.rst b/docs/en/usage.rst
deleted file mode 100644
index 0977739ad..000000000
--- a/docs/en/usage.rst
+++ /dev/null
@@ -1,125 +0,0 @@
-Code Generation with Bake
-#########################
-
-The Bake console is run using the PHP CLI (command line interface).
-If you have problems running the script, ensure that:
-
-#. You have the PHP CLI installed and that it has the proper modules enabled
- (eg: MySQL, intl).
-#. Users also might have issues if the database host is 'localhost' and should
- try '127.0.0.1' instead, as localhost can cause issues with PHP CLI.
-#. Depending on how your computer is configured, you may have to set execute
- rights on the cake bash script to call it using ``bin/cake bake``.
-
-Before running bake you should make sure you have at least one database
-connection configured.
-
-You can get the list of available bake command by running ``bin/cake bake --help``
-(For Windows usage ``bin\cake bake --help``) ::
-
- $ bin/cake bake --help
- Current Paths:
-
- * app: src/
- * root: /path/to/your/app/
- * core: /path/to/your/app/vendor/cakephp/cakephp/
-
- Available Commands:
-
- Bake:
- - bake all
- - bake behavior
- - bake cell
- - bake command
- - bake command_helper
- - bake component
- - bake controller
- - bake controller all
- - bake enum
- - bake fixture
- - bake fixture all
- - bake form
- - bake helper
- - bake mailer
- - bake middleware
- - bake model
- - bake model all
- - bake plugin
- - bake template
- - bake template all
- - bake test
-
- To run a command, type `cake command_name [args|options]`
- To get help on a specific command, type `cake command_name --help`
-
-Bake Models
-===========
-
-Models are generically baked from the existing DB tables.
-The conventions here apply, so it will detect relations based on ``thing_id`` foreign keys to ``things`` tables with their ``id`` primary keys.
-
-For non-conventional relations, you can use references in the constraints / foreign key definitions for Bake to detect the relations, e.g.::
-
- ->addForeignKey('billing_country_id', 'countries') // defaults to `id`
- ->addForeignKey('shipping_country_id', 'countries', 'cid')
-
-
-Bake Enums
-==========
-
-You can use bake to generate `backed enums `_
-for use in your models. Enums are placed in **src/Model/Enum/** and implement
-``EnumLabelInterface`` which provides a ``label()`` method for human-readable display.
-
-To bake a string-backed enum::
-
- bin/cake bake enum ArticleStatus draft,published,archived
-
-This generates **src/Model/Enum/ArticleStatus.php**::
-
- namespace App\Model\Enum;
-
- use Cake\Database\Type\EnumLabelInterface;
- use Cake\Utility\Inflector;
-
- enum ArticleStatus: string implements EnumLabelInterface
- {
- case Draft = 'draft';
- case Published = 'published';
- case Archived = 'archived';
-
- public function label(): string
- {
- return Inflector::humanize(Inflector::underscore($this->name));
- }
- }
-
-For int-backed enums, use the ``-i`` option and provide values with colons::
-
- bin/cake bake enum Priority low:1,medium:2,high:3 -i
-
-This generates an int-backed enum::
-
- enum Priority: int implements EnumLabelInterface
- {
- case Low = 1;
- case Medium = 2;
- case High = 3;
-
- // ...
- }
-
-You can also bake enums into plugins::
-
- bin/cake bake enum MyPlugin.OrderStatus pending,processing,shipped
-
-Bake Themes
-===========
-
-The theme option is common to all bake commands, and allows changing the bake
-template files used when baking. To create your own templates, see the
-:ref:`bake theme creation documentation `.
-
-.. meta::
- :title lang=en: Code Generation with Bake
- :keywords lang=en: command line interface,functional application,database,database configuration,bash script,basic ingredients,project,model,path path,code generation,scaffolding,windows users,configuration file,few minutes,config,view,models,running,mysql
diff --git a/docs/es/conf.py b/docs/es/conf.py
deleted file mode 100644
index 4691ece6a..000000000
--- a/docs/es/conf.py
+++ /dev/null
@@ -1,9 +0,0 @@
-import sys, os
-
-# Append the top level directory of the docs, so we can import from the config dir.
-sys.path.insert(0, os.path.abspath('..'))
-
-# Pull in all the configuration options defined in the global config file..
-from config.all import *
-
-language = 'es'
diff --git a/docs/es/contents.rst b/docs/es/contents.rst
deleted file mode 100644
index 08c3e957c..000000000
--- a/docs/es/contents.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-.. toctree::
- :maxdepth: 2
- :caption: CakePHP Bake
-
- /index
- /usage
- /development
diff --git a/docs/es/development.md b/docs/es/development.md
new file mode 100644
index 000000000..a6ecced69
--- /dev/null
+++ b/docs/es/development.md
@@ -0,0 +1,9 @@
+# Extending Bake
+
+::: info
+La documentación no es compatible actualmente con el idioma español en esta página.
+
+Por favor, siéntase libre de enviarnos un pull request en [GitHub](https://github.com/cakephp/bake) o utilizar el botón de edición de la documentación para proponer cambios.
+
+Puede consultar la versión en inglés desde el selector de idioma superior para obtener información sobre este tema.
+:::
diff --git a/docs/es/development.rst b/docs/es/development.rst
deleted file mode 100644
index 7f717d051..000000000
--- a/docs/es/development.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-Extending Bake
-##############
-
-.. note::
- La documentación no es compatible actualmente con el idioma español en esta página.
-
- Por favor, siéntase libre de enviarnos un pull request en
- `Github `_ o utilizar el botón **Improve this Doc** para proponer directamente los cambios.
-
- Usted puede hacer referencia a la versión en Inglés en el menú de selección superior
- para obtener información sobre el tema de esta página.
-
-.. _creating-a-bake-theme:
-
-.. meta::
- :title lang=es: Extending Bake
- :keywords lang=es: command line interface,development,bake view, bake template syntax,erb tags,asp tags,percent tags
diff --git a/docs/es/index.md b/docs/es/index.md
new file mode 100644
index 000000000..6e7328672
--- /dev/null
+++ b/docs/es/index.md
@@ -0,0 +1,24 @@
+# Consola Bake
+
+La consola Bake de CakePHP permite preparar y ejecutar CakePHP rápidamente.
+Puede crear muchos de los ingredientes básicos de CakePHP, como modelos,
+behaviours, vistas, helpers, controladores, componentes, casos de prueba,
+fixtures y plugins.
+Bake puede generar mucho más que esqueletos de clases y es un paso natural después de crear la base de la aplicación.
+
+## Instalación
+
+Antes de intentar utilizar o extender Bake, asegúrate de que está instalado en tu aplicación.
+Bake se distribuye como un plugin que puedes instalar con Composer:
+
+```bash
+composer require --dev cakephp/bake:~1.0
+```
+
+La instrucción anterior instalará Bake como una dependencia de desarrollo.
+Esto significa que no será instalado cuando hagas despliegues en producción.
+
+## Mapa de documentación
+
+- [Crear código con Bake](/es/usage) cubre la ejecución del CLI, el listado de tareas y los temas de Bake.
+- [Extending Bake](/es/development) enlaza al contenido disponible para ampliaciones y personalización.
diff --git a/docs/es/index.rst b/docs/es/index.rst
deleted file mode 100644
index 80f1fa654..000000000
--- a/docs/es/index.rst
+++ /dev/null
@@ -1,31 +0,0 @@
-Consola bake
-############
-
-La consola bake de CakePHP es otro esfuerzo para preparar y ejecutar CakePHP rápidamente.
-
-La consola bake puede crear cualquiera de los ingredientes básicos de CakePHP:
-modelos, behaviours, vistas, helpers, controladores, componentes, casos de
-prueba, fixtures y plugins.
-
-Y no hablamos sólo de esqueletos de clases: Bake puede crear una aplicación
-totalmente funcional en solo un par de minutos.
-
-De hecho, Bake es un paso natural a dar una vez ha sido creado el esqueleto de
-la aplicación.
-
-Instalación
-===========
-
-Antes de intentar utilizar o extender bake asegúrate de que está instalado en tu
-aplicación.
-
-Bake está incluido como un plugin que puedes instalar con Composer::
-
- composer require --dev cakephp/bake:~1.0
-
-La instrucción anterior instalará bake como una dependencia de desarrollo. Esto
-significa que no será instalado cuando hagas despliegues en producción.
-
-.. meta::
- :title lang=es: Consola Bake
- :keywords lang=es: interfaz de línea de comando,desarrollo,bake vista, bake sintaxis plantilla,erb tags,asp tags,percent tags
diff --git a/docs/es/usage.md b/docs/es/usage.md
new file mode 100644
index 000000000..c1862006d
--- /dev/null
+++ b/docs/es/usage.md
@@ -0,0 +1,100 @@
+# Crear código con Bake
+
+La consola de Cake se ejecuta usando PHP CLI.
+Si tiene problemas para ejecutar el script, asegúrese de:
+
+1. Tener instalado PHP CLI y los módulos correspondientes habilitados, por ejemplo MySQL e `intl`.
+2. Si el host de la base de datos es `localhost`, intentar la conexión con `127.0.0.1`, ya que en algunos casos PHP CLI tiene problemas al usar `localhost`.
+3. Dependiendo de cómo esté configurado su equipo, la ejecución de `bin/cake bake` puede requerir permisos de ejecución.
+
+Antes de comenzar, asegúrese de disponer al menos de una conexión a base de datos configurada.
+
+Para comenzar con la ejecución del comando puede abrir la consola y ejecutar `Cake bake`.
+
+1. Ir a Inicio > Ejecutar.
+2. Escribir `cmd` y presionar Enter.
+3. Navegar hasta la carpeta de instalación de Cake.
+4. Acceder a la carpeta `bin`.
+5. Escribir `Cake bake`, lo cual deberá devolver un listado con las tareas disponibles.
+
+El resultado debería ser algo similar a lo siguiente:
+
+```bash
+$ bin/cake bake
+
+Welcome to CakePHP v3.1.6 Console
+---------------------------------------------------------------
+App : src
+Path: /var/www/cakephp.dev/src/
+PHP: 5.5.8
+---------------------------------------------------------------
+The following commands can be used to generate skeleton code for your application.
+
+Available bake commands:
+
+- all
+- behavior
+- cell
+- component
+- controller
+- fixture
+- form
+- helper
+- mailer
+- migration
+- migration_snapshot
+- model
+- plugin
+- template
+- test
+
+By using 'cake bake [name]' you can invoke a specific bake task.
+```
+
+Puede obtener más información sobre lo que realiza cada tarea y sus opciones usando `--help`:
+
+```bash
+$ bin/cake bake controller --help
+
+Welcome to CakePHP v3.1.6 Console
+---------------------------------------------------------------
+App : src
+Path: /var/www/cakephp.dev/src/
+---------------------------------------------------------------
+Bake a controller skeleton.
+
+Usage:
+cake bake controller [subcommand] [options] []
+
+Subcommands:
+
+all Bake all controllers with CRUD methods.
+
+To see help on a subcommand use `cake bake controller [subcommand] --help`
+
+Options:
+
+--help, -h Display this help.
+--verbose, -v Enable verbose output.
+--quiet, -q Enable quiet output.
+--plugin, -p Plugin to bake into.
+--force, -f Force overwriting existing files without prompting.
+--connection, -c The datasource connection to get data from.
+ (default: default)
+--theme, -t The theme to use when baking code.
+--components The comma separated list of components to use.
+--helpers The comma separated list of helpers to use.
+--prefix The namespace/routing prefix to use.
+--no-test Do not generate a test skeleton.
+--no-actions Do not generate basic CRUD action methods.
+
+Arguments:
+
+name Name of the controller to bake. Can use Plugin.name to bake
+ controllers into plugins. (optional)
+```
+
+## Temas Bake / Templates
+
+La opción `theme` es genérica para todos los comandos Bake y permite cambiar los templates utilizados para generar los archivos finales.
+Para crear sus propios templates, vea [Creating a Bake Theme](/es/development#creating-a-bake-theme).
diff --git a/docs/es/usage.rst b/docs/es/usage.rst
deleted file mode 100644
index 40a6e43a3..000000000
--- a/docs/es/usage.rst
+++ /dev/null
@@ -1,113 +0,0 @@
-Crear código con Bake
-#####################
-
-La consola de CAKE se ejecuta usando PHP CLI (command line interface).
-Si tiene problemas para ejecutar el script, asegurese de:
-
-#. Tener instalado el PHP CLI y que estén los módulos correspondientes
- habilitados (ej: MySQL y intl).
-#. Si el host de base de datos es 'localhost', intente realizar la conexión con
- el ip '127.0.0.1'. En algunos casos PHP CLI tiene problemas al referenciar
- por nombre de host (localhost).
-#. Dependiendo de como esté configurado su equipo, la ejecución del comando
- CAKE BAKE (cake bash script) puede requerir permisos de ejecución al
- lanzar ``bin/cake bake``.
-
-Antes de comenzar la ejecución, asegúrese de disponer al menos de una conexión
-a una base de datos configurada.
-
-Para comenzar con la ejecución del comando debe abrir la consola de windows
-y ejecutar "Cake Bake"
-
-#. Ir a Inicio (Start) > Ejecutar (Run)
-#. Escribir "cmd" y presionar 'Enter'
-#. Navegar hasta llegar a la carpeta de instalación de cake
-#. Acceder a la carpeta 'bin'
-#. Escribir 'Cake bake' lo cual deberá devolver un listado con todas las
- tareas/actividades disponibles.
-
-El resultado debería ser algo similar a lo siguiente::
-
- $ bin/cake bake
-
- Welcome to CakePHP v3.1.6 Console
- ---------------------------------------------------------------
- App : src
- Path: /var/www/cakephp.dev/src/
- PHP: 5.5.8
- ---------------------------------------------------------------
- The following commands can be used to generate skeleton code for your application.
-
- Available bake commands:
-
- - all
- - behavior
- - cell
- - component
- - controller
- - fixture
- - form
- - helper
- - mailer
- - migration
- - migration_snapshot
- - model
- - plugin
- - template
- - test
-
- By using 'cake bake [name]' you can invoke a specific bake task.
-
-Puede obtener más información sobre lo que realiza cada una de las actividades
-y sus opciones usando el parametro '--help' option::
-
- $ bin/cake bake controller --help
-
- Welcome to CakePHP v3.1.6 Console
- ---------------------------------------------------------------
- App : src
- Path: /var/www/cakephp.dev/src/
- ---------------------------------------------------------------
- Bake a controller skeleton.
-
- Usage:
- cake bake controller [subcommand] [options] []
-
- Subcommands:
-
- all Bake all controllers with CRUD methods.
-
- To see help on a subcommand use `cake bake controller [subcommand] --help`
-
- Options:
-
- --help, -h Display this help.
- --verbose, -v Enable verbose output.
- --quiet, -q Enable quiet output.
- --plugin, -p Plugin to bake into.
- --force, -f Force overwriting existing files without prompting.
- --connection, -c The datasource connection to get data from.
- (default: default)
- --theme, -t The theme to use when baking code.
- --components The comma separated list of components to use.
- --helpers The comma separated list of helpers to use.
- --prefix The namespace/routing prefix to use.
- --no-test Do not generate a test skeleton.
- --no-actions Do not generate basic CRUD action methods.
-
- Arguments:
-
- name Name of the controller to bake. Can use Plugin.name to bake
- controllers into plugins. (optional)
-
-Temas Bake / Templates
-======================
-
-La opción ``theme`` es genérica para todos los comandos bake y permite cambiar los
-templates de bake utilizados para generar los archivos finales. Para crear sus
-propios templates, ver :ref:`bake theme creation documentation
-`.
-
-.. meta::
- :title lang=es: Crear código con Bake
- :keywords lang=es: interfaz de línea de comando, aplicación funcional, base de datos, configuración de base de datos, bash script, ingredientes básicos, proyecto, modelo, path, crear código, generación de código, scaffolding, usuarios windows, archivo de configuración, pocos minutos, configurar, view, modelos, running, mysql
diff --git a/docs/fr/conf.py b/docs/fr/conf.py
deleted file mode 100644
index b02032efa..000000000
--- a/docs/fr/conf.py
+++ /dev/null
@@ -1,9 +0,0 @@
-import sys, os
-
-# Append the top level directory of the docs, so we can import from the config dir.
-sys.path.insert(0, os.path.abspath('..'))
-
-# Pull in all the configuration options defined in the global config file..
-from config.all import *
-
-language = 'fr'
diff --git a/docs/fr/contents.rst b/docs/fr/contents.rst
deleted file mode 100644
index 08c3e957c..000000000
--- a/docs/fr/contents.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-.. toctree::
- :maxdepth: 2
- :caption: CakePHP Bake
-
- /index
- /usage
- /development
diff --git a/docs/fr/development.md b/docs/fr/development.md
new file mode 100644
index 000000000..8d08ce39d
--- /dev/null
+++ b/docs/fr/development.md
@@ -0,0 +1,297 @@
+# Étendre Bake
+
+Bake dispose d'une architecture extensible qui permet à votre application ou à vos plugins de modifier ou d'ajouter des fonctionnalités de base.
+Bake utilise une classe de vue dédiée fondée sur le moteur de template [Twig](https://twig.symfony.com/).
+
+## Events de Bake
+
+Comme une classe de vue, `BakeView` envoie les mêmes events que toute autre classe de vue, ainsi qu'un event `initialize` supplémentaire.
+Alors que les classes de vue standard utilisent le préfixe `View.`, `BakeView` utilise le préfixe `Bake.`.
+
+L'event `initialize` peut être utilisé pour faire des changements qui s'appliquent à toutes les sorties générées par Bake.
+Par exemple, pour ajouter un helper :
+
+```php
+on('Bake.initialize', function (EventInterface $event) {
+ $view = $event->getSubject();
+
+ // Dans mes templates de bake, permet l'utilisation du helper MySpecial
+ $view->loadHelper('MySpecial', ['some' => 'config']);
+
+ // Et ajoute une variable $author pour qu'elle soit toujours disponible
+ $view->set('author', 'Andy');
+});
+```
+
+Les events de Bake peuvent aussi servir à faire de petits changements dans les templates existants.
+Par exemple, pour changer les noms de variables utilisés lors de la création de fichiers de controller et de template :
+
+```php
+on('Bake.beforeRender', function (EventInterface $event) {
+ $view = $event->getSubject();
+
+ // Utilise $rows pour la principale variable de données dans les index
+ if ($view->get('pluralName')) {
+ $view->set('pluralName', 'rows');
+ }
+ if ($view->get('pluralVar')) {
+ $view->set('pluralVar', 'rows');
+ }
+
+ // Utilise $theOne pour la principale variable de données dans les view/edit
+ if ($view->get('singularName')) {
+ $view->set('singularName', 'theOne');
+ }
+ if ($view->get('singularVar')) {
+ $view->set('singularVar', 'theOne');
+ }
+});
+```
+
+Vous pouvez aussi scoper les events `Bake.beforeRender` et `Bake.afterRender` à un fichier généré spécifique.
+Par exemple, pour ajouter des actions à `UsersController` lors de la génération depuis `Controller/controller.twig` :
+
+```php
+on(
+ 'Bake.beforeRender.Controller.controller',
+ function (EventInterface $event) {
+ $view = $event->getSubject();
+ if ($view->get('name') === 'Users') {
+ // ajouter les actions login et logout au controller Users
+ $view->set('actions', [
+ 'login',
+ 'logout',
+ 'index',
+ 'view',
+ 'add',
+ 'edit',
+ 'delete',
+ ]);
+ }
+ }
+);
+```
+
+En scopant les écouteurs d'event vers des templates de Bake spécifiques, vous simplifiez la logique liée à Bake et obtenez des callbacks plus faciles à tester.
+
+## Syntaxe de template de Bake
+
+Les fichiers de template de Bake utilisent la syntaxe [Twig](https://twig.symfony.com/).
+
+Par exemple, si vous générez une commande comme ceci :
+
+```bash
+bin/cake bake command Foo
+```
+
+Le template utilisé dans `vendor/cakephp/bake/templates/bake/Command/command.twig` ressemble à ceci :
+
+```php
+Test->classSuffixes[$this->name()])) {
+ $this->Test->classSuffixes[$this->name()] = 'Foo';
+ }
+
+ $name = ucfirst($this->name());
+ if (!isset($this->Test->classTypes[$name])) {
+ $this->Test->classTypes[$name] = 'Foo';
+ }
+
+ return parent::bakeTest($className);
+}
+```
+
+- Le **suffixe de classe** sera ajouté après le nom passé à `bake`. Dans l'exemple ci-dessus, cela créerait `ExempleFooTest.php`.
+- Le **type de classe** sera le sous-namespace utilisé pour atteindre le fichier relatif à l'application ou au plugin. Dans l'exemple ci-dessus, cela créerait le namespace `App\Test\TestCase\Foo`.
diff --git a/docs/fr/development.rst b/docs/fr/development.rst
deleted file mode 100644
index dad16138e..000000000
--- a/docs/fr/development.rst
+++ /dev/null
@@ -1,347 +0,0 @@
-Etendre Bake
-############
-
-Bake dispose d'une architecture extensible qui permet à votre application ou
-à vos plugins de modifier ou ajouter la fonctionnalité de base. Bake utilise une
-classe de vue dédiée qui utilise le moteur de template
-`Twig `_.
-
-Events de Bake
-==============
-
-Comme une classe de vue, ``BakeView`` envoie les mêmes events que toute autre
-classe de vue, ainsi qu'un event initialize supplémentaire. Cependant,
-alors que les classes de vue standard utilisent le préfixe d'event
-"View.", ``BakeView`` utilise le préfixe d'event "Bake.".
-
-L'event initialize peut être utilisé pour faire des changements qui
-s'appliquent à toutes les sorties fabriquées avec bake, par exemple pour ajouter
-un autre helper à la classe de vue bake, cet event peut être utilisé::
-
- on('Bake.initialize', function (EventInterface $event) {
- $view = $event->getSubject();
-
- // Dans mes templates de bake, permet l'utilisation du helper MySpecial
- $view->loadHelper('MySpecial', ['some' => 'config']);
-
- // Et ajoute une variable $author pour qu'elle soit toujours disponible
- $view->set('author', 'Andy');
-
- });
-
-Les events de bake peuvent être pratiques pour faire de petits changements dans
-les templates existants. Par exemple, pour changer les noms de variables
-utilisés lors de la création avec bake de fichiers de controller/template, on
-pourra utiliser une fonction qui écoute ``Bake.beforeRender`` pour modifier les
-variables utilisées dans les templates de bake::
-
- on('Bake.beforeRender', function (EventInterface $event) {
- $view = $event->getSubject();
-
- // Utilise $rows pour la principale variable de données dans les index
- if ($view->get('pluralName')) {
- $view->set('pluralName', 'rows');
- }
- if ($view->get('pluralVar')) {
- $view->set('pluralVar', 'rows');
- }
-
- // Utilise $theOne pour la principale variable de données dans les view/edit
- if ($view->get('singularName')) {
- $view->set('singularName', 'theOne');
- }
- if ($view->get('singularVar')) {
- $view->set('singularVar', 'theOne');
- }
-
- });
-
-Vous pouvez aussi scoper les events ``Bake.beforeRender`` et
-``Bake.afterRender`` dans un fichier généré spécifique. Par exemple, si vous
-souhaitez ajouter des actions spécifiques à votre UsersController quand vous le
-générez à partir d'un fichier **Controller/controller.twig**, vous pouvez
-utiliser l'event suivant::
-
- on(
- 'Bake.beforeRender.Controller.controller',
- function (EventInterface $event) {
- $view = $event->getSubject();
- if ($view->get('name') === 'Users') {
- // ajouter les actions login et logout au controller Users
- $view->set('actions', [
- 'login',
- 'logout',
- 'index',
- 'view',
- 'add',
- 'edit',
- 'delete'
- ];
- }
- }
- );
-
-En scopant les écouteurs d'event vers des templates de bake spécifiques, vous
-pouvez simplifier votre logique d'event liée à bake et fournir des callbacks
-qui sont plus faciles à tester.
-
-Syntaxe de Template de Bake
-===========================
-
-Les fichiers de template de Bake utilisent la syntaxe de template de
-`Twig `__.
-
-Ainsi, par exemple, pour créer avec bake un shell comme ceci:
-
-.. code-block:: bash
-
- bin/cake bake command Foo
-
-Le template utilisé
-(***vendor/cakephp/bake/templates/bake/Command/command.twig**)
-ressemble à ceci::
-
- declare(strict_types=1);
-
- namespace {{ namespace }}\Command;
-
- use Cake\Command\Command;
- use Cake\Console\Arguments;
- use Cake\Console\ConsoleIo;
- use Cake\Console\ConsoleOptionParser;
-
- /**
- * {{ name }} command.
- */
- class {{ name }}Command extends Command
- {
- /**
- * Méthode hook pour définir le parseur d'option de cette commande.
- *
- * @link https://book.cakephp.org/5/fr/console-commands/commands.html#defining-arguments-and-options
- * @param \Cake\Console\ConsoleOptionParser $parser Le parseur à définir
- * @return \Cake\Console\ConsoleOptionParser Le parseur construit.
- */
- public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser
- {
- $parser = parent::buildOptionParser($parser);
-
- return $parser;
- }
-
- /**
- * Implémentez cette méthode avec la logique de votre commande.
- *
- * @param \Cake\Console\Arguments $args Les arguments de la commande.
- * @param \Cake\Console\ConsoleIo $io La console il
- * @return int|null|void Le code de sortie ou null pour un succès
- */
- public function execute(Arguments $args, ConsoleIo $io)
- {
- }
- }
-
-Et la classe résultante construite avec bake (**src/Command/FooCommand.php**)
-ressemble à ceci::
-
- Test->classSuffixes[$this->name()])) {
- $this->Test->classSuffixes[$this->name()] = 'Foo';
- }
-
- $name = ucfirst($this->name());
- if (!isset($this->Test->classTypes[$name])) {
- $this->Test->classTypes[$name] = 'Foo';
- }
-
- return parent::bakeTest($className);
- }
-
-* Le **suffixe de classe** sera ajouté après le nom passé à ``bake``. Dans le
- cadre de l'exemple ci-dessus, cela créerait un fichier ``ExempleFooTest.php``.
-* Le **type de classe** sera le sous-namespace utilisé pour atteindre votre
- fichier (relatif à l'application ou au plugin dans lequel vous faites le
- ``bake``). Dans le cadre de l'exemple ci-dessus, cela créerait le test avec le
- namespace ``App\Test\TestCase\Foo``.
-
-.. meta::
- :title lang=fr: Etendre Bake
- :keywords lang=fr: interface ligne de commande,development,bake view, bake template syntax,erb tags,asp tags,percent tags
diff --git a/docs/fr/index.md b/docs/fr/index.md
new file mode 100644
index 000000000..07930646f
--- /dev/null
+++ b/docs/fr/index.md
@@ -0,0 +1,25 @@
+# Console Bake
+
+La console Bake de CakePHP permet de lancer rapidement une application CakePHP.
+Elle peut créer les éléments de base de CakePHP, comme les models, behaviors, views,
+helpers, controllers, components, cas de tests, fixtures et plugins.
+Bake peut aller bien au-delà des classes squelettes et constitue une étape naturelle après un premier prototypage.
+
+## Installation
+
+Avant d'utiliser ou d'étendre Bake, assurez-vous qu'il est installé dans votre application.
+Bake est disponible sous forme de plugin que vous pouvez installer avec Composer :
+
+```bash
+composer require --dev cakephp/bake:"^2.0"
+```
+
+Cela installe Bake comme dépendance de développement, et il ne sera donc pas déployé en production.
+
+Quand vous utilisez les templates Twig, vérifiez que vous chargez le plugin `Cake/TwigView` avec son bootstrap.
+Vous pouvez aussi l'omettre complètement, ce qui fera charger ce plugin à la demande par Bake.
+
+## Plan de la documentation
+
+- [Génération de code avec Bake](/fr/usage) couvre l'exécution du CLI, les commandes disponibles et les thèmes Bake.
+- [Étendre Bake](/fr/development) couvre les events, les templates Twig, les thèmes et les commandes Bake personnalisées.
diff --git a/docs/fr/index.rst b/docs/fr/index.rst
deleted file mode 100644
index 80e39229b..000000000
--- a/docs/fr/index.rst
+++ /dev/null
@@ -1,30 +0,0 @@
-Console Bake
-############
-
-La console Bake de CakePHP est un autre outil permettant de réaliser son
-application rapidement. La console Bake peut créer chacun des ingrédients
-basiques de CakePHP : models, behaviors, views, helpers, controllers,
-components, cas de tests, fixtures et plugins. Et nous ne parlons pas
-seulement des squelettes de classes : Bake peut créer une application
-fonctionnelle complète en seulement quelques minutes. En réalité, Bake est une
-étape naturelle à suivre une fois qu'une application a été prototypée.
-
-Installation
-============
-
-Avant d'essayer d'utiliser ou d'étendre bake, assurez-vous qu'il est installé
-dans votre application. Bake est disponible en tant que plugin que vous pouvez
-installer avec Composer::
-
- composer require --dev cakephp/bake:"^2.0"
-
-Ceci va installer bake en tant que dépendance de développement. Cela signifie
-qu'il ne sera pas installé lors d'un déploiement en production.
-
-Quand vous utilisez les templates Twig, vérifiez que vous chargez le plugin
-``Cake/TwigView`` avec son bootstrap. Vous pouvez aussi l'omettre complètement,
-ce qui fait que Bake chargera ce plugin à la demande.
-
-.. meta::
- :title lang=fr: Console Bake
- :keywords lang=fr: interface ligne de commande,development,bake view, bake template syntaxe,erb tags,asp tags,percent tags
diff --git a/docs/fr/usage.md b/docs/fr/usage.md
new file mode 100644
index 000000000..3515cd8bf
--- /dev/null
+++ b/docs/fr/usage.md
@@ -0,0 +1,53 @@
+# Génération de code avec Bake
+
+La console Bake est exécutée avec le CLI PHP.
+Si vous avez des problèmes en exécutant ce script, vérifiez que :
+
+1. Le CLI PHP est installé et qu'il a les bons modules activés, par exemple MySQL et `intl`.
+2. Si l'hôte de la base de données est `localhost`, essayez `127.0.0.1`, car `localhost` peut causer des problèmes avec PHP CLI.
+3. Selon la configuration de votre ordinateur, vous devrez peut-être donner les permissions d'exécution au script `cake` pour autoriser le lancement via `bin/cake bake`.
+
+Avant de lancer Bake, vous devez vous assurer qu'au moins une connexion de base de données est configurée.
+
+Vous pouvez voir la liste des commandes disponibles en lançant `bin/cake bake --help`.
+Pour Windows, utilisez `bin\cake bake --help` :
+
+```bash
+$ bin/cake bake --help
+Current Paths:
+
+* app: src/
+* root: /path/to/your/app/
+* core: /path/to/your/app/vendor/cakephp/cakephp/
+
+Available Commands:
+
+Bake:
+- bake all
+- bake behavior
+- bake cell
+- bake command
+- bake component
+- bake controller
+- bake controller all
+- bake fixture
+- bake fixture all
+- bake form
+- bake helper
+- bake mailer
+- bake middleware
+- bake model
+- bake model all
+- bake plugin
+- bake template
+- bake template all
+- bake test
+
+To run a command, type `cake command_name [args|options]`
+To get help on a specific command, type `cake command_name --help`
+```
+
+## Thèmes de Bake
+
+L'option `theme` est commune à toutes les commandes Bake et permet de changer les fichiers de template utilisés lors de la génération.
+Pour créer vos propres templates, référez-vous à [Créer un thème de Bake](/fr/development#creer-un-theme-de-bake).
diff --git a/docs/fr/usage.rst b/docs/fr/usage.rst
deleted file mode 100644
index 2a6e3d482..000000000
--- a/docs/fr/usage.rst
+++ /dev/null
@@ -1,65 +0,0 @@
-Génération de Code avec Bake
-############################
-
-La console Bake est exécutée en utilisant le CLI PHP
-(Interface de Ligne de Commande). Si vous avez des problèmes en exécutant ce
-script, vérifiez que :
-
-#. le CLI PHP est installé et qu'il a les bons modules activés (ex: MySQL, intl).
-#. Certains utilisateurs peuvent aussi rencontrer des problèmes si l'hôte de la
- base de données est 'localhost' et devront essayer '127.0.0.1' à la place,
- car localhost peut causer des problèmes avec PHP CLI.
-#. Selon la configuration de votre ordinateur, vous devrez peut-être donner les
- permissions d'exécution sur le script bash cake pour autoriser le lancement
- par ``bin/cake bake``.
-
-Avant de lancer bake, vous devrez vous assurer que vous avez au moins une
-connexion de base de données configurée.
-
-Vous pouvez voir la liste des commandes bake disponibles en lançant
-``bin/cake bake --help`` (pour Windows ``bin\cake bake --help``) ::
-
- $ bin/cake bake --help
- Current Paths:
-
- * app: src/
- * root: /path/to/your/app/
- * core: /path/to/your/app/vendor/cakephp/cakephp/
-
- Available Commands:
-
- Bake:
- - bake all
- - bake behavior
- - bake cell
- - bake command
- - bake component
- - bake controller
- - bake controller all
- - bake fixture
- - bake fixture all
- - bake form
- - bake helper
- - bake mailer
- - bake middleware
- - bake model
- - bake model all
- - bake plugin
- - bake template
- - bake template all
- - bake test
-
- To run a command, type `cake command_name [args|options]`
- To get help on a specific command, type `cake command_name --help`
-
-Thèmes de Bake
-==============
-
-L'option theme est commune à toutes les commandes de bake, et permet de changer
-les fichiers de template utilisés lors de la création avec bake. Pour créer vos
-propres templates, référez-vous :ref:`à la documentation sur la création de
-theme bake `.
-
-.. meta::
- :title lang=fr: Génération de Code avec Bake
- :keywords lang=fr: interface ligne de commande,application fonctionnelle,base de données,configuration base de données,bash script,ingredients basiques,project,model,path path,génération de code,scaffolding,windows users,configuration file,few minutes,config,view,models,running,mysql
diff --git a/docs/ja/conf.py b/docs/ja/conf.py
deleted file mode 100644
index 5871da648..000000000
--- a/docs/ja/conf.py
+++ /dev/null
@@ -1,9 +0,0 @@
-import sys, os
-
-# Append the top level directory of the docs, so we can import from the config dir.
-sys.path.insert(0, os.path.abspath('..'))
-
-# Pull in all the configuration options defined in the global config file..
-from config.all import *
-
-language = 'ja'
diff --git a/docs/ja/contents.rst b/docs/ja/contents.rst
deleted file mode 100644
index 08c3e957c..000000000
--- a/docs/ja/contents.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-.. toctree::
- :maxdepth: 2
- :caption: CakePHP Bake
-
- /index
- /usage
- /development
diff --git a/docs/ja/development.md b/docs/ja/development.md
new file mode 100644
index 000000000..867c3d313
--- /dev/null
+++ b/docs/ja/development.md
@@ -0,0 +1,315 @@
+# Bake の拡張
+
+Bake は、アプリケーションやプラグインが基本機能を変更または追加できる拡張可能なアーキテクチャーを備えています。
+Bake は [Twig](https://twig.symfony.com/) テンプレートエンジンを使う専用のビュークラスを利用します。
+
+## Bake イベント
+
+`BakeView` は、他のビュークラスと同様のイベントに加え、特別な initialize イベントを発します。
+標準ビュークラスはイベントプレフィックス `View.` を使いますが、`BakeView` は `Bake.` を使います。
+
+initialize イベントは、すべての Bake 出力に対する変更に使用できます。
+たとえば、Bake ビュークラスに別のヘルパーを追加するには次のようにします。
+
+```php
+on('Bake.initialize', function (EventInterface $event) {
+ $view = $event->getSubject();
+
+ // bake テンプレートの中で MySpecial ヘルパーの使用を可能にします
+ $view->loadHelper('MySpecial', ['some' => 'config']);
+
+ // そして、$author 変数を利用可能にするために追加
+ $view->set('author', 'Andy');
+});
+```
+
+別のプラグインの中から Bake を変更したい場合は、プラグインの `config/bootstrap.php` に Bake イベントを置くのが有効です。
+
+Bake イベントは、既存テンプレートへの小さな変更にも役立ちます。
+たとえば、コントローラーやテンプレートファイルを Bake するときに使う変数名を変更するには `Bake.beforeRender` を利用します。
+
+```php
+on('Bake.beforeRender', function (EventInterface $event) {
+ $view = $event->getSubject();
+
+ // indexes の中のメインデータ変数に $rows を使用
+ if ($view->get('pluralName')) {
+ $view->set('pluralName', 'rows');
+ }
+ if ($view->get('pluralVar')) {
+ $view->set('pluralVar', 'rows');
+ }
+
+ // view と edit の中のメインデータ変数に $theOne を使用
+ if ($view->get('singularName')) {
+ $view->set('singularName', 'theOne');
+ }
+ if ($view->get('singularVar')) {
+ $view->set('singularVar', 'theOne');
+ }
+});
+```
+
+`Bake.beforeRender` と `Bake.afterRender` を特定の生成ファイルに限定することもできます。
+たとえば `Controller/controller.twig` から生成する際に `UsersController` に特定アクションを追加したい場合は次のイベントを使用できます。
+
+```php
+on(
+ 'Bake.beforeRender.Controller.controller',
+ function (EventInterface $event) {
+ $view = $event->getSubject();
+ if ($view->get('name') === 'Users') {
+ // Users コントローラーに login と logout を追加
+ $view->set('actions', [
+ 'login',
+ 'logout',
+ 'index',
+ 'view',
+ 'add',
+ 'edit',
+ 'delete',
+ ]);
+ }
+ }
+);
+```
+
+特定の Bake テンプレートにイベントリスナーを絞ることで、Bake 関連のイベントロジックを単純にし、テストしやすいコールバックを提供できます。
+
+## Bake テンプレート構文
+
+Bake テンプレートファイルは [Twig](https://twig.symfony.com/doc/2.x/) 構文を使用します。
+
+たとえば、次のようにコマンドを Bake した場合:
+
+```bash
+bin/cake bake command Foo
+```
+
+`vendor/cakephp/bake/templates/bake/Command/command.twig` のテンプレートは次のようになります。
+
+```php
+Test->classSuffixes[$this->name()])) {
+ $this->Test->classSuffixes[$this->name()] = 'Foo';
+ }
+
+ $name = ucfirst($this->name());
+ if (!isset($this->Test->classTypes[$name])) {
+ $this->Test->classTypes[$name] = 'Foo';
+ }
+
+ return parent::bakeTest($className);
+}
+```
+
+- **class suffix** は `bake` 呼び出しで与えた名前に追加されます。前の例では `ExampleFooTest.php` を作成します。
+- **class type** はファイルに到達するためのサブ名前空間です。前の例では `App\Test\TestCase\Foo` という名前空間でテストを作成します。
+
+## BakeView クラスの設定
+
+Bake コマンドは、テンプレートをレンダリングするために `BakeView` クラスを使います。
+`Bake.initialize` イベントを監視するとインスタンスにアクセスできます。
+
+```php
+on(
+ 'Bake.initialize',
+ function ($event, $view) {
+ $view->loadHelper('Foo');
+ }
+);
+```
diff --git a/docs/ja/development.rst b/docs/ja/development.rst
deleted file mode 100644
index 6e8a0eeaa..000000000
--- a/docs/ja/development.rst
+++ /dev/null
@@ -1,341 +0,0 @@
-Bake の拡張
-###########
-
-Bake は、アプリケーションやプラグインが基本機能に対して変更または追加を可能にする
-拡張可能なアーキテクチャーを備えています。Bake は、 `Twig `_
-テンプレートエンジンを使用したビュークラスを利用します。
-
-Bake イベント
-=============
-
-``BakeView`` は、ビュークラスとして、他のビュークラスと同様のイベントに加え、
-1つの特別な初期化 (initialize) イベントを発します。しかし、一方で標準ビュークラスは、
-イベントのプレフィックス "View." を使用しますが、 ``BakeView`` は、
-イベントのプレフィックス "Bake." を使用しています。
-
-初期化イベントは、すべての bake の出力に対して変更を加えるために使用できます。
-例えば、bake ビュークラスに他のヘルパーを追加するためにこのイベントは使用されます。 ::
-
- on('Bake.initialize', function (EventInterface $event) {
- $view = $event->getSubject();
-
- // bake テンプレートの中で MySpecial ヘルパーの使用を可能にします
- $view->loadHelper('MySpecial', ['some' => 'config']);
-
- // そして、$author 変数を利用可能にするために追加
-\ $view->set('author', 'Andy');
- });
-
-別のプラグインの中から bake を変更したい場合は、プラグインの ``config/bootstrap.php``
-ファイルでプラグインの Bake イベントを置くことは良いアイデアです。
-
-Bake イベントは、既存のテンプレートに小さな変更を行うための便利なことができます。
-例えば、コントローラーやテンプレートファイルを bake する際に使用される変数名を
-変更するために、bake テンプレートで使用される変数を変更するために
-``Bake.beforeRender`` で呼び出される関数を使用することができます。 ::
-
- on('Bake.beforeRender', function (EventInterface $event) {
- $view = $event->getSubject();
-
- // indexes の中のメインデータ変数に $rows を使用
- if ($view->get('pluralName')) {
- $view->set('pluralName', 'rows');
- }
- if ($view->get('pluralVar')) {
- $view->set('pluralVar', 'rows');
- }
-
- // view と edit の中のメインデータ変数に $theOne を使用
- if ($view->get('singularName')) {
- $view->set('singularName', 'theOne');
- }
- if ($view->get('singularVar')) {
- $view->set('singularVar', 'theOne');
- }
-
-特定の生成されたファイルへの ``Bake.beforeRender`` と ``Bake.afterRender``
-イベントを指定することもあるでしょう。例えば、
-**Controller/controller.twig** ファイルから生成する際、 UsersController
-に特定のアクションを追加したい場合、以下のイベントを使用することができます。 ::
-
- on(
- 'Bake.beforeRender.Controller.controller',
- function (EventInterface $event) {
- $view = $event->getSubject();
- if ($view->get('name') === 'Users') {
- // Users コントローラーに login と logout を追加
- $view->set('actions', [
- 'login',
- 'logout',
- 'index',
- 'view',
- 'add',
- 'edit',
- 'delete',
- ]);
- }
- }
- );
-
-特定の bake テンプレートのためのイベントリスナーを指定することによって、
-bake 関連のイベント・ロジックを簡素化し、テストするのが容易であるコールバックを
-提供することができます。
-
-Bake テンプレート構文
-=====================
-
-Bake テンプレートファイルは、 `Twig `__
-テンプレート構文を使用します。
-
-だから、例えば、以下のようにコマンドを bake した場合:
-
-.. code-block:: bash
-
- bin/cake bake command Foo
-
-(**vendor/cakephp/bake/templates/bake/Command/command.twig**) を使用した
-テンプレートは、以下のようになります。 ::
-
- Test->classSuffixes[$this->name()])) {
- $this->Test->classSuffixes[$this->name()] = 'Foo';
- }
-
- $name = ucfirst($this->name());
- if (!isset($this->Test->classTypes[$name])) {
- $this->Test->classTypes[$name] = 'Foo';
- }
-
- return parent::bakeTest($className);
- }
-
-* **class suffix** は ``bake`` 呼び出しで与えられた名前に追加します。前の例では、
- ``ExampleFooTest.php`` ファイルを作成します。
-* **class type** は、(あなたが bake するアプリやプラグインに関連する)
- あなたのファイルを導くために使用されるサブ名前空間です。
- 前の例では、名前空間 ``App\Test\TestCase\Foo`` でテストを作成します。
-
-BakeView クラスの設定
-==============================
-
-bake コマンドは ``BakeView`` クラスをテンプレートをレンダリングするために使います。 You can
-access the instance by listening to the ``Bake.initialize`` イベントを監視するためにこのインスタンスにアクセスできます。 例えば、以下の様にして独自のヘルパーを読み込みbakeテンプレートで使用できます::
-
- on(
- 'Bake.initialize',
- function ($event, $view) {
- $view->loadHelper('Foo');
- }
- );
-
-.. meta::
- :title lang=ja: Bake の拡張
- :keywords lang=ja: command line interface,development,bake view, bake template syntax,twig,erb tags,percent tags
diff --git a/docs/ja/index.md b/docs/ja/index.md
new file mode 100644
index 000000000..bad397c78
--- /dev/null
+++ b/docs/ja/index.md
@@ -0,0 +1,26 @@
+# Bake コンソール
+
+CakePHP の Bake コンソールは、CakePHP を素早く使い始めるためのツールです。
+Bake コンソールは、モデル、ビヘイビアー、ビュー、ヘルパー、コントローラー、コンポーネント、
+テストケース、フィクスチャー、プラグインなど、CakePHP の基本的な素材を作成できます。
+単なるスケルトンクラスだけではなく、数分で完全に機能するアプリケーションを作成できます。
+
+## インストール手順
+
+Bake を使用したり拡張する前に、アプリケーションに Bake をインストールしてください。
+Bake は Composer を使ってインストールするプラグインとして提供されています。
+
+```bash
+composer require --dev cakephp/bake:"^3.0"
+```
+
+このコマンドは、Bake を開発用依存パッケージとしてインストールします。
+そのため、本番環境へのデプロイ時にはインストールされません。
+
+Twig テンプレートを使用する場合、`Cake/TwigView` プラグインをブートストラップとともに読み込んでいることを確認してください。
+完全に省略し、Bake プラグインに必要時だけ読み込ませることもできます。
+
+## ドキュメント一覧
+
+- [Bake でコード生成](/ja/usage) では CLI の実行、利用可能なコマンド、モデル生成、テーマについて説明します。
+- [Bake の拡張](/ja/development) ではイベント、Twig テンプレート、テーマ、カスタム Bake コマンドについて説明します。
diff --git a/docs/ja/index.rst b/docs/ja/index.rst
deleted file mode 100644
index ce1e65ed9..000000000
--- a/docs/ja/index.rst
+++ /dev/null
@@ -1,28 +0,0 @@
-Bake コンソール
-################
-
-CakePHP の bake コンソールは、迅速に CakePHP を動作させるまでを支援します。
-bake コンソールは、CakePHP の基本的な素材(モデル、ビヘイビアー、ビュー、ヘルパー、
-コントローラー、コンポーネント、テストケース、フィクスチャー、プラグイン)を作成できます。
-その為のスケルトンクラスについては、ここでは省略しますが、
-bake は数分で完全に機能するアプリケーションを作成できます。
-要するに、bake は足場の組まれたアプリケーションをいっぺんに手に入れるためにうってつけの方法です。
-
-インストール手順
-=================
-
-bake を使用したり拡張する前に、アプリケーションに bake をインストールしておいてください。
-bake は Composer を使ってインストールするプラグインとして提供されています。 ::
-
- composer require --dev cakephp/bake:"^3.0"
-
-上記のコマンドは、bake を開発環境で使用するパッケージとしてインストールします。
-この入れ方の場合、本番環境としてデプロイする際には、 bake はインストールされません。
-
-Twig テンプレートを使用する場合、 ``Cake/TwigView`` プラグインをブートストラップとともに
-読み込んでいることを確認してください。それを完全に省略して、
-Bake プラグインにこのプラグインを読み込ませることもできます。
-
-.. meta::
- :title lang=ja: Bakeコンソール
- :keywords lang=ja: コマンドライン,CLI,development,bake view, bake template syntax,erb tags,asp tags,percent tags
diff --git a/docs/ja/usage.md b/docs/ja/usage.md
new file mode 100644
index 000000000..09f3ec27d
--- /dev/null
+++ b/docs/ja/usage.md
@@ -0,0 +1,68 @@
+# Bake でコード生成
+
+Bake コンソールは PHP CLI で実行します。
+スクリプトの実行に問題がある場合は、次を確認してください。
+
+1. PHP CLI がインストールされていて、必要なモジュールが有効になっていること。例: MySQL、`intl`。
+2. データベースホストが `localhost` の場合は、代わりに `127.0.0.1` を試すこと。PHP CLI で問題になることがあります。
+3. コンピューターの設定によっては、`bin/cake bake` で使用する Cake スクリプトに実行権限を付ける必要があること。
+
+Bake を実行する前に、少なくとも 1 つのデータベース接続が設定されていることを確認してください。
+
+`bin/cake bake --help` を実行すると、利用可能な Bake コマンドを表示できます。
+Windows では `bin\cake bake --help` を使用します。
+
+```bash
+$ bin/cake bake --help
+Current Paths:
+
+* app: src/
+* root: /path/to/your/app/
+* core: /path/to/your/app/vendor/cakephp/cakephp/
+
+Available Commands:
+
+Bake:
+- bake all
+- bake behavior
+- bake cell
+- bake command
+- bake command_helper
+- bake component
+- bake controller
+- bake controller all
+- bake enum
+- bake fixture
+- bake fixture all
+- bake form
+- bake helper
+- bake mailer
+- bake middleware
+- bake model
+- bake model all
+- bake plugin
+- bake template
+- bake template all
+- bake test
+
+To run a command, type `cake command_name [args|options]`
+To get help on a specific command, type `cake command_name --help`
+```
+
+## Bake モデル
+
+モデルは既存のデータベーステーブルから生成されます。
+規約が適用されるため、外部キー `thing_id` とテーブル `things` の主キー `id` に基づいてリレーションが検出されます。
+
+規約から外れたリレーションの場合は、制約や外部キー定義の参照を使って Bake にリレーションを検出させることができます。
+
+```php
+->addForeignKey('billing_country_id', 'countries') // defaults to `id`
+->addForeignKey('shipping_country_id', 'countries', 'cid')
+```
+
+## Bake テーマ
+
+テーマオプションはすべての Bake コマンドで共通です。
+Bake 時に使用するテンプレートファイルを変更できます。
+テーマを作るには、[Bake テーマの作成](/ja/development#bake-テーマの作成) を参照してください。
diff --git a/docs/ja/usage.rst b/docs/ja/usage.rst
deleted file mode 100644
index 595c520f1..000000000
--- a/docs/ja/usage.rst
+++ /dev/null
@@ -1,72 +0,0 @@
-Bake でコード生成
-##################
-
-cake コンソールは、 PHP CLI (command line interface) で実行します。
-もしスクリプトの実行に問題があるなら、以下を満たしてください。
-
-#. PHP CLI がインストールされているか適切なモジュールが有効か確認してください (例:MySQL, intl)。
-#. データベースのホストが 'localhost' で問題があるなら、代わりに '127.0.0.1' を使って下さい。
- PHP CLI でこの問題がおこる可能性があります。
-#. 使っているコンピューターの設定に応じて、 ``bin/cake bake`` で使用する cake bash スクリプトの
- 実行権限を設定する必要があります。
-
-bake を実行する前にデータベースとの接続を確認しましょう。
-
-``bin/cake bake --help`` を実行すると可能なbakeコマンドを表示できます。
-(Windows システムの場合、 ``bin\cake bake --help`` を使います。)::
-
- $ bin/cake bake --help
- Current Paths:
-
- * app: src/
- * root: /path/to/your/app/
- * core: /path/to/your/app/vendor/cakephp/cakephp/
-
- Available Commands:
-
- Bake:
- - bake all
- - bake behavior
- - bake cell
- - bake command
- - bake command_helper
- - bake component
- - bake controller
- - bake controller all
- - bake enum
- - bake fixture
- - bake fixture all
- - bake form
- - bake helper
- - bake mailer
- - bake middleware
- - bake model
- - bake model all
- - bake plugin
- - bake template
- - bake template all
- - bake test
-
- To run a command, type `cake command_name [args|options]`
- To get help on a specific command, type `cake command_name --help`
-
-Bake モデル
-===========
-
-モデルは、既存のデータベーステーブルから一般的に生成(bake)されます。
-規約が適用されるため、外部キー ``thing_id`` とテーブル ``things`` の主キー ``id`` に基づいてリレーションが検出されます。
-
-規約から外れたリレーションの場合、Bake がリレーションを検出するために、制約/外部キー定義でリレーションを使用できます。例::
-
- ->addForeignKey('billing_country_id', 'countries') // defaults to `id`
- ->addForeignKey('shipping_country_id', 'countries', 'cid')
-
-Bake テーマ
-=====================
-
-テーマオプションは全 bake コマンドで共通です。また、bakeする際のbake テンプレートファイルを変更することができます。
-テーマを作るには、 :ref:`Bake テーマ作成ドキュメント ` をご覧ください。
-
-.. meta::
- :title lang=ja: Code Generation with Bake
- :keywords lang=ja: command line interface,functional application,database,database configuration,bash script,basic ingredients,project,model,path path,code generation,scaffolding,windows users,configuration file,few minutes,config,view,models,running,mysql
diff --git a/docs/package-lock.json b/docs/package-lock.json
new file mode 100644
index 000000000..44d78852e
--- /dev/null
+++ b/docs/package-lock.json
@@ -0,0 +1,2104 @@
+{
+ "name": "docs",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "docs",
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "@cakephp/docs-skeleton": "git+ssh://git@github.com:cakephp/docs-skeleton.git#node-package",
+ "vitepress": "^2.0.0-alpha.16"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
+ "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@cakephp/docs-skeleton": {
+ "version": "1.0.0",
+ "resolved": "git+ssh://git@github.com/cakephp/docs-skeleton.git#301764679a61f4e419e28e98bec9800de0fd4bce",
+ "bin": {
+ "cakedocs": "bin/cakedocs.js"
+ },
+ "peerDependencies": {
+ "vitepress": "^2.0.0-alpha.15"
+ }
+ },
+ "node_modules/@docsearch/css": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.2.tgz",
+ "integrity": "sha512-fH/cn8BjEEdM2nJdjNMHIvOVYupG6AIDtFVDgIZrNzdCSj4KXr9kd+hsehqsNGYjpUjObeKYKvgy/IwCb1jZYQ==",
+ "license": "MIT"
+ },
+ "node_modules/@docsearch/js": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-4.6.2.tgz",
+ "integrity": "sha512-qj1yoxl3y4GKoK7+VM6fq/rQqPnvUmg3IKzJ9x0VzN14QVzdB/SG/J6VfV1BWT5RcPUFxIcVwoY1fwHM2fSRRw==",
+ "license": "MIT"
+ },
+ "node_modules/@docsearch/sidepanel-js": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/@docsearch/sidepanel-js/-/sidepanel-js-4.6.2.tgz",
+ "integrity": "sha512-Pni85AP/GwRj7fFg8cBJp0U04tzbueBvWSd3gysgnOsVnQVSZwSYncfErUScLE1CAtR+qocPDFjmYR9AMRNJtQ==",
+ "license": "MIT"
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz",
+ "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz",
+ "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz",
+ "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz",
+ "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz",
+ "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz",
+ "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz",
+ "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz",
+ "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz",
+ "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz",
+ "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz",
+ "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz",
+ "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz",
+ "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz",
+ "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz",
+ "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz",
+ "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz",
+ "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz",
+ "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz",
+ "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz",
+ "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz",
+ "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@iconify-json/simple-icons": {
+ "version": "1.2.76",
+ "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.76.tgz",
+ "integrity": "sha512-lLRlA8yaf+1L5VCPRvR9lynoSklsddKHEylchmZJKdj/q2xVQ1ZAEJ8SCQlv9cbgtMefnlyM98U+8Si2aoFZPA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-rc.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz",
+ "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==",
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz",
+ "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz",
+ "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz",
+ "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz",
+ "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz",
+ "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz",
+ "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz",
+ "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz",
+ "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz",
+ "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz",
+ "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz",
+ "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz",
+ "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz",
+ "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz",
+ "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz",
+ "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz",
+ "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz",
+ "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz",
+ "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz",
+ "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz",
+ "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz",
+ "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz",
+ "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz",
+ "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz",
+ "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz",
+ "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@shikijs/core": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz",
+ "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4",
+ "hast-util-to-html": "^9.0.5"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz",
+ "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^4.3.4"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz",
+ "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz",
+ "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0"
+ }
+ },
+ "node_modules/@shikijs/themes": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz",
+ "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0"
+ }
+ },
+ "node_modules/@shikijs/transformers": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.23.0.tgz",
+ "integrity": "sha512-F9msZVxdF+krQNSdQ4V+Ja5QemeAoTQ2jxt7nJCwhDsdF1JWS3KxIQXA3lQbyKwS3J61oHRUSv4jYWv3CkaKTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "3.23.0",
+ "@shikijs/types": "3.23.0"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz",
+ "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "14.1.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.21",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
+ "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==",
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "license": "ISC"
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.5.tgz",
+ "integrity": "sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==",
+ "license": "MIT",
+ "dependencies": {
+ "@rolldown/pluginutils": "1.0.0-rc.2"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.32",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.32.tgz",
+ "integrity": "sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.2",
+ "@vue/shared": "3.5.32",
+ "entities": "^7.0.1",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.32",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.32.tgz",
+ "integrity": "sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.32",
+ "@vue/shared": "3.5.32"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.32",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.32.tgz",
+ "integrity": "sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.2",
+ "@vue/compiler-core": "3.5.32",
+ "@vue/compiler-dom": "3.5.32",
+ "@vue/compiler-ssr": "3.5.32",
+ "@vue/shared": "3.5.32",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.21",
+ "postcss": "^8.5.8",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.32",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.32.tgz",
+ "integrity": "sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.32",
+ "@vue/shared": "3.5.32"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.1.tgz",
+ "integrity": "sha512-bsDMJ07b3GN1puVwJb/fyFnj/U2imyswK5UQVLZwVl7O05jDrt6BHxeG5XffmOOdasOj/bOmIjxJvGPxU7pcqw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-kit": "^8.1.1"
+ }
+ },
+ "node_modules/@vue/devtools-kit": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.1.tgz",
+ "integrity": "sha512-gVBaBv++i+adg4JpH71k9ppl4soyR7Y2McEqO5YNgv0BI1kMZ7BDX5gnwkZ5COYgiCyhejZG+yGNrBAjj6Coqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-shared": "^8.1.1",
+ "birpc": "^2.6.1",
+ "hookable": "^5.5.3",
+ "perfect-debounce": "^2.0.0"
+ }
+ },
+ "node_modules/@vue/devtools-shared": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.1.tgz",
+ "integrity": "sha512-+h4ttmJYl/txpxHKaoZcaKpC+pvckgLzIDiSQlaQ7kKthKh8KuwoLW2D8hPJEnqKzXOvu15UHEoGyngAXCz0EQ==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.32",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.32.tgz",
+ "integrity": "sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.5.32"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.32",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.32.tgz",
+ "integrity": "sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.32",
+ "@vue/shared": "3.5.32"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.32",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.32.tgz",
+ "integrity": "sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.32",
+ "@vue/runtime-core": "3.5.32",
+ "@vue/shared": "3.5.32",
+ "csstype": "^3.2.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.32",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.32.tgz",
+ "integrity": "sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.32",
+ "@vue/shared": "3.5.32"
+ },
+ "peerDependencies": {
+ "vue": "3.5.32"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.32",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.32.tgz",
+ "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==",
+ "license": "MIT"
+ },
+ "node_modules/@vueuse/core": {
+ "version": "14.2.1",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.2.1.tgz",
+ "integrity": "sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.21",
+ "@vueuse/metadata": "14.2.1",
+ "@vueuse/shared": "14.2.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
+ "node_modules/@vueuse/integrations": {
+ "version": "14.2.1",
+ "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-14.2.1.tgz",
+ "integrity": "sha512-2LIUpBi/67PoXJGqSDQUF0pgQWpNHh7beiA+KG2AbybcNm+pTGWT6oPGlBgUoDWmYwfeQqM/uzOHqcILpKL7nA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vueuse/core": "14.2.1",
+ "@vueuse/shared": "14.2.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "async-validator": "^4",
+ "axios": "^1",
+ "change-case": "^5",
+ "drauu": "^0.4",
+ "focus-trap": "^7 || ^8",
+ "fuse.js": "^7",
+ "idb-keyval": "^6",
+ "jwt-decode": "^4",
+ "nprogress": "^0.2",
+ "qrcode": "^1.5",
+ "sortablejs": "^1",
+ "universal-cookie": "^7 || ^8",
+ "vue": "^3.5.0"
+ },
+ "peerDependenciesMeta": {
+ "async-validator": {
+ "optional": true
+ },
+ "axios": {
+ "optional": true
+ },
+ "change-case": {
+ "optional": true
+ },
+ "drauu": {
+ "optional": true
+ },
+ "focus-trap": {
+ "optional": true
+ },
+ "fuse.js": {
+ "optional": true
+ },
+ "idb-keyval": {
+ "optional": true
+ },
+ "jwt-decode": {
+ "optional": true
+ },
+ "nprogress": {
+ "optional": true
+ },
+ "qrcode": {
+ "optional": true
+ },
+ "sortablejs": {
+ "optional": true
+ },
+ "universal-cookie": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "14.2.1",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.2.1.tgz",
+ "integrity": "sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "14.2.1",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.2.1.tgz",
+ "integrity": "sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
+ "node_modules/birpc": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz",
+ "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz",
+ "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.7",
+ "@esbuild/android-arm": "0.27.7",
+ "@esbuild/android-arm64": "0.27.7",
+ "@esbuild/android-x64": "0.27.7",
+ "@esbuild/darwin-arm64": "0.27.7",
+ "@esbuild/darwin-x64": "0.27.7",
+ "@esbuild/freebsd-arm64": "0.27.7",
+ "@esbuild/freebsd-x64": "0.27.7",
+ "@esbuild/linux-arm": "0.27.7",
+ "@esbuild/linux-arm64": "0.27.7",
+ "@esbuild/linux-ia32": "0.27.7",
+ "@esbuild/linux-loong64": "0.27.7",
+ "@esbuild/linux-mips64el": "0.27.7",
+ "@esbuild/linux-ppc64": "0.27.7",
+ "@esbuild/linux-riscv64": "0.27.7",
+ "@esbuild/linux-s390x": "0.27.7",
+ "@esbuild/linux-x64": "0.27.7",
+ "@esbuild/netbsd-arm64": "0.27.7",
+ "@esbuild/netbsd-x64": "0.27.7",
+ "@esbuild/openbsd-arm64": "0.27.7",
+ "@esbuild/openbsd-x64": "0.27.7",
+ "@esbuild/openharmony-arm64": "0.27.7",
+ "@esbuild/sunos-x64": "0.27.7",
+ "@esbuild/win32-arm64": "0.27.7",
+ "@esbuild/win32-ia32": "0.27.7",
+ "@esbuild/win32-x64": "0.27.7"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/focus-trap": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-8.0.1.tgz",
+ "integrity": "sha512-9ptSG6z51YQOstI/oN4XuVGP/03u2nh0g//qz7L6zX0i6PZiPnkcf3GenXq7N2hZnASXaMxTPpbKwdI+PFvxlw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "tabbable": "^6.4.0"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "license": "MIT"
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/mark.js": {
+ "version": "8.11.1",
+ "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz",
+ "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/minisearch": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz",
+ "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/oniguruma-parser": {
+ "version": "0.12.1",
+ "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz",
+ "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==",
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-to-es": {
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.5.tgz",
+ "integrity": "sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==",
+ "license": "MIT",
+ "dependencies": {
+ "oniguruma-parser": "^0.12.1",
+ "regex": "^6.1.0",
+ "regex-recursion": "^6.0.2"
+ }
+ },
+ "node_modules/perfect-debounce": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz",
+ "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
+ "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz",
+ "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
+ "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-utilities": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+ "license": "MIT"
+ },
+ "node_modules/rollup": {
+ "version": "4.60.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz",
+ "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.60.1",
+ "@rollup/rollup-android-arm64": "4.60.1",
+ "@rollup/rollup-darwin-arm64": "4.60.1",
+ "@rollup/rollup-darwin-x64": "4.60.1",
+ "@rollup/rollup-freebsd-arm64": "4.60.1",
+ "@rollup/rollup-freebsd-x64": "4.60.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.60.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.60.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.60.1",
+ "@rollup/rollup-linux-arm64-musl": "4.60.1",
+ "@rollup/rollup-linux-loong64-gnu": "4.60.1",
+ "@rollup/rollup-linux-loong64-musl": "4.60.1",
+ "@rollup/rollup-linux-ppc64-gnu": "4.60.1",
+ "@rollup/rollup-linux-ppc64-musl": "4.60.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.60.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.60.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.60.1",
+ "@rollup/rollup-linux-x64-gnu": "4.60.1",
+ "@rollup/rollup-linux-x64-musl": "4.60.1",
+ "@rollup/rollup-openbsd-x64": "4.60.1",
+ "@rollup/rollup-openharmony-arm64": "4.60.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.60.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.60.1",
+ "@rollup/rollup-win32-x64-gnu": "4.60.1",
+ "@rollup/rollup-win32-x64-msvc": "4.60.1",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/shiki": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz",
+ "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "3.23.0",
+ "@shikijs/engine-javascript": "3.23.0",
+ "@shikijs/engine-oniguruma": "3.23.0",
+ "@shikijs/langs": "3.23.0",
+ "@shikijs/themes": "3.23.0",
+ "@shikijs/types": "3.23.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/tabbable": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz",
+ "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==",
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vite": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
+ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "esbuild": "^0.27.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitepress": {
+ "version": "2.0.0-alpha.17",
+ "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-2.0.0-alpha.17.tgz",
+ "integrity": "sha512-Z3VPUpwk/bHYqt1uMVOOK1/4xFiWQov1GNc2FvMdz6kvje4JRXEOngVI9C+bi5jeedMSHiA4dwKkff1NCvbZ9Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@docsearch/css": "^4.5.3",
+ "@docsearch/js": "^4.5.3",
+ "@docsearch/sidepanel-js": "^4.5.3",
+ "@iconify-json/simple-icons": "^1.2.69",
+ "@shikijs/core": "^3.22.0",
+ "@shikijs/transformers": "^3.22.0",
+ "@shikijs/types": "^3.22.0",
+ "@types/markdown-it": "^14.1.2",
+ "@vitejs/plugin-vue": "^6.0.4",
+ "@vue/devtools-api": "^8.0.5",
+ "@vue/shared": "^3.5.27",
+ "@vueuse/core": "^14.2.0",
+ "@vueuse/integrations": "^14.2.0",
+ "focus-trap": "^8.0.0",
+ "mark.js": "8.11.1",
+ "minisearch": "^7.2.0",
+ "shiki": "^3.22.0",
+ "vite": "^7.3.1",
+ "vue": "^3.5.27"
+ },
+ "bin": {
+ "vitepress": "bin/vitepress.js"
+ },
+ "peerDependencies": {
+ "markdown-it-mathjax3": "^4",
+ "oxc-minify": "*",
+ "postcss": "^8"
+ },
+ "peerDependenciesMeta": {
+ "markdown-it-mathjax3": {
+ "optional": true
+ },
+ "oxc-minify": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.32",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.32.tgz",
+ "integrity": "sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.32",
+ "@vue/compiler-sfc": "3.5.32",
+ "@vue/runtime-dom": "3.5.32",
+ "@vue/server-renderer": "3.5.32",
+ "@vue/shared": "3.5.32"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/docs/package.json b/docs/package.json
new file mode 100644
index 000000000..f1407730a
--- /dev/null
+++ b/docs/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "docs",
+ "version": "1.0.0",
+ "description": "",
+ "main": "config.js",
+ "scripts": {
+ "docs:dev": "vitepress dev",
+ "docs:build": "vitepress build",
+ "docs:preview": "vitepress preview"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "type": "module",
+ "dependencies": {
+ "@cakephp/docs-skeleton": "git+ssh://git@github.com:cakephp/docs-skeleton.git#node-package",
+ "vitepress": "^2.0.0-alpha.16"
+ }
+}
diff --git a/docs/pt/conf.py b/docs/pt/conf.py
deleted file mode 100644
index 9e22cb017..000000000
--- a/docs/pt/conf.py
+++ /dev/null
@@ -1,9 +0,0 @@
-import sys, os
-
-# Append the top level directory of the docs, so we can import from the config dir.
-sys.path.insert(0, os.path.abspath('..'))
-
-# Pull in all the configuration options defined in the global config file..
-from config.all import *
-
-language = 'pt'
diff --git a/docs/pt/contents.rst b/docs/pt/contents.rst
deleted file mode 100644
index 08c3e957c..000000000
--- a/docs/pt/contents.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-.. toctree::
- :maxdepth: 2
- :caption: CakePHP Bake
-
- /index
- /usage
- /development
diff --git a/docs/pt/development.md b/docs/pt/development.md
new file mode 100644
index 000000000..415e648d2
--- /dev/null
+++ b/docs/pt/development.md
@@ -0,0 +1,262 @@
+# Estendendo o Bake
+
+O Bake fornece uma arquitetura expansível que permite à sua aplicação ou plugin modificar ou adicionar funcionalidades às funções básicas.
+Bake faz uso de uma classe view dedicada que usa o mecanismo de templates [Twig](https://twig.symfony.com/).
+
+## Eventos do Bake
+
+Como uma classe view, `BakeView` emite os mesmos eventos que qualquer outra classe view, mais um evento extra de inicialização.
+Enquanto as classes view padrão usam o prefixo `View.`, `BakeView` usa o prefixo `Bake.`.
+
+O evento de inicialização pode ser usado para fazer mudanças que se aplicam a todas as saídas do Bake.
+Por exemplo, ao adicionar outro helper à classe view do Bake:
+
+```php
+on('Bake.initialize', function (Event $event) {
+ $view = $event->getSubject();
+
+ // In my bake templates, allow the use of the MySpecial helper
+ $view->loadHelper('MySpecial', ['some' => 'config']);
+
+ // And add an $author variable so it's always available
+ $view->set('author', 'Andy');
+});
+```
+
+Se você deseja modificar o Bake a partir de outro plugin, é recomendável colocar os eventos do plugin no arquivo `config/bootstrap.php`.
+
+Os eventos do Bake podem ser úteis para pequenas alterações nos templates existentes.
+Por exemplo, para alterar os nomes das variáveis usados no controller e template quando executar o Bake:
+
+```php
+on('Bake.beforeRender', function (Event $event) {
+ $view = $event->getSubject();
+
+ // Use $rows for the main data variable in indexes
+ if ($view->get('pluralName')) {
+ $view->set('pluralName', 'rows');
+ }
+ if ($view->get('pluralVar')) {
+ $view->set('pluralVar', 'rows');
+ }
+
+ // Use $theOne for the main data variable in view/edit
+ if ($view->get('singularName')) {
+ $view->set('singularName', 'theOne');
+ }
+ if ($view->get('singularVar')) {
+ $view->set('singularVar', 'theOne');
+ }
+});
+```
+
+Você também pode aplicar os eventos `Bake.beforeRender` e `Bake.afterRender` a um arquivo específico.
+Por exemplo, se quiser adicionar ações ao `UsersController` ao gerar a partir de `Controller/controller.twig`:
+
+```php
+on(
+ 'Bake.beforeRender.Controller.controller',
+ function (Event $event) {
+ $view = $event->getSubject();
+ if ($view->viewVars['name'] == 'Users') {
+ // add the login and logout actions to the Users controller
+ $view->set('actions', [
+ 'login',
+ 'logout',
+ 'index',
+ 'view',
+ 'add',
+ 'edit',
+ 'delete',
+ ]);
+ }
+ }
+);
+```
+
+Ao adicionar listeners específicos para determinados templates do Bake, você simplifica a lógica relacionada ao Bake e fornece callbacks fáceis de testar.
+
+## Sintaxe de Templates do Bake
+
+Os arquivos de template do Bake usam a sintaxe [Twig](https://twig.symfony.com/doc/2.x/).
+
+Então, por exemplo, quando você executar algo como:
+
+```bash
+$ bin/cake bake shell Foo
+```
+
+O template usado em `vendor/cakephp/bake/src/Template/Bake/Shell/shell.twig` parece com isto:
+
+```php
+` fecha uma tag PHP de template Bake.
+- `<%=` é a forma short-echo do template Bake.
+- `<%-` abre a tag removendo espaços em branco antes dela.
+- `-%>` fecha a tag removendo espaços em branco após ela.
+:::
+
+## Criando um Tema Bake
+
+Se você deseja modificar a saída produzida com o comando `bake`, pode criar seu próprio tema para substituir alguns ou todos os templates que o Bake usa.
+
+1. Gere um novo plugin. O nome do plugin é o nome do tema.
+2. Crie uma nova pasta em `plugins/[name]/Template/Bake/Template/`.
+3. Copie qualquer template que queira modificar de `vendor/cakephp/bake/src/Template/Bake/Template` para a pasta acima e altere conforme sua necessidade.
+4. Ao executar o Bake, use a opção `--theme` para especificar o tema. Para evitar repetir isso a cada chamada, também é possível definir o tema padrão:
+
+```php
+Test->classSuffixes[$this->name()])) {
+ $this->Test->classSuffixes[$this->name()] = 'Foo';
+ }
+
+ $name = ucfirst($this->name());
+ if (!isset($this->Test->classTypes[$name])) {
+ $this->Test->classTypes[$name] = 'Foo';
+ }
+
+ return parent::bakeTest($className);
+}
+```
+
+- O **sufixo da classe** será anexado ao nome fornecido na chamada ao Bake. No exemplo acima, isso criaria `ExampleFooTest.php`.
+- O **tipo de classe** será o subnamespace usado para levar ao arquivo relativo à aplicação ou plugin. No exemplo acima, isso criaria o namespace `App\Test\TestCase\Foo`.
diff --git a/docs/pt/development.rst b/docs/pt/development.rst
deleted file mode 100644
index 9a24232be..000000000
--- a/docs/pt/development.rst
+++ /dev/null
@@ -1,298 +0,0 @@
-Estendendo o Bake
-#################
-
-O Bake fornece uma arquitetura expansível que permite a sua aplicação ou plugin
-modificar ou adicionar funcionalidades às suas funções básicas. Bake faz uso de
-uma classe view dedicada que usa a ferramenta de templates `Twig
-`_.
-
-Eventos do Bake
-===============
-
-Como uma class view , ``BakeView`` emite o mesmo evento como qualquer outra
-classe view, mais uma extra que inicializa eventos. No entanto, onde as classes
-view padrão usam o prefixo "View.", ``BakeView`` usa o prefixo "Bake.".
-
-O inicializador de eventos pode ser usado para fazer mudanças quando aplicado
-a todas as saídas do Bake, por exemplo, ao adicionar outro helper à classe bake
-view este evento pode ser usado::
-
- on('Bake.initialize', function (Event $event) {
- $view = $event->getSubject();
-
- // In my bake templates, allow the use of the MySpecial helper
- $view->loadHelper('MySpecial', ['some' => 'config']);
-
- // And add an $author variable so it's always available
- $view->set('author', 'Andy');
-
- });
-
-Se você deseja modificar o bake de outro plugin, é recomendável colocar os
-eventos do bake do seu plugin no arquivo **config/bootstrap.php**.
-
-Os eventos do Bake podem ser úteis para fazer pequenas alterações nos modelos
-existentes. Por exemplo, para alterar os nomes das variáveis usados no
-controller/template quando executar o bake, pode-se usar uma função esperando
-o ``Bake.beforeRender`` para modificar as variáveis usadas no bake templates::
-
- on('Bake.beforeRender', function (Event $event) {
- $view = $event->getSubject();
-
- // Use $rows for the main data variable in indexes
- if ($view->get('pluralName')) {
- $view->set('pluralName', 'rows');
- }
- if ($view->get('pluralVar')) {
- $view->set('pluralVar', 'rows');
- }
-
- // Use $theOne for the main data variable in view/edit
- if ($view->get('singularName')) {
- $view->set('singularName', 'theOne');
- }
- if ($view->get('singularVar')) {
- $view->set('singularVar', 'theOne');
- }
-
- });
-
-Você também pode abranger os eventos ``Bake.beforeRender``
-e ``Bake.afterRender`` para um arquivo específico. Por exemplo, se você quiser
-adicionar ações específicas para seu UsersController ao gerar a partir de um
-arquivo **Controller/controller.twig**, você pode usar o seguinte evento::
-
- on(
- 'Bake.beforeRender.Controller.controller',
- function (Event $event) {
- $view = $event->getSubject();
- if ($view->viewVars['name'] == 'Users') {
- // add the login and logout actions to the Users controller
- $view->set('actions', [
- 'login',
- 'logout',
- 'index',
- 'view',
- 'add',
- 'edit',
- 'delete'
- ]);
- }
- }
- );
-
-Ao adicionar eventos que escutam um bake templates específico, você pode
-simplesmente relacionar a sua lógica de eventos com o bake e fornecer callbacks
-que são facilmente testáveis.
-
-Sintaxe de Templates do Bake
-============================
-
-Os arquivos de templates do Bake usam a sintaxe `Twig `__.
-
-Então, por exemplo, quando você executar algo como::
-
-.. code-block:: bash
-
- $ bin/cake bake shell Foo
-
-O template usado (**vendor/cakephp/bake/src/Template/Bake/Shell/shell.twig**)
-parece com algo assim::
-
- `` Um template bake php fecha a tag
- * ``<%=`` Um template bake php short-echo tag
- * ``<%-`` Um template bake php abre a tag, retirando qualquer espaço em branco antes da tag
- * ``-%>`` Um template bake php fecha a tag, retirando qualqualquer espaço em branco após a tag
-
-.. _creating-a-bake-theme:
-
-Criando um Tema Bake
-=====================
-
-Se você deseja modificar a saída produzida com o comando bake, você pode criar
-o seu próprio tema para o bake que permitirá você substituir algum ou todos os
-tempaltes que o bake usa. O mmelhor jeito de fazer isto é:
-
-#. Bake um novo plugin. O nome do plugin é o 'nome do tema'
-#. Crie uma nova pasta em **plugins/[name]/Template/Bake/Template/**.
-#. Copie qualquer template que você queira modificar de
- **vendor/cakephp/bake/src/Template/Bake/Template** para a pasta acima e modificá-los conforme sua necessidade.
-#. Quando executar o bake use a opção ``--theme`` para especificar qual o tema
- que o bake deve usar. Para evitar problemas com esta opção, em cada chamada,
- você também pode definir o seu template customizado para ser usado como
- o template padrão::
-
- Test->classSuffixes[$this->name()])) {
- $this->Test->classSuffixes[$this->name()] = 'Foo';
- }
-
- $name = ucfirst($this->name());
- if (!isset($this->Test->classTypes[$name])) {
- $this->Test->classTypes[$name] = 'Foo';
- }
-
- return parent::bakeTest($className);
- }
-
-* O **sufixo da classe** será anexado ao nome fornecido em sua chamada bake. No
- exemplo anterior, ele criaria um arquivo ExampleFooTest.php.
-* O **tipo de classe** será o subdomínio usado que levará ao seu arquivo
- (relativo ao aplicativo ou ao plugin em que você está inserindo). No exemplo
- anterior, ele criaria seu teste com o namespace App\Test\TestCase\Foo.
-
-
-.. meta::
- :title lang=en: Extending Bake
- :keywords lang=en: command line interface,development,bake view, bake template syntax,twig,erb tags,percent tags
-
diff --git a/docs/pt/index.md b/docs/pt/index.md
new file mode 100644
index 000000000..fb09a83d4
--- /dev/null
+++ b/docs/pt/index.md
@@ -0,0 +1,25 @@
+# Console Bake
+
+O console do Bake é uma ferramenta para você sair produzindo em CakePHP rapidamente.
+Ele pode criar os itens básicos do CakePHP, como models, behaviors, views, helpers,
+controllers, components, test cases, fixtures e plugins.
+Bake pode ir além de classes esqueleto e gerar uma base funcional em poucos minutos.
+
+## Instalação
+
+Antes de usar ou estender o Bake, tenha certeza de que ele está instalado em sua aplicação.
+Bake é distribuído como um plugin que você pode instalar com Composer:
+
+```bash
+composer require --dev cakephp/bake:~2.0
+```
+
+Isso instala o Bake como dependência de desenvolvimento, portanto ele não será instalado em produção.
+
+Ao usar templates Twig, verifique se você está carregando o plugin `Cake/TwigView` com seu bootstrap.
+Você também pode omiti-lo completamente, o que faz com que o plugin Bake carregue esse plugin sob demanda.
+
+## Mapa da documentação
+
+- [Geração de código com Bake](/pt/usage) cobre a execução do CLI, os comandos disponíveis e os temas do Bake.
+- [Estendendo o Bake](/pt/development) cobre eventos, templates, temas e novos comandos de Bake.
diff --git a/docs/pt/index.rst b/docs/pt/index.rst
deleted file mode 100644
index 8d068757e..000000000
--- a/docs/pt/index.rst
+++ /dev/null
@@ -1,30 +0,0 @@
-Console Bake
-############
-
-O console do **Bake** é outra ferramenta disponível para você sair trabalhando
-- e rápido! O console Bake pode criar qualquer ítem básico do CakePHP: models,
-behaviors, views, helpers, controllers, components, test cases, fixtures
-e plugins. E nós não estamos apenas falando do esqueleto da classes: O Bake
-pode criar uma aplicação totalmente funcional em questão de minutos. De fato,
-o Bake é um passo natural a se dar uma vez que a aplicação tem sua base
-construída.
-
-Instalação
-==========
-
-Antes de tentar usar ou estender o Bake, tenha certeza de que ele está instalado em
-sua aplicação. O Bake é distribuído como um plugin que você pode instalar com o
-Composer::
-
- composer require --dev cakephp/bake:~2.0
-
-Isto irá instalar o Bake como uma dependência de desenvolvimento, sendo assim,
-não será instalado no ambiente de produção.
-
-Ao usar os modelos Twig, verifique se você está carregando o plugin
-Cake/TwigView com seu bootstrap. Você também pode omiti-lo completamente,
-o que faz com que o plugin Bake carregue esse plugin sob demanda.
-
-.. meta::
- :title lang=pt: Bake Console
- :keywords lang=pt: cli,linha de comando,command line,dev,desenvolvimento,bake view, bake syntax,erb tags,asp tags,percent tags
diff --git a/docs/pt/usage.md b/docs/pt/usage.md
new file mode 100644
index 000000000..fd89ed1ae
--- /dev/null
+++ b/docs/pt/usage.md
@@ -0,0 +1,104 @@
+# Geração de Código com Bake
+
+O console do Bake é executado usando o PHP CLI.
+Se você tiver problemas para executar o script, assegure-se de que:
+
+1. Você instalou o PHP CLI e possui os módulos apropriados habilitados, por exemplo MySQL e `intl`.
+2. Se o host do banco de dados for `localhost`, tente `127.0.0.1`, pois `localhost` pode causar problemas no PHP CLI.
+3. Dependendo de como o seu computador está configurado, pode ser necessário definir permissões de execução no script Cake para chamá-lo com `bin/cake bake`.
+
+Antes de executar o Bake, você deve ter pelo menos uma conexão de banco de dados configurada.
+
+Para ver as opções disponíveis no Bake, digite:
+
+```bash
+$ bin/cake bake --help
+
+Current Paths:
+
+* app: src
+* root: .
+* core: .\vendor\cakephp\cakephp
+
+Available Commands:
+
+Bake:
+ - bake all
+ - bake behavior
+ - bake cell
+ - bake command
+ - bake component
+ - bake controller
+ - bake controller all
+ - bake fixture
+ - bake fixture all
+ - bake form
+ - bake helper
+ - bake mailer
+ - bake middleware
+ - bake model
+ - bake model all
+ - bake plugin
+ - bake task
+ - bake template
+ - bake template all
+ - bake test
+
+To run a command, type `cake command_name [args|options]`
+To get help on a specific command, type `cake command_name --help`
+```
+
+Você pode obter mais informações sobre o que cada tarefa faz e quais são suas opções usando `--help`:
+
+```bash
+$ bin/cake bake model --help
+
+Bake table and entity classes.
+
+Usage:
+cake bake model [options] []
+
+Options:
+
+--connection, -c The datasource connection to get data from.
+ (default: default)
+--display-field The displayField if you would like to choose one.
+--fields A comma separated list of fields to make
+ accessible.
+--force, -f Force overwriting existing files without
+ prompting.
+--help, -h Display this help.
+--hidden A comma separated list of fields to hide.
+--no-associations Disable generating associations.
+--no-entity Disable generating an entity class.
+--no-fields Disable generating accessible fields in the
+ entity.
+--no-fixture Do not generate a test fixture skeleton.
+--no-hidden Disable generating hidden fields in the entity.
+--no-rules Disable generating a rules checker.
+--no-table Disable generating a table class.
+--no-test Do not generate a test case skeleton.
+--no-validation Disable generating validation rules.
+--plugin, -p Plugin to bake into.
+--primary-key The primary key if you would like to manually set
+ one. Can be a comma separated list if you are
+ using a composite primary key.
+--quiet, -q Enable quiet output.
+--table The table name to use if you have
+ non-conventional table names.
+--theme, -t The theme to use when baking code.
+--verbose, -v Enable verbose output.
+
+Arguments:
+
+name Name of the model to bake (without the Table suffix). You can use
+ Plugin.name to bake plugin models. (optional)
+
+Omitting all arguments and options will list the table names you can
+generate models for.
+```
+
+## Temas para o Bake
+
+A opção `theme` é comum a todos os comandos do Bake e permite mudar os arquivos de template usados por ele.
+Para criar seus próprios templates, veja [Criando um Tema Bake](/pt/development#criando-um-tema-bake).
diff --git a/docs/pt/usage.rst b/docs/pt/usage.rst
deleted file mode 100644
index f8cf8b4aa..000000000
--- a/docs/pt/usage.rst
+++ /dev/null
@@ -1,115 +0,0 @@
-Geração de Código com Bake
-##########################
-
-O console do **Bake** é executado usando o PHP CLI (interface da linha de comando).
-Se você tiver problemas para executar o script, assegure-se de que:
-
-#. Você instalou o PHP CLI e possui os módulos apropriados habilitados (por
- exemplo: MySQL, intl).
-#. Os usuários também podem ter problemas se o host do banco de dados for
- 'localhost' e devem tentar '127.0.0.1', em vez disso, como localhost pode
- causar problemas no PHP CLI.
-#. Dependendo de como o seu computador está configurado, você pode ter que
- definir direitos de execução no script cake bash para chamá-lo usando
- ``bin/cake bake``.
-
-Antes de executar o Bake você deve certificar-se de ter pelo menos um banco de dados com a conexão configurada.
-
-Para ver as opções disponíveis no Bake digite::
-
- $ bin/cake bake --help
-
- Current Paths:
-
- * app: src
- * root: .
- * core: .\vendor\cakephp\cakephp
-
- Available Commands:
-
- Bake:
- - bake all
- - bake behavior
- - bake cell
- - bake command
- - bake component
- - bake controller
- - bake controller all
- - bake fixture
- - bake fixture all
- - bake form
- - bake helper
- - bake mailer
- - bake middleware
- - bake model
- - bake model all
- - bake plugin
- - bake task
- - bake template
- - bake template all
- - bake test
-
- To run a command, type `cake command_name [args|options]`
- To get help on a specific command, type `cake command_name --help`
-
-
-Você pode obter mais informações sobre o que cada tarefa faz e quais são suas opções
-disponíveis usando a opção ``--help``::
-
- $ bin/cake bake model --help
-
- Bake table and entity classes.
-
- Usage:
- cake bake model [options] []
-
- Options:
-
- --connection, -c The datasource connection to get data from.
- (default: default)
- --display-field The displayField if you would like to choose one.
- --fields A comma separated list of fields to make
- accessible.
- --force, -f Force overwriting existing files without
- prompting.
- --help, -h Display this help.
- --hidden A comma separated list of fields to hide.
- --no-associations Disable generating associations.
- --no-entity Disable generating an entity class.
- --no-fields Disable generating accessible fields in the
- entity.
- --no-fixture Do not generate a test fixture skeleton.
- --no-hidden Disable generating hidden fields in the entity.
- --no-rules Disable generating a rules checker.
- --no-table Disable generating a table class.
- --no-test Do not generate a test case skeleton.
- --no-validation Disable generating validation rules.
- --plugin, -p Plugin to bake into.
- --primary-key The primary key if you would like to manually set
- one. Can be a comma separated list if you are
- using a composite primary key.
- --quiet, -q Enable quiet output.
- --table The table name to use if you have
- non-conventional table names.
- --theme, -t The theme to use when baking code.
- --verbose, -v Enable verbose output.
-
- Arguments:
-
- name Name of the model to bake (without the Table suffix). You can use
- Plugin.name to bake plugin models. (optional)
-
- Omitting all arguments and options will list the table names you can
- generate models for.
-
-
-
-Temas para o Bake
-=================
-
-A opção de tema é comum a todos os comandos do Bake e permite mudar os arquivos de modelo usados por ele. Para criar seus próprios modelos, veja a
-:ref:`documentação de criação de temas para o Bake `.
-
-.. meta::
- :title lang=pt: Geração de código com bake
- :keywords lang=pt: command line interface,functional application,database,database configuration,bash script,basic ingredients,project,model,path path,code generation,scaffolding,windows users,configuration file,few minutes,config,iew,shell,models,running,mysql
diff --git a/docs/public/favicon/apple-touch-icon.png b/docs/public/favicon/apple-touch-icon.png
new file mode 100644
index 000000000..c6d073d7b
Binary files /dev/null and b/docs/public/favicon/apple-touch-icon.png differ
diff --git a/docs/public/favicon/favicon-96x96.png b/docs/public/favicon/favicon-96x96.png
new file mode 100644
index 000000000..6642e0cda
Binary files /dev/null and b/docs/public/favicon/favicon-96x96.png differ
diff --git a/docs/public/favicon/favicon.ico b/docs/public/favicon/favicon.ico
new file mode 100644
index 000000000..405aa94ce
Binary files /dev/null and b/docs/public/favicon/favicon.ico differ
diff --git a/docs/public/favicon/favicon.svg b/docs/public/favicon/favicon.svg
new file mode 100644
index 000000000..805ef4b8f
--- /dev/null
+++ b/docs/public/favicon/favicon.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/docs/public/favicon/site.webmanifest b/docs/public/favicon/site.webmanifest
new file mode 100644
index 000000000..4f23fb31d
--- /dev/null
+++ b/docs/public/favicon/site.webmanifest
@@ -0,0 +1,21 @@
+{
+ "name": "CakePHP",
+ "short_name": "CakePHP",
+ "icons": [
+ {
+ "src": "/favicon/web-app-manifest-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable"
+ },
+ {
+ "src": "/favicon/web-app-manifest-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}
\ No newline at end of file
diff --git a/docs/public/favicon/web-app-manifest-192x192.png b/docs/public/favicon/web-app-manifest-192x192.png
new file mode 100644
index 000000000..b5df2990b
Binary files /dev/null and b/docs/public/favicon/web-app-manifest-192x192.png differ
diff --git a/docs/public/favicon/web-app-manifest-512x512.png b/docs/public/favicon/web-app-manifest-512x512.png
new file mode 100644
index 000000000..6a522de35
Binary files /dev/null and b/docs/public/favicon/web-app-manifest-512x512.png differ
diff --git a/docs/public/fonts/cakedingbats-webfont.eot b/docs/public/fonts/cakedingbats-webfont.eot
new file mode 100644
index 000000000..0800d1e7d
Binary files /dev/null and b/docs/public/fonts/cakedingbats-webfont.eot differ
diff --git a/docs/public/fonts/cakedingbats-webfont.svg b/docs/public/fonts/cakedingbats-webfont.svg
new file mode 100644
index 000000000..d2afda5e2
--- /dev/null
+++ b/docs/public/fonts/cakedingbats-webfont.svg
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/public/fonts/cakedingbats-webfont.ttf b/docs/public/fonts/cakedingbats-webfont.ttf
new file mode 100644
index 000000000..78ad6c884
Binary files /dev/null and b/docs/public/fonts/cakedingbats-webfont.ttf differ
diff --git a/docs/public/fonts/cakedingbats-webfont.woff b/docs/public/fonts/cakedingbats-webfont.woff
new file mode 100644
index 000000000..a95e1b38b
Binary files /dev/null and b/docs/public/fonts/cakedingbats-webfont.woff differ
diff --git a/docs/public/fonts/cakedingbats-webfont.woff2 b/docs/public/fonts/cakedingbats-webfont.woff2
new file mode 100644
index 000000000..2cd9fdd0e
Binary files /dev/null and b/docs/public/fonts/cakedingbats-webfont.woff2 differ
diff --git a/docs/public/history-panel-use.mp4 b/docs/public/history-panel-use.mp4
new file mode 100644
index 000000000..d87dc65ab
Binary files /dev/null and b/docs/public/history-panel-use.mp4 differ
diff --git a/docs/public/history-panel.png b/docs/public/history-panel.png
new file mode 100644
index 000000000..0c6b27e20
Binary files /dev/null and b/docs/public/history-panel.png differ
diff --git a/docs/public/icons/batteries_included_chiffon.svg b/docs/public/icons/batteries_included_chiffon.svg
new file mode 100644
index 000000000..1972a9673
--- /dev/null
+++ b/docs/public/icons/batteries_included_chiffon.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/public/icons/build_quickly_chiffon.svg b/docs/public/icons/build_quickly_chiffon.svg
new file mode 100644
index 000000000..d834c9c43
--- /dev/null
+++ b/docs/public/icons/build_quickly_chiffon.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/public/icons/license_chiffon.svg b/docs/public/icons/license_chiffon.svg
new file mode 100644
index 000000000..4f4d2f362
--- /dev/null
+++ b/docs/public/icons/license_chiffon.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/public/icons/mvc_chiffon.svg b/docs/public/icons/mvc_chiffon.svg
new file mode 100644
index 000000000..78b621f04
--- /dev/null
+++ b/docs/public/icons/mvc_chiffon.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/public/icons/no_config_chiffon.svg b/docs/public/icons/no_config_chiffon.svg
new file mode 100644
index 000000000..80b5c29ab
--- /dev/null
+++ b/docs/public/icons/no_config_chiffon.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/public/icons/secure_chiffon.svg b/docs/public/icons/secure_chiffon.svg
new file mode 100644
index 000000000..b85f60407
--- /dev/null
+++ b/docs/public/icons/secure_chiffon.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/public/logo.svg b/docs/public/logo.svg
new file mode 100644
index 000000000..829c8e98d
--- /dev/null
+++ b/docs/public/logo.svg
@@ -0,0 +1,27 @@
+
+
+
+
diff --git a/docs/public/mail-panel.mp4 b/docs/public/mail-panel.mp4
new file mode 100644
index 000000000..02078c858
Binary files /dev/null and b/docs/public/mail-panel.mp4 differ
diff --git a/docs/public/mail-previewer.mp4 b/docs/public/mail-previewer.mp4
new file mode 100644
index 000000000..66f9fdb97
Binary files /dev/null and b/docs/public/mail-previewer.mp4 differ
diff --git a/docs/ru/conf.py b/docs/ru/conf.py
deleted file mode 100644
index f8a170ee5..000000000
--- a/docs/ru/conf.py
+++ /dev/null
@@ -1,9 +0,0 @@
-import sys, os
-
-# Append the top level directory of the docs, so we can import from the config dir.
-sys.path.insert(0, os.path.abspath('..'))
-
-# Pull in all the configuration options defined in the global config file..
-from config.all import *
-
-language = 'ru'
diff --git a/docs/ru/contents.rst b/docs/ru/contents.rst
deleted file mode 100644
index 08c3e957c..000000000
--- a/docs/ru/contents.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-.. toctree::
- :maxdepth: 2
- :caption: CakePHP Bake
-
- /index
- /usage
- /development
diff --git a/docs/ru/development.md b/docs/ru/development.md
new file mode 100644
index 000000000..47dda1b25
--- /dev/null
+++ b/docs/ru/development.md
@@ -0,0 +1,263 @@
+# Расширение возможностей Bake
+
+Bake имеет расширяемую архитектуру, которая позволяет вашему приложению или плагинам изменять или дополнять базовую функциональность.
+Bake использует специальный класс представления и механизм шаблонизатора [Twig](https://twig.symfony.com/).
+
+## События Bake
+
+`BakeView`, как и любой другой класс представления, генерирует стандартные события, а также дополнительное событие инициализации.
+Стандартные классы представления используют префикс `View.`, а `BakeView` использует префикс `Bake.`.
+
+Событие `initialize` можно использовать для внесения изменений, которые применяются ко всему выводу Bake.
+Например, чтобы добавить helper в класс представления Bake:
+
+```php
+on('Bake.initialize', function (Event $event) {
+ $view = $event->getSubject();
+
+ // В моих шаблонах bake разрешить использование MySpecial helper
+ $view->loadHelper('MySpecial', ['some' => 'config']);
+
+ // И добавить переменную $author, чтобы она всегда была доступна
+ $view->set('author', 'Andy');
+});
+```
+
+Если вы хотите изменить Bake из другого плагина, удобнее всего разместить события плагина в `config/bootstrap.php`.
+
+События Bake полезны и для небольших изменений существующих шаблонов.
+Например, чтобы изменить имена переменных, используемых при генерации controller и template файлов, можно слушать `Bake.beforeRender`:
+
+```php
+on('Bake.beforeRender', function (Event $event) {
+ $view = $event->getSubject();
+
+ // Использовать $rows для основной переменной данных в index
+ if ($view->get('pluralName')) {
+ $view->set('pluralName', 'rows');
+ }
+ if ($view->get('pluralVar')) {
+ $view->set('pluralVar', 'rows');
+ }
+
+ // Использовать $theOne для основной переменной данных в view/edit
+ if ($view->get('singularName')) {
+ $view->set('singularName', 'theOne');
+ }
+ if ($view->get('singularVar')) {
+ $view->set('singularVar', 'theOne');
+ }
+});
+```
+
+Вы также можете привязать события `Bake.beforeRender` и `Bake.afterRender` к конкретному генерируемому файлу.
+Например, если вы хотите добавить действия в `UsersController` при генерации из `Controller/controller.twig`:
+
+```php
+on(
+ 'Bake.beforeRender.Controller.controller',
+ function (Event $event) {
+ $view = $event->getSubject();
+ if ($view->viewVars['name'] == 'Users') {
+ // добавим действия входа и выхода в контроллер Users
+ $view->viewVars['actions'] = [
+ 'login',
+ 'logout',
+ 'index',
+ 'view',
+ 'add',
+ 'edit',
+ 'delete',
+ ];
+ }
+ }
+);
+```
+
+Фокусируя обработчики на конкретных шаблонах Bake, вы упрощаете связанную с Bake логику событий и получаете более удобные для тестирования callback-функции.
+
+## Синтаксис шаблонов Bake
+
+Файлы шаблонов Bake используют синтаксис [Twig](https://twig.symfony.com/doc/2.x/).
+
+Например, при генерации shell-команды:
+
+```bash
+bin/cake bake shell Foo
+```
+
+Шаблон `vendor/cakephp/bake/src/Template/Bake/Shell/shell.twig` выглядит так:
+
+```php
+` закрывающий PHP-тег шаблона Bake.
+- `<%=` короткий echo-тег шаблона Bake.
+- `<%-` открывающий тег с удалением пробелов перед тегом.
+- `-%>` закрывающий тег с удалением пробелов после тега.
+:::
+
+## Создание темы Bake
+
+Если вы хотите изменить вывод, создаваемый командой `bake`, вы можете создать собственную тему Bake, которая позволит заменить часть или все шаблоны.
+
+1. Сгенерируйте новый плагин. Имя плагина станет именем темы Bake.
+2. Создайте директорию `plugins/[name]/src/Template/Bake/Template/`.
+3. Скопируйте нужные шаблоны из `vendor/cakephp/bake/src/Template/Bake/Template` в соответствующие файлы вашего плагина.
+4. При запуске Bake используйте параметр `--theme`, чтобы указать тему. Чтобы не передавать его каждый раз, можно настроить тему по умолчанию:
+
+```php
+Test->classSuffixes[$this->name()])) {
+ $this->Test->classSuffixes[$this->name()] = 'Foo';
+ }
+
+ $name = ucfirst($this->name());
+ if (!isset($this->Test->classTypes[$name])) {
+ $this->Test->classTypes[$name] = 'Foo';
+ }
+
+ return parent::bakeTest($className);
+}
+```
+
+- **Суффикс класса** добавляется к имени, переданному в вызове `bake`. В примере выше это создаст `ExampleFooTest.php`.
+- **Тип класса** определяет подпространство имён, ведущее к файлу относительно приложения или плагина. В примере выше это создаст тест с namespace `App\Test\TestCase\Foo`.
diff --git a/docs/ru/development.rst b/docs/ru/development.rst
deleted file mode 100644
index 568068dbf..000000000
--- a/docs/ru/development.rst
+++ /dev/null
@@ -1,288 +0,0 @@
-Расширение возможностей Bake
-############################
-
-Bake имеет расширяемую архитектуру, которая позволяет вашему приложению или плагинам
-измененять или добавления его базовую функциональность. Bake использует специальный
-класс, который использует механизм шаблонизатора `Twig `_.
-
-События Bake
-============
-
-В качестве класса представления ``BakeView`` генерирует те же события, что и любой другой класс представления,
-плюс одно дополнительное событие инициализации. Однако, в то время как классы стандартного представления используют
-префикс события "View.", ``BakeView`` использует префикс события "Bake.".
-
-Событие initialize можно использовать для внесения изменений, которые применяются ко всем 'испеченным'
-выводам, например, чтобы добавить другого помощника в класс вида bake, это событие может
-использовать следующее::
-
- on('Bake.initialize', function (Event $event) {
- $view = $event->getSubject();
-
- // В моих шаблонах bake, разрешить использование MySpecial helper
- $view->loadHelper('MySpecial', ['some' => 'config']);
-
- // И добавьте переменную $author, чтобы она всегда была доступна
- $view->set('author', 'Andy');
-
- });
-
-Если вы хотите изменить выпечку из другого плагина, хорошей идеей будет - поместить
-события своего плагина в файл ``config/bootstrap.php``.
-
-События Bake могут быть полезны для внесения небольших изменений в существующие шаблоны.
-Например, чтобы изменить имена переменных, используемых для выпечки файлов контроллеров/шаблонов,
-можно использовать прослушивающую функцию ``Bake.beforeRender``::
-
- on('Bake.beforeRender', function (Event $event) {
- $view = $event->getSubject();
-
- // Использовать $rows для основной переменной данных для индекса (index)
- if ($view->get('pluralName')) {
- $view->set('pluralName', 'rows');
- }
- if ($view->get('pluralVar')) {
- $view->set('pluralVar', 'rows');
- }
-
- // Используйте $theOne для основной переменной данных для просмотра/редактирования (view/edit)
- if ($view->get('singularName')) {
- $view->set('singularName', 'theOne');
- }
- if ($view->get('singularVar')) {
- $view->set('singularVar', 'theOne');
- }
-
- });
-
-Вы также можете использовать события ``Bake.beforeRender`` и ``Bake.afterRender`` для
-генерирования специфичного файла. Например, если вы хотите добавить определенные действия для
-вашего UserController при генерации из файла **Controller/controller.twig**,
-вы можете использовать следующее событие::
-
- on(
- 'Bake.beforeRender.Controller.controller',
- function (Event $event) {
- $view = $event->getSubject();
- if ($view->viewVars['name'] == 'Users') {
- // добавим действия входа и выхода из системы в контроллер пользователей
- $view->viewVars['actions'] = [
- 'login',
- 'logout',
- 'index',
- 'view',
- 'add',
- 'edit',
- 'delete'
- ];
- }
- }
- );
-
-При просмотре прослушивателей событий для конкретных шаблонов выпечки вы можете упростить
-выпечку связанной логики событий и обеспечить обратные вызовы, которые легче тестировать.
-
-Синтаксис шаблона выпечки
-=========================
-
-Файлы шаблонов Bake используют синтаксис шаблонизатора `Twig `__.
-
-Так, например, при выпечке такой оболочки:
-
-.. code-block:: bash
-
- bin/cake bake shell Foo
-
-Используемый шаблон (**vendor/cakephp/bake/src/Template/Bake/Shell/shell.twig**)
-будет выглядеть так::
-
- `` Bake шаблон закрывающего тега php
- * ``<%=`` Bake шаблон php короткого php тега echo
- * ``<%-`` Bake шаблон php открытия тега, удаляющего любые введённые пробелы перед тегом
- * ``-%>`` Bake шаблон php закрытия тега, любые введённые пробелы после тега
-
-.. _creating-a-bake-theme:
-
-Создание темы Bake
-==================
-
-Если вы хотите изменить результат, полученный командой "bake", вы можете
-создать свою собственную тему('theme') для "bake", которая позволит вам заменить некоторые или все
-шаблоны, которые испекает bake. Лучше всего сделать это так:
-
-#. Выпечь новый плагин. Имя плагина - это название темы 'bake'
-#. Создать новую диреткорию **plugins/[name]/src/Template/Bake/Template/**.
-#. Скопируйте любые шаблоны, которые вы хотите переопределить
- **vendor/cakephp/bake/src/Template/Bake/Template** для сопоставления файлов с вашим плагином.
-#. При запуске выпечки используйте параметр ``--theme``, чтобы указать тему выпечки которую вы
- хотите использовать. Чтобы избежать необходимости указывать этот параметр в каждом вызове, вы также можете
- настроить свою тему в качестве темы по умолчанию::
-
- Test->classSuffixes[$this->name()])) {
- $this->Test->classSuffixes[$this->name()] = 'Foo';
- }
-
- $name = ucfirst($this->name());
- if (!isset($this->Test->classTypes[$name])) {
- $this->Test->classTypes[$name] = 'Foo';
- }
-
- return parent::bakeTest($className);
- }
-
-* **Суффикс класса** будет добавлен к имени, указанному в вашем вызове ``bake``.
- В предыдущем примере он создал бы файл ``ExampleFooTest.php``.
-
-* **Тип файла** будет использовать пространство под-пространство имён(sub-namespace), которое приведёт к файлу (относительно приложения или подключаемого модуля). В предыдущем примере, он создаст ваш тест с пространством имен ``App\Test\TestCase\Foo``.
-
-.. meta::
- :title lang=ru: Расширение возможностей Bake
- :keywords lang=ru: интерфейс командной строки, разработка, выпечка, синтаксис шаблона выпечки, твинг, метки erb, процентные теги
diff --git a/docs/ru/index.md b/docs/ru/index.md
new file mode 100644
index 000000000..d330e7319
--- /dev/null
+++ b/docs/ru/index.md
@@ -0,0 +1,23 @@
+# Консоль Bake
+
+Консоль Bake для CakePHP помогает быстро начать разработку.
+Она может создать базовые компоненты CakePHP, включая models, behaviors, views,
+helpers, controllers, components, test cases, fixtures и plugins.
+Bake умеет создавать не только каркас приложения, но и полностью рабочую основу за считанные минуты.
+
+## Установка
+
+Перед тем как использовать Bake, убедитесь, что он установлен в вашем приложении.
+Bake распространяется как отдельный плагин, который можно установить через Composer:
+
+```bash
+composer require --dev cakephp/bake:~1.0
+```
+
+Команда выше установит Bake как зависимость для разработки.
+Это значит, что Bake не будет установлен при деплое на production.
+
+## Карта документации
+
+- [Генерация кода с помощью Bake](/ru/usage) описывает запуск CLI, список задач и темы Bake.
+- [Расширение возможностей Bake](/ru/development) описывает события, шаблоны, темы и добавление собственных команд.
diff --git a/docs/ru/index.rst b/docs/ru/index.rst
deleted file mode 100644
index 0b9c1bc80..000000000
--- a/docs/ru/index.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-Консоль Bake
-############
-
-Bake консоль CakePHP - это еще один инструмент для быстрой разработки на фреймворке CakePHP.
-Консоль Bake может создать любой из базовых компонентов или все сразу: models,
-behaviors, views, helpers, controllers, components, test cases, fixtures и plugins.
-Речь идет не только о каркасе приложения: Bake консоль создает полностью функционирующее приложение всего за пару минут.
-
-Bake это естественный шаг для статической генерации кода.
-
-Установка
-=========
-
-Перед тем, как использовать Bake, убедитесь, что он установлен в вашем приложении.
-Bake это отдельный плагин и вы можете установить его с помощью Composer::
-
- composer require --dev cakephp/bake:~1.0
-
-Команда выше установит Bake в зависимости от разработки.
-Это значит, что Bake не будет установлен, когда вы делаете деплой на продакшн сервер.
-
-.. meta::
- :title lang=ru: Консоль Bake
- :keywords lang=ru: интерфейс командной строки,разработка,bake view, bake template syntax,erb tags,asp tags,percent tags
diff --git a/docs/ru/usage.md b/docs/ru/usage.md
new file mode 100644
index 000000000..97207aefd
--- /dev/null
+++ b/docs/ru/usage.md
@@ -0,0 +1,117 @@
+# Генерация кода с помощью Bake
+
+Консоль Cake запускается с использованием PHP CLI.
+Если у вас возникли проблемы с запуском скрипта, убедитесь, что:
+
+1. У вас установлен PHP CLI и включены нужные модули, например MySQL и `intl`.
+2. Если хост базы данных указан как `localhost`, попробуйте `127.0.0.1`, потому что `localhost` может вызывать проблемы в PHP CLI.
+3. В зависимости от того, как настроен ваш компьютер, вам может потребоваться выдать права на выполнение скрипта, чтобы запускать `bin/cake bake`.
+
+Перед запуском Bake вы должны убедиться, что у вас настроено хотя бы одно соединение с базой данных.
+
+При запуске без аргументов `bin/cake bake` выводит список доступных задач.
+Вы должны увидеть что-то вроде:
+
+```bash
+$ bin/cake bake
+
+Welcome to CakePHP v3.4.6 Console
+---------------------------------------------------------------
+App : src
+Path: /var/www/cakephp.dev/src/
+PHP : 5.6.20
+---------------------------------------------------------------
+The following commands can be used to generate skeleton code for your application.
+
+Available bake commands:
+
+- all
+- behavior
+- cell
+- component
+- controller
+- fixture
+- form
+- helper
+- mailer
+- migration
+- migration_diff
+- migration_snapshot
+- model
+- plugin
+- seed
+- task
+- template
+- test
+
+By using `cake bake [name]` you can invoke a specific bake task.
+```
+
+Дополнительную информацию о задачах и доступных параметрах можно получить через `--help`:
+
+```bash
+$ bin/cake bake --help
+
+Welcome to CakePHP v3.4.6 Console
+---------------------------------------------------------------
+App : src
+Path: /var/www/cakephp.dev/src/
+PHP : 5.6.20
+---------------------------------------------------------------
+The Bake script generates controllers, models and template files for
+your application. If run with no command line arguments, Bake guides the
+user through the class creation process. You can customize the
+generation process by telling Bake where different parts of your
+application are using command line arguments.
+
+Usage:
+cake bake.bake [subcommand] [options]
+
+Subcommands:
+
+all Bake a complete MVC skeleton.
+behavior Bake a behavior class file.
+cell Bake a cell class file.
+component Bake a component class file.
+controller Bake a controller skeleton.
+fixture Generate fixtures for use with the test suite. You
+ can use `bake fixture all` to bake all fixtures.
+form Bake a form class file.
+helper Bake a helper class file.
+mailer Bake a mailer class file.
+migration Bake migration class.
+migration_diff Bake migration class.
+migration_snapshot Bake migration snapshot class.
+model Bake table and entity classes.
+plugin Create the directory structure, AppController class
+ and testing setup for a new plugin. Can create
+ plugins in any of your bootstrapped plugin paths.
+seed Bake seed class.
+task Bake a task class file.
+template Bake views for a controller, using built-in or
+ custom templates.
+test Bake test case skeletons for classes.
+
+To see help on a subcommand use `cake bake.bake [subcommand] --help`
+
+Options:
+
+--connection, -c Database connection to use in conjunction with `bake
+ all`. (default: default)
+--everything Bake a complete MVC skeleton, using all the available
+ tables. Usage: "bake all --everything"
+--force, -f Force overwriting existing files without prompting.
+--help, -h Display this help.
+--plugin, -p Plugin to bake into.
+--prefix Prefix to bake controllers and templates into.
+--quiet, -q Enable quiet output.
+--tablePrefix Table prefix to be used in models.
+--theme, -t The theme to use when baking code. (choices:
+ Bake|Migrations)
+--verbose, -v Enable verbose output.
+```
+
+## Темы Bake
+
+Параметр `theme` является общим для всех команд Bake и позволяет изменять файлы шаблонов, используемые при генерации.
+Чтобы создать свои шаблоны, см. [Создание темы Bake](/ru/development#создание-темы-bake).
diff --git a/docs/ru/usage.rst b/docs/ru/usage.rst
deleted file mode 100644
index 128936141..000000000
--- a/docs/ru/usage.rst
+++ /dev/null
@@ -1,127 +0,0 @@
-Генерация кода с помощью Bake
-#############################
-
-Консоль cake запускается с использованием PHP CLI (интерфейса командной строки).
-Если у вас возникли проблемы с запуском скрипта, убедитесь, что:
-
-#. У вас установлен PHP CLI и что у него есть соответствующие включённые модули
- (например: MySQL, intl).
-#. У пользователей также могут быть проблемы, если хост базы данных является
- 'localhost' вмеcто этого можно попробовать '127.0.0.1', поскольку localhost
- может вызвать проблемы с PHP CLI.
-#. В зависимости от того, как настроен ваш компьютер, вам может потребоваться
- установить права выполнения на скрипт bash, чтобы вызвать его, используя
- ``bin/cake bake``.
-
-Перед запуском bake вы должны убедиться, что у вас есть хотя бы одна база данных и
-соединение настроено.
-
-При запуске без аргументов ``bin/cake bake`` выводит список доступных
-заданий. Вы должны увидеть что-то вроде::
-
- $ bin/cake bake
-
- Welcome to CakePHP v3.4.6 Console
- ---------------------------------------------------------------
- App : src
- Path: /var/www/cakephp.dev/src/
- PHP : 5.6.20
- ---------------------------------------------------------------
- The following commands can be used to generate skeleton code for your application.
-
- Available bake commands:
-
- - all
- - behavior
- - cell
- - component
- - controller
- - fixture
- - form
- - helper
- - mailer
- - migration
- - migration_diff
- - migration_snapshot
- - model
- - plugin
- - seed
- - task
- - template
- - test
-
- By using `cake bake [name]` you can invoke a specific bake task.
-
-Вы можете получить больше дополнительной информации о том, что делает каждая задача, и какие параметры
-доступны, если используете ключ ``--help``::
-
- $ bin/cake bake --help
-
- Welcome to CakePHP v3.4.6 Console
- ---------------------------------------------------------------
- App : src
- Path: /var/www/cakephp.dev/src/
- PHP : 5.6.20
- ---------------------------------------------------------------
- The Bake script generates controllers, models and template files for
- your application. If run with no command line arguments, Bake guides the
- user through the class creation process. You can customize the
- generation process by telling Bake where different parts of your
- application are using command line arguments.
-
- Usage:
- cake bake.bake [subcommand] [options]
-
- Subcommands:
-
- all Bake a complete MVC skeleton.
- behavior Bake a behavior class file.
- cell Bake a cell class file.
- component Bake a component class file.
- controller Bake a controller skeleton.
- fixture Generate fixtures for use with the test suite. You
- can use `bake fixture all` to bake all fixtures.
- form Bake a form class file.
- helper Bake a helper class file.
- mailer Bake a mailer class file.
- migration Bake migration class.
- migration_diff Bake migration class.
- migration_snapshot Bake migration snapshot class.
- model Bake table and entity classes.
- plugin Create the directory structure, AppController class
- and testing setup for a new plugin. Can create
- plugins in any of your bootstrapped plugin paths.
- seed Bake seed class.
- task Bake a task class file.
- template Bake views for a controller, using built-in or
- custom templates.
- test Bake test case skeletons for classes.
-
- To see help on a subcommand use `cake bake.bake [subcommand] --help`
-
- Options:
-
- --connection, -c Database connection to use in conjunction with `bake
- all`. (default: default)
- --everything Bake a complete MVC skeleton, using all the available
- tables. Usage: "bake all --everything"
- --force, -f Force overwriting existing files without prompting.
- --help, -h Display this help.
- --plugin, -p Plugin to bake into.
- --prefix Prefix to bake controllers and templates into.
- --quiet, -q Enable quiet output.
- --tablePrefix Table prefix to be used in models.
- --theme, -t The theme to use when baking code. (choices:
- Bake|Migrations)
- --verbose, -v Enable verbose output.
-
-Темы Bake
-=========
-
-Параметр темы является общим для всех команд bake, так же bake позволяет изменять
-файлы шаблонов, используемые при 'выпечке'. Чтобы создать свои собственные шаблоны см.
-:ref:`документация по созданию темы`.
-
-.. meta::
- :title lang=ru: Генерация кода с помощью Bake
- :keywords lang=en: command line interface,functional application,database,database configuration,bash script,basic ingredients,project,model,path path,code generation,scaffolding,windows users,configuration file,few minutes,config,view,models,running,mysql