├── .github └── workflows │ └── deploy.yml ├── .gitignore ├── LICENSE.md ├── README.md ├── composer.json ├── docs ├── .vitepress │ └── config.mts ├── contribute │ ├── contribution.md │ └── report-bugs.md ├── controllers │ ├── assign-custom-alias.md │ ├── share-specific-vars.md │ ├── share-with-js.md │ └── view-return.md ├── getting-started │ ├── changelog.md │ ├── installation.md │ └── versions.md ├── home.md ├── index.md ├── javascript-methods │ ├── assign.md │ ├── destroy.md │ ├── except.md │ ├── get.md │ ├── has.md │ ├── only.md │ └── set.md └── public │ ├── css │ └── style.css │ └── img │ ├── laravel-red.svg │ ├── laravel_black.svg │ ├── logo-full-scream.png │ ├── logo-github.png │ └── php2js.png ├── package-lock.json ├── package.json ├── phpstan.neon ├── src ├── Bases │ ├── BaseGenerator.php │ └── BaseRender.php ├── Elements │ └── Generator.php ├── Macros │ └── Php2JsServiceProvider.php ├── Render.php ├── Stubs │ └── PHP2JS.stub └── Traits │ └── Alias.php └── test └── PHP2JSTest.php /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy VitePress site to Pages 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | 7 | # Allows you to run this workflow manually from the Actions tab 8 | workflow_dispatch: 9 | 10 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 11 | permissions: 12 | contents: read 13 | pages: write 14 | id-token: write 15 | 16 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 17 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 18 | concurrency: 19 | group: pages 20 | cancel-in-progress: false 21 | 22 | jobs: 23 | # Build job 24 | build: 25 | runs-on: ubuntu-latest 26 | steps: 27 | - name: Checkout 28 | uses: actions/checkout@v3 29 | with: 30 | fetch-depth: 0 # Not needed if lastUpdated is not enabled 31 | # - uses: pnpm/action-setup@v2 # Uncomment this if you're using pnpm 32 | # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun 33 | - name: Setup Node 34 | uses: actions/setup-node@v3 35 | with: 36 | node-version: 18 37 | cache: npm # or pnpm / yarn 38 | - name: Setup Pages 39 | uses: actions/configure-pages@v3 40 | - name: Install dependencies 41 | run: npm ci # or pnpm install / yarn install / bun install 42 | - name: Build with VitePress 43 | run: | 44 | npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build 45 | touch docs/.vitepress/dist/.nojekyll 46 | - name: Upload artifact 47 | uses: actions/upload-pages-artifact@v2 48 | with: 49 | path: docs/.vitepress/dist 50 | 51 | # Deployment job 52 | deploy: 53 | environment: 54 | name: github-pages 55 | url: ${{ steps.deployment.outputs.page_url }} 56 | needs: build 57 | runs-on: ubuntu-latest 58 | name: Deploy 59 | steps: 60 | - name: Deploy to GitHub Pages 61 | id: deployment 62 | uses: actions/deploy-pages@v2 63 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore common macOS files and directories 2 | **/.DS_Store 3 | 4 | # Ignore automatically generated files and directories 5 | /vendor/ 6 | /.fleet 7 | /.idea 8 | /.vscode 9 | 10 | # Ignore Composer generated directory and files 11 | /vendor 12 | 13 | # Ignore development tool generated files and directories 14 | .fleet 15 | .idea 16 | .vscode 17 | composer.lock 18 | 19 | # Node 20 | node_modules 21 | docs/.vitepress/cache 22 | docs/.vitepress/dist 23 | docs/.vitepress/.temp 24 | 25 | # JS 26 | src/JS/* -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Raúl Mauricio Uñate Castro 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PHP2JS 2 | 3 | ## 🚀 Seamless Integration: PHP2JS 🚀 4 | 5 | Share PHP Laravel values effortlessly with external JavaScript files using just one command, thanks to the seamless integration of PHP2JS. 6 | 7 | Developing Laravel monoliths has never been easier and more efficient! 💻✨ 8 | 9 | ## The Library that Made Handling Monoliths in Laravel Simple - LARAVEL PHP Framework 10 | 11 | ![LOGO-PHP2JS](https://github.com/rmunate/PHP2JS/assets/91748598/53afbd9c-0ffc-414c-aa14-b53663f5621e) 12 | 13 | ## Documentation 14 | [![📖📖📖 **FULL DOCUMENTATION** 📖📖📖](https://img.shields.io/badge/FULL%20DOCUMENTATION-Visit%20Here-blue?style=for-the-badge)](https://rmunate.github.io/PHP2JS/) 15 | 16 | ## Installation PHP2JS 17 | To install the dependency via Composer. 18 | 19 | ```shell 20 | composer require rmunate/php2js 21 | ``` 22 | 23 | ## License 24 | This project is under the [MIT License](https://choosealicense.com/licenses/mit/). 25 | 26 | 🌟 Support My Projects! 🚀 27 | 28 | [![Become a Sponsor](https://img.shields.io/badge/-Become%20a%20Sponsor-blue?style=for-the-badge&logo=github)](https://github.com/sponsors/rmunate) 29 | 30 | Make any contributions you see fit; the code is entirely yours. Together, we can do amazing things and improve the world of development. Your support is invaluable. ✨ 31 | 32 | If you have ideas, suggestions, or just want to collaborate, we are open to everything! Join our community and be part of our journey to success! 🌐👩‍💻👨‍💻 33 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rmunate/php2js", 3 | "description": "Effortlessly share PHP Laravel values with external JavaScript files using just one command, thanks to the seamless integration of PHP2JS.", 4 | "keywords": [ 5 | "PHP2JS", 6 | "php2js", 7 | "toJS", 8 | "toStrictJS" 9 | ], 10 | "homepage": "https://github.com/rmunate/PHP2JS", 11 | "type": "library", 12 | "license": "MIT", 13 | "autoload": { 14 | "psr-4": { 15 | "Rmunate\\Php2Js\\": "src/" 16 | } 17 | }, 18 | "authors": [ 19 | { 20 | "name": "Raul Mauricio Uñate Castro", 21 | "email": "raulmauriciounate@gmail.com", 22 | "role": "owner", 23 | "homepage": "https://github.com/rmunate" 24 | } 25 | ], 26 | "require": { 27 | "php": "^8.1", 28 | "illuminate/support": "^10.0|^11.0" 29 | }, 30 | "require-dev": { 31 | "phpstan/phpstan": "^1.10", 32 | "phpunit/phpunit": "^10.4|^11.0" 33 | }, 34 | "extra": { 35 | "branch-alias": { 36 | "dev-main": "v3.0.x-dev" 37 | }, 38 | "laravel": { 39 | "providers": [ 40 | "Rmunate\\Php2Js\\Macros\\Php2JsServiceProvider" 41 | ] 42 | } 43 | }, 44 | "minimum-stability": "dev", 45 | "prefer-stable": true 46 | } 47 | -------------------------------------------------------------------------------- /docs/.vitepress/config.mts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitepress' 2 | 3 | export default defineConfig({ 4 | title: "PHP2JS", 5 | description: "Developing Laravel monoliths has never been easier and more efficient! 💻✨", 6 | lang: 'en-US', 7 | lastUpdated: true, 8 | base: '/PHP2JS', 9 | themeConfig: { 10 | footer: { 11 | message: 'Released under the MIT License.', 12 | copyright: 'Copyright © 2021-2023 Raul Mauricio Uñate' 13 | }, 14 | editLink: { 15 | pattern: 'https://github.com/rmunate/PHP2JS/tree/main/docs/:path' 16 | }, 17 | logo: '/img/php2js.png', 18 | nav: [ 19 | { 20 | text: 'Docs ^4.4', 21 | link: '/', 22 | } 23 | ], 24 | sidebar: [ 25 | { 26 | text: 'Getting Started', 27 | collapsed: false, 28 | items: [ 29 | {text: 'Introduction', link: '/home'}, 30 | {text: 'Installation', link: '/getting-started/installation'}, 31 | {text: 'Versions', link: '/getting-started/versions'}, 32 | {text: 'Release Notes', link: '/getting-started/changelog'}, 33 | ] 34 | }, { 35 | text: 'Use In Controllers', 36 | collapsed: true, 37 | items: [ 38 | {text: 'View Return', link: '/controllers/view-return'}, 39 | {text: 'Share with JavaScript', link: '/controllers/share-with-js'}, 40 | {text: 'Share Specific Variables', link: '/controllers/share-specific-vars'}, 41 | {text: 'Assign a Custom Alias', link: '/controllers/assign-custom-alias'}, 42 | ] 43 | }, { 44 | text: 'Use In JavaScript', 45 | collapsed: true, 46 | items: [ 47 | {text: 'Assign', link: '/javascript-methods/assign'}, 48 | {text: 'Destroy', link: '/javascript-methods/destroy'}, 49 | {text: 'Only', link: '/javascript-methods/only'}, 50 | {text: 'Except', link: '/javascript-methods/except'}, 51 | {text: 'Has', link: '/javascript-methods/has'}, 52 | {text: 'Get', link: '/javascript-methods/get'}, 53 | {text: 'Set', link: '/javascript-methods/set'}, 54 | ] 55 | },{ 56 | text: 'Contribute', 57 | collapsed: true, 58 | items: [ 59 | {text: 'Bug Report', link: '/contribute/report-bugs'}, 60 | {text: 'Contribution', link: '/contribute/contribution'} 61 | ] 62 | } 63 | ], 64 | socialLinks: [ 65 | {icon: 'github', link: 'https://github.com/rmunate/PHP2JS'} 66 | ], 67 | search: { 68 | provider: 'local' 69 | } 70 | }, 71 | head: [ 72 | ['link', { 73 | rel: 'stylesheet', 74 | href: '/PHP2JS/css/style.css' 75 | } 76 | ], 77 | ['link', { 78 | rel: 'icon', 79 | href: '/PHP2JS/img/php2js.png', 80 | type: 'image/png' 81 | } 82 | ], 83 | ['meta', { 84 | property: 'og:image', 85 | content: '/PHP2JS/img/logo-github.png' 86 | } 87 | ], 88 | ['meta', { 89 | property: 'og:image:secure_url', 90 | content: '/PHP2JS/img/logo-github.png' 91 | } 92 | ], 93 | ['meta', { 94 | property: 'og:image:width', 95 | content: '600' 96 | } 97 | ], 98 | ['meta', { 99 | property: 'og:image:height', 100 | content: '400' 101 | } 102 | ], 103 | ['meta', { 104 | property: 'og:title', 105 | content: 'PHP2JS' 106 | } 107 | ], 108 | ['meta', { 109 | property: 'og:description', 110 | content: 'Developing Laravel monoliths has never been easier and more efficient! 💻✨' 111 | } 112 | ], 113 | ['meta', { 114 | property: 'og:url', 115 | content: 'https://rmunate.github.io/PHP2JS/' 116 | } 117 | ], 118 | ['meta', { 119 | property: 'og:type', 120 | content: 'website' 121 | } 122 | ] 123 | ], 124 | 125 | }) -------------------------------------------------------------------------------- /docs/contribute/contribution.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Contributing 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | 56 | 57 | # Contributing 58 | 59 | ## How to Contribute to this Solution? 60 | 61 | If you see ways in which we can improve, change how we handle information, adjust pre-built blocks, or add new features, or even develop them yourself and add them. 62 | 63 | We are eager to receive your pull requests! 64 | 65 | Simply fork the repository on GitHub and create pull requests (PRs) to the main branch once you have prepared your changes. 66 | 67 | It is essential to provide a clear justification for the changes or new features, accompanied by a usage manual. 68 | 69 | ::: tip TEST 70 | Remember to test your code before submitting pull requests. 71 | ::: 72 | 73 | ## Developers and Contributors 74 | 75 | 76 | 77 | ## License 78 | This project is under the [MIT License](https://choosealicense.com/licenses/mit/). 79 | 80 | 🌟 Support My Projects! 🚀 81 | 82 | [![Become a Sponsor](https://img.shields.io/badge/-Become%20a%20Sponsor-blue?style=for-the-badge&logo=github)](https://github.com/sponsors/rmunate) 83 | 84 | Make any contributions you see fit; the code is entirely yours. Together, we can do amazing things and improve the world of development. Your support is invaluable. ✨ 85 | 86 | If you have ideas, suggestions, or just want to collaborate, we are open to everything! Join our community and be part of our journey to success! 🌐👩‍💻👨‍💻 -------------------------------------------------------------------------------- /docs/contribute/report-bugs.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bug Report 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # Bug Report 8 | 9 | If you find errors or opportunities within the package, you can create an incident that we will attend to in the shortest time possible. 10 | 11 | Here!: 12 | [https://github.com/rmunate/PHP2JS/issues/new](https://github.com/rmunate/PHP2JS/issues/new) 13 | 14 | Remember that you can also contribute as a collaborator of this solution. 15 | -------------------------------------------------------------------------------- /docs/controllers/assign-custom-alias.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Customize JavaScript Alias 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # Customize JavaScript Alias 8 | 9 | By default, the package provides access to backend variables in the JavaScript context through the constant `PHP2JS`. However, you can customize this alias to better suit your needs or align with its purpose. For instance: 10 | 11 | - __PHP 12 | - __Laravel 13 | - __Back 14 | - __MyAlias 15 | 16 | ## Assigning a Custom Alias 17 | 18 | ### Method `->toJS()` 19 | 20 | Simply specify the desired constant name as an argument of the `->toJS()` method. Keep in mind that this name becomes reserved and cannot be redeclared in your JavaScript files. 21 | 22 | ```php 23 | class YourController extends Controller 24 | { 25 | public function index() 26 | { 27 | $event = "Apollo 11 Moon Landing"; 28 | 29 | return view('welcome')->with([ 30 | 'event' => $event 31 | ])->toJS("__PHP"); 32 | } 33 | } 34 | ``` 35 | 36 | Now access the values using this constant in JavaScript: 37 | 38 | ```javascript 39 | let event = __PHP.data.event; 40 | // 'Apollo 11 Moon Landing' 41 | ``` 42 | 43 | ### Method `->toStrictJS()` 44 | 45 | ```php 46 | class YourController extends Controller 47 | { 48 | public function index() 49 | { 50 | $spacecraft = "Lunar Module Eagle"; 51 | $event = "Apollo 11 Moon Landing"; 52 | 53 | return view('welcome')->with([ 54 | 'spacecraft' => $spacecraft 55 | ])->toStrictJS([ 56 | 'event' => $event 57 | ], "__PHP"); 58 | } 59 | } 60 | ``` 61 | 62 | Now in JavaScript: 63 | 64 | ```javascript 65 | let event = __PHP.data.event; 66 | // 'Apollo 11 Moon Landing' 67 | ``` 68 | 69 | Customizing the JavaScript alias provides flexibility, allowing you to integrate the package seamlessly with your Laravel application while aligning with your coding preferences. -------------------------------------------------------------------------------- /docs/controllers/share-specific-vars.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Share Specific Values with JavaScript 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | 8 | # Share Specific Values with JavaScript 9 | 10 | If you need to share only particular values returned to the view with JavaScript, rather than all variables, the `->toStrictJS()` method provides a more targeted approach. This method functions similarly to Laravel Framework's `->with()` method. 11 | 12 | Let's explore an example where distinct values are shared with both the view and JavaScript. 13 | 14 | ```php 15 | class YourController extends Controller 16 | { 17 | public function index() 18 | { 19 | $astronauts = [ 20 | 'Neil Armstrong', 21 | 'Buzz Aldrin', 22 | 'Michael Collins' 23 | ]; 24 | 25 | $spacecraft = "Lunar Module Eagle"; 26 | $event = "Apollo 11 Moon Landing"; 27 | 28 | return view('welcome')->with([ 29 | 'astronauts' => $astronauts 30 | ])->toStrictJS([ 31 | 'spacecraft' => $spacecraft, 32 | 'event' => $event, 33 | ]); 34 | } 35 | } 36 | ``` 37 | 38 | In this example, only the values of `spacecraft` and `event` are shared with JavaScript. 39 | 40 | ```javascript 41 | let spacecraft = PHP2JS.data.spacecraft; 42 | // 'Lunar Module Eagle' 43 | 44 | let event = PHP2JS.data.event; 45 | // 'Apollo 11 Moon Landing' 46 | ``` 47 | 48 | This method provides a more granular control over the information shared with JavaScript, ensuring a streamlined integration of specific values between your Laravel application and the client-side scripts. -------------------------------------------------------------------------------- /docs/controllers/share-with-js.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Sharing Values with JavaScript 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # Sharing Values with JavaScript 8 | 9 | After grasping the concepts explained on the previous page, we will delve into the utilization of any of the four options mentioned earlier to share the variables returned to the view with JavaScript. 10 | 11 | Upon installing this package, you gain access to the `->toJS()` method. This method facilitates the direct sharing of all variables passed to the view with scripts written in both the same Blade view file and external JavaScript files added using the syntax: 12 | 13 | ```html 14 | 15 | ``` 16 | 17 | Consider the following example: 18 | 19 | ```php 20 | class YourController extends Controller 21 | { 22 | public function index() 23 | { 24 | return view('welcome')->with([ 25 | 'moonLandingDate' => '1969-07-20' 26 | ])->toJS(); 27 | } 28 | } 29 | ``` 30 | 31 | Remember, you can utilize any of the four methods for passing variables to the view as explained on the previous page. 32 | 33 | The provided code enables you to promptly access the variables returned from the controller in your JavaScript scripts through a constant named `PHP2JS`. 34 | 35 | ```javascript 36 | let moonLandingDate = PHP2JS.data.moonLandingDate; 37 | // '1969-07-20' 38 | ``` 39 | 40 | :::info Important! 41 | Values will be shared with scripts written within `` tags or imported via `` within the `` of the HTML. 42 | ::: -------------------------------------------------------------------------------- /docs/controllers/view-return.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Return View 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # Return View 8 | 9 | The following code demonstrates how to return a view conventionally without sharing data with JS, in a native manner as outlined by the framework. It is crucial to understand the various ways a view can be returned with data, as we rely on this to explain how values are shared with JavaScript. 10 | 11 | ## Compact Shape 1 12 | Using the `view` method with `compact` 13 | 14 | ```php 15 | class YourController extends Controller 16 | { 17 | public function index() 18 | { 19 | $library = 'PHP2JS'; 20 | return view('welcome', compact('library')); 21 | } 22 | } 23 | ``` 24 | 25 | ## Compact Shape 2 26 | Using only the `view` method without `compact` 27 | 28 | ```php 29 | class YourController extends Controller 30 | { 31 | public function index() 32 | { 33 | $library = 'PHP2JS'; 34 | return view('welcome', [ 35 | 'library' => $library 36 | ]); 37 | } 38 | } 39 | ``` 40 | 41 | ## Fluid Methods 1 42 | Using the `view` method, the "with" method, and `compact` 43 | 44 | ```php 45 | class YourController extends Controller 46 | { 47 | public function index() 48 | { 49 | $library = 'PHP2JS'; 50 | return view('welcome')->with(compact('library')); 51 | } 52 | } 53 | ``` 54 | 55 | ## Fluid Methods 2 56 | Using the `view` method, the "with" method without `compact` 57 | 58 | ```php 59 | class YourController extends Controller 60 | { 61 | public function index() 62 | { 63 | $library = 'PHP2JS'; 64 | return view('welcome')->with([ 65 | 'library' => $library 66 | ]); 67 | } 68 | } 69 | ``` -------------------------------------------------------------------------------- /docs/getting-started/changelog.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Release Notes 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | ::: warning We strongly recommend migrating to the current version 8 | If you have applications using previous versions, we highly recommend migrating to the current version. Keep in mind that the current version does not support functionalities from earlier versions. Its source code has been completely rewritten. 9 | ::: 10 | 11 | # Release Notes 12 | 13 | ## [4.0.0] - 2023-11-10 14 | 15 | ### Changed 16 | 17 | - **Property `vars`**: In previous versions, it was used to access variables returned from PHP; now it has been replaced with `data`. For example: `PHP2JS.data.value` 18 | 19 | - **Object Passed to JavaScript**: In previous versions, it was possible to create more than one object from PHP in JavaScript, which does not guarantee a good Server-Side Rendering (SSR) practice. The current version ensures that values are passed to JavaScript only once, and this is the only object to be manipulated from this context. 20 | 21 | - **Compatibility**: The source code has been rewritten to be compatible with PHP 7.4 or higher and Laravel Framework versions 8.0 or higher. 22 | 23 | - **Source Code**: The source code of this package has been rewritten by more than 90%, so it does not have support for previous versions. Efforts were made to improve performance, security, and the coherence of each class. 24 | 25 | ### Removed 26 | 27 | - **Blade Directives**: Blade directives have been removed since, if not used with a different alias in each, they conflict with each other. Now, data sharing with JavaScript will only be handled from controllers. Suppressed Directives: 28 | 29 | > @PHP2JS_VARS() 30 | 31 | > @PHP2JS_VARS_STRICT(['variable1','variable2']) 32 | 33 | > @PHP2JS_AGENT() 34 | 35 | > @PHP2JS_URL() 36 | 37 | > @PHP2JS_CSRF() 38 | 39 | > @PHP2JS_FRAMEWORK() 40 | 41 | > @PHP2JS_PHP() 42 | 43 | > @PHP2JS_USER() 44 | 45 | - **Artisan Command**: Since rendering Blade directives is not required, the `php2js:clear` command has been removed. 46 | 47 | - **Method `attach`**: As the use of pre-built blocks is not a generality and may not always meet the specific needs of an application, the functionality to share values with JavaScript has been removed, leaving it to the developer's discretion. 48 | 49 | - **Unused JavaScript Methods**: All methods lacking real use of the resulting object when sharing data from PHP2JS with JavaScript have been removed. Suppressed Methods: 50 | 51 | > .clear() 52 | 53 | > .clearWithoutFunctions(); 54 | 55 | > .assignAndClear() 56 | 57 | > .assignAndClearWithoutFunctions() 58 | 59 | > .onlyFunctions() 60 | 61 | > .exceptFunctions() 62 | 63 | > .getAllProperties() 64 | 65 | > .getAllProperties() 66 | 67 | ## [4.3.0] - 2023-12-10 68 | 69 | - Adjusted PHPStan static code analysis configuration, refined source code for improved readability and consistency. 70 | 71 | ## [4.5.0] - 2024-05-20 72 | 73 | - Adjusted to be compatible with Laravel 11 -------------------------------------------------------------------------------- /docs/getting-started/installation.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Installation 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # Installation 8 | 9 | ## Requirements 10 | 11 | When you wish to use this solution, you must ensure the following: 12 | 13 | **PHP:** Version equal to or higher than 8.0 14 | 15 | **Laravel Framework:** Version equal to or higher than 10.0 16 | 17 | ## Installation 18 | 19 | This package is available via Composer. You can install the latest stable version of the package by running the following command in your Laravel Framework project: 20 | 21 | ``` bash 22 | composer require rmunate/php2js 23 | ``` 24 | 25 | Make sure that in the `composer.json`, you have the library in the latest version. `rmunate/php2js": "^4.4"` 26 | 27 | -------------------------------------------------------------------------------- /docs/getting-started/versions.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Versions 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # Versions 8 | 9 | During the development of this solution, multiple tool versions were released. It's crucial to note that previous versions are NOT compatible with the latest update. This documentation is tailored specifically for the usage of the current version. 10 | 11 | We highly recommend migrating from older versions to the latest release, as no support is provided for any previous versions. 12 | 13 | | Version | Release Date | End of Support Date | 14 | |--------------------------------------------------------|--------------|---------------------| 15 | | ^0.1   | 2021-10-21 | 2021-12-31 | 16 | | ^1.0   | 2021-11-13 | 2023-01-15 | 17 | | ^2.0   | 2022-10-05 | 2023-06-24 | 18 | | ^3.0   | 2023-06-01 | 2023-11-15 | 19 | | ^4.0   | 2023-11-16 | 2024-12-31 | 20 | -------------------------------------------------------------------------------- /docs/home.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Introduction 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | ![logo-spell-number](/img/logo-full-scream.png) 8 | 9 | ## Introduction 10 | 11 | While there are multiple frontend frameworks available today, we acknowledge that monoliths created with the Laravel Framework will continue to exist for a long time, and this is not necessarily a negative aspect. The most effective solution doesn't always lie in adopting the latest-generation framework. Sometimes, it is more efficient for a development team to leverage standard technologies and the knowledge they already possess. 12 | 13 | By using technologies like jQuery, Vanilla JavaScript, HTML, CSS, and Laravel's Blade view engine, remarkable and highly functional results can be achieved. However, we felt something was missing: a simple, elegant, and efficient way to share data from the server to JavaScript on the frontend. We were uncomfortable inserting JavaScript snippets into our views; we always aimed to separate this logic into independent files. 14 | 15 | It was then that server requests began to increase to retrieve variables that were already present in the view. After much contemplation on what would be the most effective solution, we decided to create this solution that standardizes and simplifies the process of sharing data from PHP to JavaScript. 16 | 17 | You might be wondering how it's possible to achieve this, as there are different approaches in each programming language. Let us tell you that we faced that challenge too, but now we have overcome it. 18 | 19 | Enjoy the ease of sharing data with JavaScript. -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: home 3 | 4 | hero: 5 | name: Laravel 6 | text: PHP2JS 7 | tagline: Developing Laravel monoliths has never been easier and more efficient! 💻✨ 8 | image: 9 | src: img/php2js.png 10 | alt: VitePress 11 | actions: 12 | - theme: brand 13 | text: Get Started 14 | link: /home 15 | - theme: alt 16 | text: View on GitHub 17 | link: https://github.com/rmunate/PHP2JS 18 | 19 | features: 20 | - icon: 🚀 21 | title: Share Variables with JavaScript 22 | details: Now, with just one method from your controller, you can easily share variables with external JavaScript files. It's easy, simple, elegant, and highly efficient. 23 | - icon: 🌐 24 | title: Only One Method 25 | details: With just one additional method in your controller, you can pass the variables you need to the JavaScript context. Forget about inserting scripts in your views; it's time to separate the logic in a more elegant, efficient, and secure way. 26 | - icon: 📢 27 | title: Reduced Server Load 28 | details: Recently, some solutions (FullStack Frameworks) have become popular for overloading servers with SSR processes. If you genuinely want a maintainable application over time, you might want to start here. 29 | --- -------------------------------------------------------------------------------- /docs/javascript-methods/assign.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Assign 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # `.assign()` 8 | 9 | ## Assign Same Object 10 | 11 | The `.assign()` method assigns the same values of the object delivered by PHP to a new variable or constant. Now you can remove the original object without losing the values you leave in the new one. This will be useful when you want the values not to be accessible from different references to the original object and instead use an object in JavaScript runtime. 12 | 13 | ```javascript 14 | // Assign a copy of the object to a new variable at runtime. 15 | // Remember to replace PHP2JS with the Alias you have used. 16 | const __PHP = PHP2JS.assign(); 17 | 18 | // You can now destroy the original object. 19 | PHP2JS.destroy(); 20 | 21 | // The values will now be in "__PHP" 22 | ``` 23 | 24 | ## Assign and Destroy 25 | 26 | The `.assignAndDestroy()` method assigns the same values of the object delivered by PHP to a new variable or constant and additionally clears the original object. This will be useful when you want the values not to be accessible from different references to the original object and instead use an object in JavaScript runtime. 27 | 28 | ```javascript 29 | // Destroy the Object (All references to the original object will lose their values) 30 | // Remember to replace PHP2JS with the Alias you have used. 31 | const __PHP = PHP2JS.assignAndDestroy(); 32 | 33 | // The values will now be in "__PHP" 34 | ``` 35 | -------------------------------------------------------------------------------- /docs/javascript-methods/destroy.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Destroy 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # `.destroy()` 8 | 9 | ## Destroy Object 10 | 11 | The `.destroy()` method will empty the object passed from PHP to JavaScript. This will be useful when you want the values not to be accessible from different object references. 12 | 13 | ```javascript 14 | // Destroy the Object (All object references will lose their values) 15 | // Remember to replace PHP2JS with the Alias you have used. 16 | PHP2JS.destroy(); 17 | ``` 18 | -------------------------------------------------------------------------------- /docs/javascript-methods/except.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Except 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # `.except(...props)` 8 | 9 | ## Except 10 | 11 | The `.except(...props)` method allows you to extract information from the object delivered by PHP, excluding the values you don't want to consider as parameters. This will be useful when you don't want to load the entire content of the constant. 12 | 13 | ```javascript 14 | // Retrieve only the data you require while excluding others. 15 | // Remember to replace PHP2JS with the Alias you have used. 16 | const withoutNews = PHP2JS.except('news'); 17 | ``` 18 | 19 | -------------------------------------------------------------------------------- /docs/javascript-methods/get.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Get 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # `.get('prop')` 8 | 9 | ## Get 10 | 11 | The `.get('prop')` method allows you to get a specific property from the object. It returns only the requested property. 12 | 13 | ```javascript 14 | // In this example, we will retrieve only the value of "date" 15 | // Remember to replace PHP2JS with the Alias you have used. 16 | PHP2JS.get("date"); 17 | ``` -------------------------------------------------------------------------------- /docs/javascript-methods/has.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Has 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # `.has('prop')` 8 | 9 | ## Has 10 | 11 | Validate If a Property Exists. 12 | 13 | The `.has('prop')` method allows you to check if a property exists within the object. The return value will be true or false depending on the case. 14 | 15 | ```javascript 16 | // Remember to replace PHP2JS with the Alias you have used. 17 | // const existPost = PHP2JS.hasProperty('post'); // true // false 18 | const existPost = PHP2JS.has('post'); // true // false 19 | ``` -------------------------------------------------------------------------------- /docs/javascript-methods/only.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Only 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # `.only(...props)` 8 | 9 | ## Only 10 | 11 | The `.only(...props)` method allows you to extract information from the object delivered by PHP, including only the values you need as parameters. This will be useful when you don't want to load the entire content of the constant. 12 | 13 | ```javascript 14 | // Retrieve only the data passed as arguments in the Only method 15 | // Remember to replace PHP2JS with the Alias you have used. 16 | const post = PHP2JS.only('post'); 17 | ``` 18 | 19 | -------------------------------------------------------------------------------- /docs/javascript-methods/set.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Set 3 | editLink: true 4 | outline: deep 5 | --- 6 | 7 | # `.set('prop','value')` 8 | 9 | ## Set 10 | 11 | Add a New Property. 12 | 13 | The `.set('prop','value')` method allows you to assign a new value to an existing property of the object. If you want to update, replace, or assign new values to a property of the object, you can do so easily. 14 | 15 | ```javascript 16 | // In this example, we will add the "count" property with a value of 10; 17 | // Remember to replace PHP2JS with the Alias you have used. 18 | PHP2JS.set("count", 10); 19 | ``` -------------------------------------------------------------------------------- /docs/public/css/style.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --vp-home-hero-name-color: #787bb3; 3 | --vp-button-brand-border: #fcdd00; 4 | --vp-button-brand-bg: #f0dc50; 5 | --vp-button-brand-text: black; 6 | --vp-button-brand-hover-bg: #787bb3; 7 | --vp-c-brand-1: #787bb3; 8 | } 9 | 10 | .tagline{ 11 | font-size: 22px !important; 12 | } -------------------------------------------------------------------------------- /docs/public/img/laravel-red.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/public/img/laravel_black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /docs/public/img/logo-full-scream.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rmunate/PHP2JS/d7d62b73202d2ca52ec51564ae95991b5670ae2f/docs/public/img/logo-full-scream.png -------------------------------------------------------------------------------- /docs/public/img/logo-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rmunate/PHP2JS/d7d62b73202d2ca52ec51564ae95991b5670ae2f/docs/public/img/logo-github.png -------------------------------------------------------------------------------- /docs/public/img/php2js.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rmunate/PHP2JS/d7d62b73202d2ca52ec51564ae95991b5670ae2f/docs/public/img/php2js.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "🗃️ PHP2JS", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "devDependencies": { 8 | "vitepress": "^1.2.0" 9 | } 10 | }, 11 | "node_modules/@algolia/autocomplete-core": { 12 | "version": "1.9.3", 13 | "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", 14 | "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", 15 | "dev": true, 16 | "dependencies": { 17 | "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", 18 | "@algolia/autocomplete-shared": "1.9.3" 19 | } 20 | }, 21 | "node_modules/@algolia/autocomplete-plugin-algolia-insights": { 22 | "version": "1.9.3", 23 | "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", 24 | "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", 25 | "dev": true, 26 | "dependencies": { 27 | "@algolia/autocomplete-shared": "1.9.3" 28 | }, 29 | "peerDependencies": { 30 | "search-insights": ">= 1 < 3" 31 | } 32 | }, 33 | "node_modules/@algolia/autocomplete-preset-algolia": { 34 | "version": "1.9.3", 35 | "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", 36 | "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", 37 | "dev": true, 38 | "dependencies": { 39 | "@algolia/autocomplete-shared": "1.9.3" 40 | }, 41 | "peerDependencies": { 42 | "@algolia/client-search": ">= 4.9.1 < 6", 43 | "algoliasearch": ">= 4.9.1 < 6" 44 | } 45 | }, 46 | "node_modules/@algolia/autocomplete-shared": { 47 | "version": "1.9.3", 48 | "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", 49 | "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", 50 | "dev": true, 51 | "peerDependencies": { 52 | "@algolia/client-search": ">= 4.9.1 < 6", 53 | "algoliasearch": ">= 4.9.1 < 6" 54 | } 55 | }, 56 | "node_modules/@algolia/cache-browser-local-storage": { 57 | "version": "4.23.3", 58 | "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.3.tgz", 59 | "integrity": "sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==", 60 | "dev": true, 61 | "dependencies": { 62 | "@algolia/cache-common": "4.23.3" 63 | } 64 | }, 65 | "node_modules/@algolia/cache-common": { 66 | "version": "4.23.3", 67 | "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.3.tgz", 68 | "integrity": "sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==", 69 | "dev": true 70 | }, 71 | "node_modules/@algolia/cache-in-memory": { 72 | "version": "4.23.3", 73 | "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.3.tgz", 74 | "integrity": "sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==", 75 | "dev": true, 76 | "dependencies": { 77 | "@algolia/cache-common": "4.23.3" 78 | } 79 | }, 80 | "node_modules/@algolia/client-account": { 81 | "version": "4.23.3", 82 | "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.3.tgz", 83 | "integrity": "sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==", 84 | "dev": true, 85 | "dependencies": { 86 | "@algolia/client-common": "4.23.3", 87 | "@algolia/client-search": "4.23.3", 88 | "@algolia/transporter": "4.23.3" 89 | } 90 | }, 91 | "node_modules/@algolia/client-analytics": { 92 | "version": "4.23.3", 93 | "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.3.tgz", 94 | "integrity": "sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==", 95 | "dev": true, 96 | "dependencies": { 97 | "@algolia/client-common": "4.23.3", 98 | "@algolia/client-search": "4.23.3", 99 | "@algolia/requester-common": "4.23.3", 100 | "@algolia/transporter": "4.23.3" 101 | } 102 | }, 103 | "node_modules/@algolia/client-common": { 104 | "version": "4.23.3", 105 | "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.3.tgz", 106 | "integrity": "sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==", 107 | "dev": true, 108 | "dependencies": { 109 | "@algolia/requester-common": "4.23.3", 110 | "@algolia/transporter": "4.23.3" 111 | } 112 | }, 113 | "node_modules/@algolia/client-personalization": { 114 | "version": "4.23.3", 115 | "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.3.tgz", 116 | "integrity": "sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==", 117 | "dev": true, 118 | "dependencies": { 119 | "@algolia/client-common": "4.23.3", 120 | "@algolia/requester-common": "4.23.3", 121 | "@algolia/transporter": "4.23.3" 122 | } 123 | }, 124 | "node_modules/@algolia/client-search": { 125 | "version": "4.23.3", 126 | "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.3.tgz", 127 | "integrity": "sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==", 128 | "dev": true, 129 | "dependencies": { 130 | "@algolia/client-common": "4.23.3", 131 | "@algolia/requester-common": "4.23.3", 132 | "@algolia/transporter": "4.23.3" 133 | } 134 | }, 135 | "node_modules/@algolia/logger-common": { 136 | "version": "4.23.3", 137 | "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.3.tgz", 138 | "integrity": "sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==", 139 | "dev": true 140 | }, 141 | "node_modules/@algolia/logger-console": { 142 | "version": "4.23.3", 143 | "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.3.tgz", 144 | "integrity": "sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==", 145 | "dev": true, 146 | "dependencies": { 147 | "@algolia/logger-common": "4.23.3" 148 | } 149 | }, 150 | "node_modules/@algolia/recommend": { 151 | "version": "4.23.3", 152 | "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.3.tgz", 153 | "integrity": "sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==", 154 | "dev": true, 155 | "dependencies": { 156 | "@algolia/cache-browser-local-storage": "4.23.3", 157 | "@algolia/cache-common": "4.23.3", 158 | "@algolia/cache-in-memory": "4.23.3", 159 | "@algolia/client-common": "4.23.3", 160 | "@algolia/client-search": "4.23.3", 161 | "@algolia/logger-common": "4.23.3", 162 | "@algolia/logger-console": "4.23.3", 163 | "@algolia/requester-browser-xhr": "4.23.3", 164 | "@algolia/requester-common": "4.23.3", 165 | "@algolia/requester-node-http": "4.23.3", 166 | "@algolia/transporter": "4.23.3" 167 | } 168 | }, 169 | "node_modules/@algolia/requester-browser-xhr": { 170 | "version": "4.23.3", 171 | "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.3.tgz", 172 | "integrity": "sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==", 173 | "dev": true, 174 | "dependencies": { 175 | "@algolia/requester-common": "4.23.3" 176 | } 177 | }, 178 | "node_modules/@algolia/requester-common": { 179 | "version": "4.23.3", 180 | "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.3.tgz", 181 | "integrity": "sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==", 182 | "dev": true 183 | }, 184 | "node_modules/@algolia/requester-node-http": { 185 | "version": "4.23.3", 186 | "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.3.tgz", 187 | "integrity": "sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==", 188 | "dev": true, 189 | "dependencies": { 190 | "@algolia/requester-common": "4.23.3" 191 | } 192 | }, 193 | "node_modules/@algolia/transporter": { 194 | "version": "4.23.3", 195 | "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.3.tgz", 196 | "integrity": "sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==", 197 | "dev": true, 198 | "dependencies": { 199 | "@algolia/cache-common": "4.23.3", 200 | "@algolia/logger-common": "4.23.3", 201 | "@algolia/requester-common": "4.23.3" 202 | } 203 | }, 204 | "node_modules/@babel/parser": { 205 | "version": "7.24.5", 206 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", 207 | "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", 208 | "dev": true, 209 | "bin": { 210 | "parser": "bin/babel-parser.js" 211 | }, 212 | "engines": { 213 | "node": ">=6.0.0" 214 | } 215 | }, 216 | "node_modules/@docsearch/css": { 217 | "version": "3.6.0", 218 | "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", 219 | "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", 220 | "dev": true 221 | }, 222 | "node_modules/@docsearch/js": { 223 | "version": "3.6.0", 224 | "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz", 225 | "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==", 226 | "dev": true, 227 | "dependencies": { 228 | "@docsearch/react": "3.6.0", 229 | "preact": "^10.0.0" 230 | } 231 | }, 232 | "node_modules/@docsearch/react": { 233 | "version": "3.6.0", 234 | "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", 235 | "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", 236 | "dev": true, 237 | "dependencies": { 238 | "@algolia/autocomplete-core": "1.9.3", 239 | "@algolia/autocomplete-preset-algolia": "1.9.3", 240 | "@docsearch/css": "3.6.0", 241 | "algoliasearch": "^4.19.1" 242 | }, 243 | "peerDependencies": { 244 | "@types/react": ">= 16.8.0 < 19.0.0", 245 | "react": ">= 16.8.0 < 19.0.0", 246 | "react-dom": ">= 16.8.0 < 19.0.0", 247 | "search-insights": ">= 1 < 3" 248 | }, 249 | "peerDependenciesMeta": { 250 | "@types/react": { 251 | "optional": true 252 | }, 253 | "react": { 254 | "optional": true 255 | }, 256 | "react-dom": { 257 | "optional": true 258 | }, 259 | "search-insights": { 260 | "optional": true 261 | } 262 | } 263 | }, 264 | "node_modules/@esbuild/aix-ppc64": { 265 | "version": "0.20.2", 266 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", 267 | "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", 268 | "cpu": [ 269 | "ppc64" 270 | ], 271 | "dev": true, 272 | "optional": true, 273 | "os": [ 274 | "aix" 275 | ], 276 | "engines": { 277 | "node": ">=12" 278 | } 279 | }, 280 | "node_modules/@esbuild/android-arm": { 281 | "version": "0.20.2", 282 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", 283 | "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", 284 | "cpu": [ 285 | "arm" 286 | ], 287 | "dev": true, 288 | "optional": true, 289 | "os": [ 290 | "android" 291 | ], 292 | "engines": { 293 | "node": ">=12" 294 | } 295 | }, 296 | "node_modules/@esbuild/android-arm64": { 297 | "version": "0.20.2", 298 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", 299 | "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", 300 | "cpu": [ 301 | "arm64" 302 | ], 303 | "dev": true, 304 | "optional": true, 305 | "os": [ 306 | "android" 307 | ], 308 | "engines": { 309 | "node": ">=12" 310 | } 311 | }, 312 | "node_modules/@esbuild/android-x64": { 313 | "version": "0.20.2", 314 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", 315 | "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", 316 | "cpu": [ 317 | "x64" 318 | ], 319 | "dev": true, 320 | "optional": true, 321 | "os": [ 322 | "android" 323 | ], 324 | "engines": { 325 | "node": ">=12" 326 | } 327 | }, 328 | "node_modules/@esbuild/darwin-arm64": { 329 | "version": "0.20.2", 330 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", 331 | "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", 332 | "cpu": [ 333 | "arm64" 334 | ], 335 | "dev": true, 336 | "optional": true, 337 | "os": [ 338 | "darwin" 339 | ], 340 | "engines": { 341 | "node": ">=12" 342 | } 343 | }, 344 | "node_modules/@esbuild/darwin-x64": { 345 | "version": "0.20.2", 346 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", 347 | "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", 348 | "cpu": [ 349 | "x64" 350 | ], 351 | "dev": true, 352 | "optional": true, 353 | "os": [ 354 | "darwin" 355 | ], 356 | "engines": { 357 | "node": ">=12" 358 | } 359 | }, 360 | "node_modules/@esbuild/freebsd-arm64": { 361 | "version": "0.20.2", 362 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", 363 | "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", 364 | "cpu": [ 365 | "arm64" 366 | ], 367 | "dev": true, 368 | "optional": true, 369 | "os": [ 370 | "freebsd" 371 | ], 372 | "engines": { 373 | "node": ">=12" 374 | } 375 | }, 376 | "node_modules/@esbuild/freebsd-x64": { 377 | "version": "0.20.2", 378 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", 379 | "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", 380 | "cpu": [ 381 | "x64" 382 | ], 383 | "dev": true, 384 | "optional": true, 385 | "os": [ 386 | "freebsd" 387 | ], 388 | "engines": { 389 | "node": ">=12" 390 | } 391 | }, 392 | "node_modules/@esbuild/linux-arm": { 393 | "version": "0.20.2", 394 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", 395 | "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", 396 | "cpu": [ 397 | "arm" 398 | ], 399 | "dev": true, 400 | "optional": true, 401 | "os": [ 402 | "linux" 403 | ], 404 | "engines": { 405 | "node": ">=12" 406 | } 407 | }, 408 | "node_modules/@esbuild/linux-arm64": { 409 | "version": "0.20.2", 410 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", 411 | "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", 412 | "cpu": [ 413 | "arm64" 414 | ], 415 | "dev": true, 416 | "optional": true, 417 | "os": [ 418 | "linux" 419 | ], 420 | "engines": { 421 | "node": ">=12" 422 | } 423 | }, 424 | "node_modules/@esbuild/linux-ia32": { 425 | "version": "0.20.2", 426 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", 427 | "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", 428 | "cpu": [ 429 | "ia32" 430 | ], 431 | "dev": true, 432 | "optional": true, 433 | "os": [ 434 | "linux" 435 | ], 436 | "engines": { 437 | "node": ">=12" 438 | } 439 | }, 440 | "node_modules/@esbuild/linux-loong64": { 441 | "version": "0.20.2", 442 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", 443 | "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", 444 | "cpu": [ 445 | "loong64" 446 | ], 447 | "dev": true, 448 | "optional": true, 449 | "os": [ 450 | "linux" 451 | ], 452 | "engines": { 453 | "node": ">=12" 454 | } 455 | }, 456 | "node_modules/@esbuild/linux-mips64el": { 457 | "version": "0.20.2", 458 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", 459 | "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", 460 | "cpu": [ 461 | "mips64el" 462 | ], 463 | "dev": true, 464 | "optional": true, 465 | "os": [ 466 | "linux" 467 | ], 468 | "engines": { 469 | "node": ">=12" 470 | } 471 | }, 472 | "node_modules/@esbuild/linux-ppc64": { 473 | "version": "0.20.2", 474 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", 475 | "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", 476 | "cpu": [ 477 | "ppc64" 478 | ], 479 | "dev": true, 480 | "optional": true, 481 | "os": [ 482 | "linux" 483 | ], 484 | "engines": { 485 | "node": ">=12" 486 | } 487 | }, 488 | "node_modules/@esbuild/linux-riscv64": { 489 | "version": "0.20.2", 490 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", 491 | "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", 492 | "cpu": [ 493 | "riscv64" 494 | ], 495 | "dev": true, 496 | "optional": true, 497 | "os": [ 498 | "linux" 499 | ], 500 | "engines": { 501 | "node": ">=12" 502 | } 503 | }, 504 | "node_modules/@esbuild/linux-s390x": { 505 | "version": "0.20.2", 506 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", 507 | "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", 508 | "cpu": [ 509 | "s390x" 510 | ], 511 | "dev": true, 512 | "optional": true, 513 | "os": [ 514 | "linux" 515 | ], 516 | "engines": { 517 | "node": ">=12" 518 | } 519 | }, 520 | "node_modules/@esbuild/linux-x64": { 521 | "version": "0.20.2", 522 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", 523 | "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", 524 | "cpu": [ 525 | "x64" 526 | ], 527 | "dev": true, 528 | "optional": true, 529 | "os": [ 530 | "linux" 531 | ], 532 | "engines": { 533 | "node": ">=12" 534 | } 535 | }, 536 | "node_modules/@esbuild/netbsd-x64": { 537 | "version": "0.20.2", 538 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", 539 | "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", 540 | "cpu": [ 541 | "x64" 542 | ], 543 | "dev": true, 544 | "optional": true, 545 | "os": [ 546 | "netbsd" 547 | ], 548 | "engines": { 549 | "node": ">=12" 550 | } 551 | }, 552 | "node_modules/@esbuild/openbsd-x64": { 553 | "version": "0.20.2", 554 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", 555 | "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", 556 | "cpu": [ 557 | "x64" 558 | ], 559 | "dev": true, 560 | "optional": true, 561 | "os": [ 562 | "openbsd" 563 | ], 564 | "engines": { 565 | "node": ">=12" 566 | } 567 | }, 568 | "node_modules/@esbuild/sunos-x64": { 569 | "version": "0.20.2", 570 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", 571 | "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", 572 | "cpu": [ 573 | "x64" 574 | ], 575 | "dev": true, 576 | "optional": true, 577 | "os": [ 578 | "sunos" 579 | ], 580 | "engines": { 581 | "node": ">=12" 582 | } 583 | }, 584 | "node_modules/@esbuild/win32-arm64": { 585 | "version": "0.20.2", 586 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", 587 | "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", 588 | "cpu": [ 589 | "arm64" 590 | ], 591 | "dev": true, 592 | "optional": true, 593 | "os": [ 594 | "win32" 595 | ], 596 | "engines": { 597 | "node": ">=12" 598 | } 599 | }, 600 | "node_modules/@esbuild/win32-ia32": { 601 | "version": "0.20.2", 602 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", 603 | "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", 604 | "cpu": [ 605 | "ia32" 606 | ], 607 | "dev": true, 608 | "optional": true, 609 | "os": [ 610 | "win32" 611 | ], 612 | "engines": { 613 | "node": ">=12" 614 | } 615 | }, 616 | "node_modules/@esbuild/win32-x64": { 617 | "version": "0.20.2", 618 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", 619 | "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", 620 | "cpu": [ 621 | "x64" 622 | ], 623 | "dev": true, 624 | "optional": true, 625 | "os": [ 626 | "win32" 627 | ], 628 | "engines": { 629 | "node": ">=12" 630 | } 631 | }, 632 | "node_modules/@jridgewell/sourcemap-codec": { 633 | "version": "1.4.15", 634 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 635 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 636 | "dev": true 637 | }, 638 | "node_modules/@rollup/rollup-android-arm-eabi": { 639 | "version": "4.17.2", 640 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", 641 | "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", 642 | "cpu": [ 643 | "arm" 644 | ], 645 | "dev": true, 646 | "optional": true, 647 | "os": [ 648 | "android" 649 | ] 650 | }, 651 | "node_modules/@rollup/rollup-android-arm64": { 652 | "version": "4.17.2", 653 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", 654 | "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", 655 | "cpu": [ 656 | "arm64" 657 | ], 658 | "dev": true, 659 | "optional": true, 660 | "os": [ 661 | "android" 662 | ] 663 | }, 664 | "node_modules/@rollup/rollup-darwin-arm64": { 665 | "version": "4.17.2", 666 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", 667 | "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", 668 | "cpu": [ 669 | "arm64" 670 | ], 671 | "dev": true, 672 | "optional": true, 673 | "os": [ 674 | "darwin" 675 | ] 676 | }, 677 | "node_modules/@rollup/rollup-darwin-x64": { 678 | "version": "4.17.2", 679 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", 680 | "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", 681 | "cpu": [ 682 | "x64" 683 | ], 684 | "dev": true, 685 | "optional": true, 686 | "os": [ 687 | "darwin" 688 | ] 689 | }, 690 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 691 | "version": "4.17.2", 692 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", 693 | "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", 694 | "cpu": [ 695 | "arm" 696 | ], 697 | "dev": true, 698 | "optional": true, 699 | "os": [ 700 | "linux" 701 | ] 702 | }, 703 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 704 | "version": "4.17.2", 705 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", 706 | "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", 707 | "cpu": [ 708 | "arm" 709 | ], 710 | "dev": true, 711 | "optional": true, 712 | "os": [ 713 | "linux" 714 | ] 715 | }, 716 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 717 | "version": "4.17.2", 718 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", 719 | "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", 720 | "cpu": [ 721 | "arm64" 722 | ], 723 | "dev": true, 724 | "optional": true, 725 | "os": [ 726 | "linux" 727 | ] 728 | }, 729 | "node_modules/@rollup/rollup-linux-arm64-musl": { 730 | "version": "4.17.2", 731 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", 732 | "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", 733 | "cpu": [ 734 | "arm64" 735 | ], 736 | "dev": true, 737 | "optional": true, 738 | "os": [ 739 | "linux" 740 | ] 741 | }, 742 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 743 | "version": "4.17.2", 744 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", 745 | "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", 746 | "cpu": [ 747 | "ppc64" 748 | ], 749 | "dev": true, 750 | "optional": true, 751 | "os": [ 752 | "linux" 753 | ] 754 | }, 755 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 756 | "version": "4.17.2", 757 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", 758 | "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", 759 | "cpu": [ 760 | "riscv64" 761 | ], 762 | "dev": true, 763 | "optional": true, 764 | "os": [ 765 | "linux" 766 | ] 767 | }, 768 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 769 | "version": "4.17.2", 770 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", 771 | "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", 772 | "cpu": [ 773 | "s390x" 774 | ], 775 | "dev": true, 776 | "optional": true, 777 | "os": [ 778 | "linux" 779 | ] 780 | }, 781 | "node_modules/@rollup/rollup-linux-x64-gnu": { 782 | "version": "4.17.2", 783 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", 784 | "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", 785 | "cpu": [ 786 | "x64" 787 | ], 788 | "dev": true, 789 | "optional": true, 790 | "os": [ 791 | "linux" 792 | ] 793 | }, 794 | "node_modules/@rollup/rollup-linux-x64-musl": { 795 | "version": "4.17.2", 796 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", 797 | "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", 798 | "cpu": [ 799 | "x64" 800 | ], 801 | "dev": true, 802 | "optional": true, 803 | "os": [ 804 | "linux" 805 | ] 806 | }, 807 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 808 | "version": "4.17.2", 809 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", 810 | "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", 811 | "cpu": [ 812 | "arm64" 813 | ], 814 | "dev": true, 815 | "optional": true, 816 | "os": [ 817 | "win32" 818 | ] 819 | }, 820 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 821 | "version": "4.17.2", 822 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", 823 | "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", 824 | "cpu": [ 825 | "ia32" 826 | ], 827 | "dev": true, 828 | "optional": true, 829 | "os": [ 830 | "win32" 831 | ] 832 | }, 833 | "node_modules/@rollup/rollup-win32-x64-msvc": { 834 | "version": "4.17.2", 835 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", 836 | "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", 837 | "cpu": [ 838 | "x64" 839 | ], 840 | "dev": true, 841 | "optional": true, 842 | "os": [ 843 | "win32" 844 | ] 845 | }, 846 | "node_modules/@shikijs/core": { 847 | "version": "1.6.0", 848 | "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.6.0.tgz", 849 | "integrity": "sha512-NIEAi5U5R7BLkbW1pG/ZKu3eb1lzc3/+jD0lFsuxMT7zjaf9bbNwdNyMr7zh/Zl8EXQtQ+MYBAt5G+JLu+5DlA==", 850 | "dev": true 851 | }, 852 | "node_modules/@shikijs/transformers": { 853 | "version": "1.6.0", 854 | "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.6.0.tgz", 855 | "integrity": "sha512-qGfHe1ECiqfE2STPWvfogIj/9Q0SK+MCRJdoITkW7AmFuB7DmbFnBT2US84+zklJOB51MzNO8RUXZiauWssJlQ==", 856 | "dev": true, 857 | "dependencies": { 858 | "shiki": "1.6.0" 859 | } 860 | }, 861 | "node_modules/@types/estree": { 862 | "version": "1.0.5", 863 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 864 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 865 | "dev": true 866 | }, 867 | "node_modules/@types/linkify-it": { 868 | "version": "5.0.0", 869 | "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", 870 | "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", 871 | "dev": true 872 | }, 873 | "node_modules/@types/markdown-it": { 874 | "version": "14.1.1", 875 | "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", 876 | "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", 877 | "dev": true, 878 | "dependencies": { 879 | "@types/linkify-it": "^5", 880 | "@types/mdurl": "^2" 881 | } 882 | }, 883 | "node_modules/@types/mdurl": { 884 | "version": "2.0.0", 885 | "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", 886 | "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", 887 | "dev": true 888 | }, 889 | "node_modules/@types/web-bluetooth": { 890 | "version": "0.0.20", 891 | "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", 892 | "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", 893 | "dev": true 894 | }, 895 | "node_modules/@vitejs/plugin-vue": { 896 | "version": "5.0.4", 897 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", 898 | "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", 899 | "dev": true, 900 | "engines": { 901 | "node": "^18.0.0 || >=20.0.0" 902 | }, 903 | "peerDependencies": { 904 | "vite": "^5.0.0", 905 | "vue": "^3.2.25" 906 | } 907 | }, 908 | "node_modules/@vue/compiler-core": { 909 | "version": "3.4.27", 910 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", 911 | "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", 912 | "dev": true, 913 | "dependencies": { 914 | "@babel/parser": "^7.24.4", 915 | "@vue/shared": "3.4.27", 916 | "entities": "^4.5.0", 917 | "estree-walker": "^2.0.2", 918 | "source-map-js": "^1.2.0" 919 | } 920 | }, 921 | "node_modules/@vue/compiler-dom": { 922 | "version": "3.4.27", 923 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", 924 | "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", 925 | "dev": true, 926 | "dependencies": { 927 | "@vue/compiler-core": "3.4.27", 928 | "@vue/shared": "3.4.27" 929 | } 930 | }, 931 | "node_modules/@vue/compiler-sfc": { 932 | "version": "3.4.27", 933 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz", 934 | "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==", 935 | "dev": true, 936 | "dependencies": { 937 | "@babel/parser": "^7.24.4", 938 | "@vue/compiler-core": "3.4.27", 939 | "@vue/compiler-dom": "3.4.27", 940 | "@vue/compiler-ssr": "3.4.27", 941 | "@vue/shared": "3.4.27", 942 | "estree-walker": "^2.0.2", 943 | "magic-string": "^0.30.10", 944 | "postcss": "^8.4.38", 945 | "source-map-js": "^1.2.0" 946 | } 947 | }, 948 | "node_modules/@vue/compiler-ssr": { 949 | "version": "3.4.27", 950 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz", 951 | "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==", 952 | "dev": true, 953 | "dependencies": { 954 | "@vue/compiler-dom": "3.4.27", 955 | "@vue/shared": "3.4.27" 956 | } 957 | }, 958 | "node_modules/@vue/devtools-api": { 959 | "version": "7.2.1", 960 | "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.2.1.tgz", 961 | "integrity": "sha512-6oNCtyFOrNdqm6GUkFujsCgFlpbsHLnZqq7edeM/+cxAbMyCWvsaCsIMUaz7AiluKLccCGEM8fhOsjaKgBvb7g==", 962 | "dev": true, 963 | "dependencies": { 964 | "@vue/devtools-kit": "^7.2.1" 965 | } 966 | }, 967 | "node_modules/@vue/devtools-kit": { 968 | "version": "7.2.1", 969 | "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.2.1.tgz", 970 | "integrity": "sha512-Wak/fin1X0Q8LLIfCAHBrdaaB+R6IdpSXsDByPHbQ3BmkCP0/cIo/oEGp9i0U2+gEqD4L3V9RDjNf1S34DTzQQ==", 971 | "dev": true, 972 | "dependencies": { 973 | "@vue/devtools-shared": "^7.2.1", 974 | "hookable": "^5.5.3", 975 | "mitt": "^3.0.1", 976 | "perfect-debounce": "^1.0.0", 977 | "speakingurl": "^14.0.1" 978 | }, 979 | "peerDependencies": { 980 | "vue": "^3.0.0" 981 | } 982 | }, 983 | "node_modules/@vue/devtools-shared": { 984 | "version": "7.2.1", 985 | "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.2.1.tgz", 986 | "integrity": "sha512-PCJF4UknJmOal68+X9XHyVeQ+idv0LFujkTOIW30+GaMJqwFVN9LkQKX4gLqn61KkGMdJTzQ1bt7EJag3TI6AA==", 987 | "dev": true, 988 | "dependencies": { 989 | "rfdc": "^1.3.1" 990 | } 991 | }, 992 | "node_modules/@vue/reactivity": { 993 | "version": "3.4.27", 994 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz", 995 | "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==", 996 | "dev": true, 997 | "dependencies": { 998 | "@vue/shared": "3.4.27" 999 | } 1000 | }, 1001 | "node_modules/@vue/runtime-core": { 1002 | "version": "3.4.27", 1003 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz", 1004 | "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==", 1005 | "dev": true, 1006 | "dependencies": { 1007 | "@vue/reactivity": "3.4.27", 1008 | "@vue/shared": "3.4.27" 1009 | } 1010 | }, 1011 | "node_modules/@vue/runtime-dom": { 1012 | "version": "3.4.27", 1013 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz", 1014 | "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==", 1015 | "dev": true, 1016 | "dependencies": { 1017 | "@vue/runtime-core": "3.4.27", 1018 | "@vue/shared": "3.4.27", 1019 | "csstype": "^3.1.3" 1020 | } 1021 | }, 1022 | "node_modules/@vue/server-renderer": { 1023 | "version": "3.4.27", 1024 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz", 1025 | "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==", 1026 | "dev": true, 1027 | "dependencies": { 1028 | "@vue/compiler-ssr": "3.4.27", 1029 | "@vue/shared": "3.4.27" 1030 | }, 1031 | "peerDependencies": { 1032 | "vue": "3.4.27" 1033 | } 1034 | }, 1035 | "node_modules/@vue/shared": { 1036 | "version": "3.4.27", 1037 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", 1038 | "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==", 1039 | "dev": true 1040 | }, 1041 | "node_modules/@vueuse/core": { 1042 | "version": "10.9.0", 1043 | "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", 1044 | "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", 1045 | "dev": true, 1046 | "dependencies": { 1047 | "@types/web-bluetooth": "^0.0.20", 1048 | "@vueuse/metadata": "10.9.0", 1049 | "@vueuse/shared": "10.9.0", 1050 | "vue-demi": ">=0.14.7" 1051 | }, 1052 | "funding": { 1053 | "url": "https://github.com/sponsors/antfu" 1054 | } 1055 | }, 1056 | "node_modules/@vueuse/core/node_modules/vue-demi": { 1057 | "version": "0.14.7", 1058 | "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", 1059 | "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", 1060 | "dev": true, 1061 | "hasInstallScript": true, 1062 | "bin": { 1063 | "vue-demi-fix": "bin/vue-demi-fix.js", 1064 | "vue-demi-switch": "bin/vue-demi-switch.js" 1065 | }, 1066 | "engines": { 1067 | "node": ">=12" 1068 | }, 1069 | "funding": { 1070 | "url": "https://github.com/sponsors/antfu" 1071 | }, 1072 | "peerDependencies": { 1073 | "@vue/composition-api": "^1.0.0-rc.1", 1074 | "vue": "^3.0.0-0 || ^2.6.0" 1075 | }, 1076 | "peerDependenciesMeta": { 1077 | "@vue/composition-api": { 1078 | "optional": true 1079 | } 1080 | } 1081 | }, 1082 | "node_modules/@vueuse/integrations": { 1083 | "version": "10.9.0", 1084 | "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz", 1085 | "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==", 1086 | "dev": true, 1087 | "dependencies": { 1088 | "@vueuse/core": "10.9.0", 1089 | "@vueuse/shared": "10.9.0", 1090 | "vue-demi": ">=0.14.7" 1091 | }, 1092 | "funding": { 1093 | "url": "https://github.com/sponsors/antfu" 1094 | }, 1095 | "peerDependencies": { 1096 | "async-validator": "*", 1097 | "axios": "*", 1098 | "change-case": "*", 1099 | "drauu": "*", 1100 | "focus-trap": "*", 1101 | "fuse.js": "*", 1102 | "idb-keyval": "*", 1103 | "jwt-decode": "*", 1104 | "nprogress": "*", 1105 | "qrcode": "*", 1106 | "sortablejs": "*", 1107 | "universal-cookie": "*" 1108 | }, 1109 | "peerDependenciesMeta": { 1110 | "async-validator": { 1111 | "optional": true 1112 | }, 1113 | "axios": { 1114 | "optional": true 1115 | }, 1116 | "change-case": { 1117 | "optional": true 1118 | }, 1119 | "drauu": { 1120 | "optional": true 1121 | }, 1122 | "focus-trap": { 1123 | "optional": true 1124 | }, 1125 | "fuse.js": { 1126 | "optional": true 1127 | }, 1128 | "idb-keyval": { 1129 | "optional": true 1130 | }, 1131 | "jwt-decode": { 1132 | "optional": true 1133 | }, 1134 | "nprogress": { 1135 | "optional": true 1136 | }, 1137 | "qrcode": { 1138 | "optional": true 1139 | }, 1140 | "sortablejs": { 1141 | "optional": true 1142 | }, 1143 | "universal-cookie": { 1144 | "optional": true 1145 | } 1146 | } 1147 | }, 1148 | "node_modules/@vueuse/integrations/node_modules/vue-demi": { 1149 | "version": "0.14.7", 1150 | "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", 1151 | "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", 1152 | "dev": true, 1153 | "hasInstallScript": true, 1154 | "bin": { 1155 | "vue-demi-fix": "bin/vue-demi-fix.js", 1156 | "vue-demi-switch": "bin/vue-demi-switch.js" 1157 | }, 1158 | "engines": { 1159 | "node": ">=12" 1160 | }, 1161 | "funding": { 1162 | "url": "https://github.com/sponsors/antfu" 1163 | }, 1164 | "peerDependencies": { 1165 | "@vue/composition-api": "^1.0.0-rc.1", 1166 | "vue": "^3.0.0-0 || ^2.6.0" 1167 | }, 1168 | "peerDependenciesMeta": { 1169 | "@vue/composition-api": { 1170 | "optional": true 1171 | } 1172 | } 1173 | }, 1174 | "node_modules/@vueuse/metadata": { 1175 | "version": "10.9.0", 1176 | "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", 1177 | "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", 1178 | "dev": true, 1179 | "funding": { 1180 | "url": "https://github.com/sponsors/antfu" 1181 | } 1182 | }, 1183 | "node_modules/@vueuse/shared": { 1184 | "version": "10.9.0", 1185 | "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", 1186 | "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", 1187 | "dev": true, 1188 | "dependencies": { 1189 | "vue-demi": ">=0.14.7" 1190 | }, 1191 | "funding": { 1192 | "url": "https://github.com/sponsors/antfu" 1193 | } 1194 | }, 1195 | "node_modules/@vueuse/shared/node_modules/vue-demi": { 1196 | "version": "0.14.7", 1197 | "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", 1198 | "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", 1199 | "dev": true, 1200 | "hasInstallScript": true, 1201 | "bin": { 1202 | "vue-demi-fix": "bin/vue-demi-fix.js", 1203 | "vue-demi-switch": "bin/vue-demi-switch.js" 1204 | }, 1205 | "engines": { 1206 | "node": ">=12" 1207 | }, 1208 | "funding": { 1209 | "url": "https://github.com/sponsors/antfu" 1210 | }, 1211 | "peerDependencies": { 1212 | "@vue/composition-api": "^1.0.0-rc.1", 1213 | "vue": "^3.0.0-0 || ^2.6.0" 1214 | }, 1215 | "peerDependenciesMeta": { 1216 | "@vue/composition-api": { 1217 | "optional": true 1218 | } 1219 | } 1220 | }, 1221 | "node_modules/algoliasearch": { 1222 | "version": "4.23.3", 1223 | "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.3.tgz", 1224 | "integrity": "sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==", 1225 | "dev": true, 1226 | "dependencies": { 1227 | "@algolia/cache-browser-local-storage": "4.23.3", 1228 | "@algolia/cache-common": "4.23.3", 1229 | "@algolia/cache-in-memory": "4.23.3", 1230 | "@algolia/client-account": "4.23.3", 1231 | "@algolia/client-analytics": "4.23.3", 1232 | "@algolia/client-common": "4.23.3", 1233 | "@algolia/client-personalization": "4.23.3", 1234 | "@algolia/client-search": "4.23.3", 1235 | "@algolia/logger-common": "4.23.3", 1236 | "@algolia/logger-console": "4.23.3", 1237 | "@algolia/recommend": "4.23.3", 1238 | "@algolia/requester-browser-xhr": "4.23.3", 1239 | "@algolia/requester-common": "4.23.3", 1240 | "@algolia/requester-node-http": "4.23.3", 1241 | "@algolia/transporter": "4.23.3" 1242 | } 1243 | }, 1244 | "node_modules/csstype": { 1245 | "version": "3.1.3", 1246 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 1247 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 1248 | "dev": true 1249 | }, 1250 | "node_modules/entities": { 1251 | "version": "4.5.0", 1252 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 1253 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 1254 | "dev": true, 1255 | "engines": { 1256 | "node": ">=0.12" 1257 | }, 1258 | "funding": { 1259 | "url": "https://github.com/fb55/entities?sponsor=1" 1260 | } 1261 | }, 1262 | "node_modules/esbuild": { 1263 | "version": "0.20.2", 1264 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", 1265 | "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", 1266 | "dev": true, 1267 | "hasInstallScript": true, 1268 | "bin": { 1269 | "esbuild": "bin/esbuild" 1270 | }, 1271 | "engines": { 1272 | "node": ">=12" 1273 | }, 1274 | "optionalDependencies": { 1275 | "@esbuild/aix-ppc64": "0.20.2", 1276 | "@esbuild/android-arm": "0.20.2", 1277 | "@esbuild/android-arm64": "0.20.2", 1278 | "@esbuild/android-x64": "0.20.2", 1279 | "@esbuild/darwin-arm64": "0.20.2", 1280 | "@esbuild/darwin-x64": "0.20.2", 1281 | "@esbuild/freebsd-arm64": "0.20.2", 1282 | "@esbuild/freebsd-x64": "0.20.2", 1283 | "@esbuild/linux-arm": "0.20.2", 1284 | "@esbuild/linux-arm64": "0.20.2", 1285 | "@esbuild/linux-ia32": "0.20.2", 1286 | "@esbuild/linux-loong64": "0.20.2", 1287 | "@esbuild/linux-mips64el": "0.20.2", 1288 | "@esbuild/linux-ppc64": "0.20.2", 1289 | "@esbuild/linux-riscv64": "0.20.2", 1290 | "@esbuild/linux-s390x": "0.20.2", 1291 | "@esbuild/linux-x64": "0.20.2", 1292 | "@esbuild/netbsd-x64": "0.20.2", 1293 | "@esbuild/openbsd-x64": "0.20.2", 1294 | "@esbuild/sunos-x64": "0.20.2", 1295 | "@esbuild/win32-arm64": "0.20.2", 1296 | "@esbuild/win32-ia32": "0.20.2", 1297 | "@esbuild/win32-x64": "0.20.2" 1298 | } 1299 | }, 1300 | "node_modules/estree-walker": { 1301 | "version": "2.0.2", 1302 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1303 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1304 | "dev": true 1305 | }, 1306 | "node_modules/focus-trap": { 1307 | "version": "7.5.4", 1308 | "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", 1309 | "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", 1310 | "dev": true, 1311 | "dependencies": { 1312 | "tabbable": "^6.2.0" 1313 | } 1314 | }, 1315 | "node_modules/fsevents": { 1316 | "version": "2.3.3", 1317 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1318 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1319 | "dev": true, 1320 | "hasInstallScript": true, 1321 | "optional": true, 1322 | "os": [ 1323 | "darwin" 1324 | ], 1325 | "engines": { 1326 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1327 | } 1328 | }, 1329 | "node_modules/hookable": { 1330 | "version": "5.5.3", 1331 | "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", 1332 | "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", 1333 | "dev": true 1334 | }, 1335 | "node_modules/magic-string": { 1336 | "version": "0.30.10", 1337 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", 1338 | "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", 1339 | "dev": true, 1340 | "dependencies": { 1341 | "@jridgewell/sourcemap-codec": "^1.4.15" 1342 | } 1343 | }, 1344 | "node_modules/mark.js": { 1345 | "version": "8.11.1", 1346 | "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", 1347 | "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", 1348 | "dev": true 1349 | }, 1350 | "node_modules/minisearch": { 1351 | "version": "6.3.0", 1352 | "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", 1353 | "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", 1354 | "dev": true 1355 | }, 1356 | "node_modules/mitt": { 1357 | "version": "3.0.1", 1358 | "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", 1359 | "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", 1360 | "dev": true 1361 | }, 1362 | "node_modules/nanoid": { 1363 | "version": "3.3.7", 1364 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1365 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 1366 | "dev": true, 1367 | "funding": [ 1368 | { 1369 | "type": "github", 1370 | "url": "https://github.com/sponsors/ai" 1371 | } 1372 | ], 1373 | "bin": { 1374 | "nanoid": "bin/nanoid.cjs" 1375 | }, 1376 | "engines": { 1377 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1378 | } 1379 | }, 1380 | "node_modules/perfect-debounce": { 1381 | "version": "1.0.0", 1382 | "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", 1383 | "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", 1384 | "dev": true 1385 | }, 1386 | "node_modules/picocolors": { 1387 | "version": "1.0.1", 1388 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", 1389 | "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", 1390 | "dev": true 1391 | }, 1392 | "node_modules/postcss": { 1393 | "version": "8.4.38", 1394 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", 1395 | "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", 1396 | "dev": true, 1397 | "funding": [ 1398 | { 1399 | "type": "opencollective", 1400 | "url": "https://opencollective.com/postcss/" 1401 | }, 1402 | { 1403 | "type": "tidelift", 1404 | "url": "https://tidelift.com/funding/github/npm/postcss" 1405 | }, 1406 | { 1407 | "type": "github", 1408 | "url": "https://github.com/sponsors/ai" 1409 | } 1410 | ], 1411 | "dependencies": { 1412 | "nanoid": "^3.3.7", 1413 | "picocolors": "^1.0.0", 1414 | "source-map-js": "^1.2.0" 1415 | }, 1416 | "engines": { 1417 | "node": "^10 || ^12 || >=14" 1418 | } 1419 | }, 1420 | "node_modules/preact": { 1421 | "version": "10.22.0", 1422 | "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.0.tgz", 1423 | "integrity": "sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==", 1424 | "dev": true, 1425 | "funding": { 1426 | "type": "opencollective", 1427 | "url": "https://opencollective.com/preact" 1428 | } 1429 | }, 1430 | "node_modules/rfdc": { 1431 | "version": "1.3.1", 1432 | "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", 1433 | "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", 1434 | "dev": true 1435 | }, 1436 | "node_modules/rollup": { 1437 | "version": "4.17.2", 1438 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", 1439 | "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", 1440 | "dev": true, 1441 | "dependencies": { 1442 | "@types/estree": "1.0.5" 1443 | }, 1444 | "bin": { 1445 | "rollup": "dist/bin/rollup" 1446 | }, 1447 | "engines": { 1448 | "node": ">=18.0.0", 1449 | "npm": ">=8.0.0" 1450 | }, 1451 | "optionalDependencies": { 1452 | "@rollup/rollup-android-arm-eabi": "4.17.2", 1453 | "@rollup/rollup-android-arm64": "4.17.2", 1454 | "@rollup/rollup-darwin-arm64": "4.17.2", 1455 | "@rollup/rollup-darwin-x64": "4.17.2", 1456 | "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", 1457 | "@rollup/rollup-linux-arm-musleabihf": "4.17.2", 1458 | "@rollup/rollup-linux-arm64-gnu": "4.17.2", 1459 | "@rollup/rollup-linux-arm64-musl": "4.17.2", 1460 | "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", 1461 | "@rollup/rollup-linux-riscv64-gnu": "4.17.2", 1462 | "@rollup/rollup-linux-s390x-gnu": "4.17.2", 1463 | "@rollup/rollup-linux-x64-gnu": "4.17.2", 1464 | "@rollup/rollup-linux-x64-musl": "4.17.2", 1465 | "@rollup/rollup-win32-arm64-msvc": "4.17.2", 1466 | "@rollup/rollup-win32-ia32-msvc": "4.17.2", 1467 | "@rollup/rollup-win32-x64-msvc": "4.17.2", 1468 | "fsevents": "~2.3.2" 1469 | } 1470 | }, 1471 | "node_modules/search-insights": { 1472 | "version": "2.13.0", 1473 | "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", 1474 | "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", 1475 | "dev": true, 1476 | "peer": true 1477 | }, 1478 | "node_modules/shiki": { 1479 | "version": "1.6.0", 1480 | "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.6.0.tgz", 1481 | "integrity": "sha512-P31ROeXcVgW/k3Z+vUUErcxoTah7ZRaimctOpzGuqAntqnnSmx1HOsvnbAB8Z2qfXPRhw61yptAzCsuKOhTHwQ==", 1482 | "dev": true, 1483 | "dependencies": { 1484 | "@shikijs/core": "1.6.0" 1485 | } 1486 | }, 1487 | "node_modules/source-map-js": { 1488 | "version": "1.2.0", 1489 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 1490 | "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", 1491 | "dev": true, 1492 | "engines": { 1493 | "node": ">=0.10.0" 1494 | } 1495 | }, 1496 | "node_modules/speakingurl": { 1497 | "version": "14.0.1", 1498 | "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", 1499 | "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", 1500 | "dev": true, 1501 | "engines": { 1502 | "node": ">=0.10.0" 1503 | } 1504 | }, 1505 | "node_modules/tabbable": { 1506 | "version": "6.2.0", 1507 | "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", 1508 | "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", 1509 | "dev": true 1510 | }, 1511 | "node_modules/vite": { 1512 | "version": "5.2.11", 1513 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", 1514 | "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", 1515 | "dev": true, 1516 | "dependencies": { 1517 | "esbuild": "^0.20.1", 1518 | "postcss": "^8.4.38", 1519 | "rollup": "^4.13.0" 1520 | }, 1521 | "bin": { 1522 | "vite": "bin/vite.js" 1523 | }, 1524 | "engines": { 1525 | "node": "^18.0.0 || >=20.0.0" 1526 | }, 1527 | "funding": { 1528 | "url": "https://github.com/vitejs/vite?sponsor=1" 1529 | }, 1530 | "optionalDependencies": { 1531 | "fsevents": "~2.3.3" 1532 | }, 1533 | "peerDependencies": { 1534 | "@types/node": "^18.0.0 || >=20.0.0", 1535 | "less": "*", 1536 | "lightningcss": "^1.21.0", 1537 | "sass": "*", 1538 | "stylus": "*", 1539 | "sugarss": "*", 1540 | "terser": "^5.4.0" 1541 | }, 1542 | "peerDependenciesMeta": { 1543 | "@types/node": { 1544 | "optional": true 1545 | }, 1546 | "less": { 1547 | "optional": true 1548 | }, 1549 | "lightningcss": { 1550 | "optional": true 1551 | }, 1552 | "sass": { 1553 | "optional": true 1554 | }, 1555 | "stylus": { 1556 | "optional": true 1557 | }, 1558 | "sugarss": { 1559 | "optional": true 1560 | }, 1561 | "terser": { 1562 | "optional": true 1563 | } 1564 | } 1565 | }, 1566 | "node_modules/vitepress": { 1567 | "version": "1.2.0", 1568 | "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.2.0.tgz", 1569 | "integrity": "sha512-m/4PAQVyPBvKHV7sFKwcmNmrsoSxdjnw/Eg40YyuBSaBHhrro9ubnfWk5GT0xGfE98LqjZkHCWKNJlR6G/7Ayg==", 1570 | "dev": true, 1571 | "dependencies": { 1572 | "@docsearch/css": "^3.6.0", 1573 | "@docsearch/js": "^3.6.0", 1574 | "@shikijs/core": "^1.5.2", 1575 | "@shikijs/transformers": "^1.5.2", 1576 | "@types/markdown-it": "^14.1.1", 1577 | "@vitejs/plugin-vue": "^5.0.4", 1578 | "@vue/devtools-api": "^7.2.0", 1579 | "@vue/shared": "^3.4.27", 1580 | "@vueuse/core": "^10.9.0", 1581 | "@vueuse/integrations": "^10.9.0", 1582 | "focus-trap": "^7.5.4", 1583 | "mark.js": "8.11.1", 1584 | "minisearch": "^6.3.0", 1585 | "shiki": "^1.5.2", 1586 | "vite": "^5.2.11", 1587 | "vue": "^3.4.27" 1588 | }, 1589 | "bin": { 1590 | "vitepress": "bin/vitepress.js" 1591 | }, 1592 | "peerDependencies": { 1593 | "markdown-it-mathjax3": "^4", 1594 | "postcss": "^8" 1595 | }, 1596 | "peerDependenciesMeta": { 1597 | "markdown-it-mathjax3": { 1598 | "optional": true 1599 | }, 1600 | "postcss": { 1601 | "optional": true 1602 | } 1603 | } 1604 | }, 1605 | "node_modules/vue": { 1606 | "version": "3.4.27", 1607 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz", 1608 | "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==", 1609 | "dev": true, 1610 | "dependencies": { 1611 | "@vue/compiler-dom": "3.4.27", 1612 | "@vue/compiler-sfc": "3.4.27", 1613 | "@vue/runtime-dom": "3.4.27", 1614 | "@vue/server-renderer": "3.4.27", 1615 | "@vue/shared": "3.4.27" 1616 | }, 1617 | "peerDependencies": { 1618 | "typescript": "*" 1619 | }, 1620 | "peerDependenciesMeta": { 1621 | "typescript": { 1622 | "optional": true 1623 | } 1624 | } 1625 | } 1626 | } 1627 | } 1628 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "vitepress": "^1.2.0" 4 | }, 5 | "scripts": { 6 | "docs:dev": "vitepress dev docs", 7 | "docs:build": "vitepress build docs", 8 | "docs:preview": "vitepress preview docs" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /phpstan.neon: -------------------------------------------------------------------------------- 1 | includes: 2 | - vendor/phpstan/phpstan/conf/bleedingEdge.neon 3 | parameters: 4 | paths: 5 | - src/ 6 | level: 5 7 | ignoreErrors: 8 | - message: '#Unsafe usage of new static\(\)#' 9 | - message: '#Function response not found.#' 10 | - message: '#Function view not found.#' 11 | excludePaths: 12 | - 'src/Macros/Php2JsServiceProvider.php' -------------------------------------------------------------------------------- /src/Bases/BaseGenerator.php: -------------------------------------------------------------------------------- 1 | alias = $alias; 30 | } 31 | 32 | /** 33 | * Generate HTML span element with encoded JSON data and a specified alias. 34 | * 35 | * @param array $data The data to be encoded and stored in the span element. 36 | * 37 | * @throws Exception If the provided alias is not valid. 38 | * 39 | * @return string The HTML span element with encoded data. 40 | */ 41 | public function data(array $data): string 42 | { 43 | // Encode data to JSON without escaping Unicode characters 44 | $jsonData = json_encode($data, JSON_UNESCAPED_UNICODE); 45 | 46 | // Replace placeholders in the meta tag template 47 | $metaTag = sprintf( 48 | '', 49 | $this->alias, 50 | htmlspecialchars($jsonData, ENT_QUOTES, 'UTF-8') 51 | ); 52 | 53 | // Return the HTML meta tag 54 | return $metaTag; 55 | } 56 | 57 | /** 58 | * Generate PHP2JS script JavaScript stub content with the set alias. 59 | * 60 | * @return string The PHP2JS script JavaScript stub content. 61 | */ 62 | public function script(): string 63 | { 64 | // Get the content of the PHP2JS stub file 65 | $stub = file_get_contents(__DIR__.'/../Stubs/PHP2JS.stub'); 66 | 67 | // Replace the placeholder with the set alias 68 | return str_replace('{PHP2JS}', $this->alias, $stub); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/Macros/Php2JsServiceProvider.php: -------------------------------------------------------------------------------- 1 | view) 21 | ->with($this->getData()) 22 | ->toJS($alias) 23 | ->compose(); 24 | }); 25 | 26 | /* Return only specific variables to the JavaScript context */ 27 | View::macro('toStrictJS', function (array $values = [], string $alias = 'PHP2JS') { 28 | return Render::view($this->view) 29 | ->with($this->getData()) 30 | ->toStrictJS($values, $alias) 31 | ->compose(); 32 | }); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Render.php: -------------------------------------------------------------------------------- 1 | view = $view; 27 | } 28 | 29 | /** 30 | * Add data to the Render instance. 31 | * 32 | * @param array $data 33 | * 34 | * @return static 35 | */ 36 | public function with(array $data): static 37 | { 38 | $this->data = $data; 39 | 40 | return $this; 41 | } 42 | 43 | /** 44 | * @param string $alias 45 | * 46 | * @return static 47 | */ 48 | public function toJS(string $alias = 'PHP2JS'): static 49 | { 50 | $this->dataJS = $this->data; 51 | $this->alias = $alias; 52 | 53 | return $this; 54 | } 55 | 56 | /** 57 | * @param array $data 58 | * @param string $alias 59 | * 60 | * @return static 61 | */ 62 | public function toStrictJS(array $data = [], string $alias = 'PHP2JS'): static 63 | { 64 | $this->dataJS = $data; 65 | $this->alias = $alias; 66 | 67 | return $this; 68 | } 69 | 70 | /** 71 | * Return the View. 72 | * 73 | * @return mixed 74 | */ 75 | public function compose() 76 | { 77 | $view = view($this->view)->with($this->data); 78 | $html = $view->render(); 79 | 80 | $metas = Generator::alias($this->alias)->data($this->dataJS); 81 | $scripts = Generator::alias($this->alias)->script(); 82 | 83 | $posicionCierreHead = strpos($html, ''); 84 | $posicionCierreBody = strpos($html, ''); 85 | 86 | if ($posicionCierreHead !== false) { 87 | $ssr[0] = substr($html, 0, $posicionCierreHead); 88 | $ssr[1] = $metas; 89 | $ssr[2] = $scripts; 90 | $ssr[3] = substr($html, $posicionCierreHead); 91 | 92 | $html = implode(PHP_EOL, $ssr); 93 | } elseif ($posicionCierreBody !== false) { 94 | $ssr[0] = substr($html, 0, $posicionCierreBody); 95 | $ssr[1] = $metas; 96 | $ssr[2] = $scripts; 97 | $ssr[3] = substr($html, $posicionCierreBody); 98 | 99 | $html = implode(PHP_EOL, $ssr); 100 | } else { 101 | $html .= $metas.$scripts; 102 | } 103 | 104 | return response($html); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/Stubs/PHP2JS.stub: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/Traits/Alias.php: -------------------------------------------------------------------------------- 1 |