├── packages └── typo3_vite_demo │ ├── Classes │ ├── Domain │ │ ├── .gitkeep │ │ ├── Model │ │ │ └── .gitkeep │ │ └── Repository │ │ │ └── .gitkeep │ ├── Controller │ │ └── .gitkeep │ ├── ViewHelpers │ │ └── .gitkeep │ ├── .htaccess │ └── UserFunctions │ │ └── InsertViteAssets.php │ ├── Resources │ ├── Private │ │ ├── Partials │ │ │ ├── Page │ │ │ │ └── .gitkeep │ │ │ └── ContentElements │ │ │ │ └── .gitkeep │ │ ├── Layouts │ │ │ ├── ContentElements │ │ │ │ └── .gitkeep │ │ │ └── Page │ │ │ │ └── Default.html │ │ ├── Templates │ │ │ ├── ContentElements │ │ │ │ └── .gitkeep │ │ │ └── Page │ │ │ │ └── Default.html │ │ ├── .htaccess │ │ ├── Scss │ │ │ ├── _colors.scss │ │ │ └── main.scss │ │ ├── JavaScript │ │ │ ├── Components │ │ │ │ ├── Greeting.vue │ │ │ │ └── Counter.vue │ │ │ └── main.js │ │ └── Language │ │ │ ├── locallang.xlf │ │ │ ├── locallang_db.xlf │ │ │ └── locallang_be.xlf │ └── Public │ │ └── Icons │ │ └── favicon.svg │ ├── Configuration │ ├── .htaccess │ ├── TsConfig │ │ └── Page │ │ │ ├── TCEMAIN.tsconfig │ │ │ ├── TCEFORM.tsconfig │ │ │ ├── RTE.tsconfig │ │ │ ├── Mod │ │ │ └── WebLayout │ │ │ │ ├── BackendLayouts.tsconfig │ │ │ │ └── BackendLayouts │ │ │ │ └── default.tsconfig │ │ │ └── All.tsconfig │ ├── TCA │ │ └── Overrides │ │ │ ├── sys_template.php │ │ │ └── pages.php │ ├── RTE │ │ └── Default.yaml │ └── TypoScript │ │ ├── constants.typoscript │ │ ├── Helper │ │ └── DynamicContent.typoscript │ │ └── setup.typoscript │ ├── ext_tables.php │ ├── ext_tables_static+adt.sql │ ├── ext_conf_template.txt │ ├── ext_tables.sql │ ├── README.md │ ├── ext_localconf.php │ ├── composer.json │ └── ext_emconf.php ├── .ddev ├── .env ├── commands │ └── web │ │ ├── pnpm │ │ └── vite-serve ├── db_snapshots │ └── typo3-vite-demo_20230122125558-mariadb_10.3.gz ├── viteserve │ ├── build-dotenv.sh │ ├── build-dotenv2.sh │ ├── vite-test-listener │ ├── build-dotenv3.sh │ └── build-dotenv1.sh ├── web-build │ └── Dockerfile.ddev-viteserve ├── docker-compose.viteserve.yaml └── config.yaml ├── .env.example ├── config └── sites │ └── main │ └── config.yaml ├── package.json ├── .gitignore ├── vite.config.js ├── .editorconfig ├── composer.json ├── .gitpod.yml ├── README.md ├── public └── typo3conf │ └── LocalConfiguration.php ├── LICENSE └── pnpm-lock.yaml /packages/typo3_vite_demo/Classes/Domain/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Classes/Controller/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Classes/ViewHelpers/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Classes/Domain/Model/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Classes/Domain/Repository/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Private/Partials/Page/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Classes/.htaccess: -------------------------------------------------------------------------------- 1 | Order deny,allow 2 | Deny from all 3 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Private/Layouts/ContentElements/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Private/Partials/ContentElements/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Private/Templates/ContentElements/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Configuration/.htaccess: -------------------------------------------------------------------------------- 1 | Order deny,allow 2 | Deny from all 3 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Private/.htaccess: -------------------------------------------------------------------------------- 1 | Order deny,allow 2 | Deny from all 3 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/ext_tables.php: -------------------------------------------------------------------------------- 1 | 2 | const name = 'Vue'; 3 | 4 | 5 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig: -------------------------------------------------------------------------------- 1 | # 2 | # BACKENDLAYOUTS 3 | # 4 | 5 | -------------------------------------------------------------------------------- /.ddev/viteserve/build-dotenv2.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | #ddev-generated 3 | cd .ddev 4 | if [ -f .allow-upgrade ]; then 5 | if grep ask .allow-upgrade >/dev/null; then 6 | read replace 7 | if [ "$replace" = "y" ]; then 8 | echo "true" >.allow-upgrade 9 | else 10 | echo "false" >.allow-upgrade 11 | fi 12 | fi 13 | fi 14 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Private/Templates/Page/Default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

{data.title}

5 | 6 |
7 |
8 | 9 | 10 | 11 |
12 | -------------------------------------------------------------------------------- /.ddev/web-build/Dockerfile.ddev-viteserve: -------------------------------------------------------------------------------- 1 | #ddev-generated 2 | ARG BASE_IMAGE 3 | FROM $BASE_IMAGE 4 | 5 | # Installing pnpm inside the web-container 6 | RUN npm install -g pnpm &&\ 7 | # enable pre/post hooks for pnpm's run-script lifecycle 8 | pnpm config set enable-pre-post-script true 9 | 10 | # tmux is used to wrap our invocation of the 11 | # vite dev server. 12 | RUN apt update; apt install -y tmux 13 | 14 | -------------------------------------------------------------------------------- /config/sites/main/config.yaml: -------------------------------------------------------------------------------- 1 | base: 'https://typo3-vite-demo.ddev.site/' 2 | errorHandling: { } 3 | languages: 4 | - 5 | title: English 6 | enabled: true 7 | languageId: 0 8 | base: / 9 | typo3Language: default 10 | locale: en_US.UTF-8 11 | iso-639-1: en 12 | navigationTitle: English 13 | hreflang: en-us 14 | direction: ltr 15 | flag: us 16 | rootPageId: 1 17 | routes: { } 18 | -------------------------------------------------------------------------------- /.ddev/viteserve/vite-test-listener: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | #ddev-generated 3 | 4 | # This is used by viteserve's tests 5 | # to mock a vite process. It's not 6 | # part of the public interface of the 7 | # module 8 | 9 | PORT=$1 10 | PORT=${PORT:-5173} 11 | 12 | if nc -zv 127.0.0.1 $PORT &>/dev/null; then 13 | exit 1 14 | fi 15 | 16 | nohup nc -lk $PORT &>/dev/null & 17 | # Print out a PID 18 | echo $! 19 | disown %1 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typo3-vite-demo", 3 | "version": "1.0.0", 4 | "author": "Florian Geierstanger", 5 | "engines": { 6 | "node": "^18" 7 | }, 8 | "scripts": { 9 | "dev": "vite --port 5173 --host", 10 | "build": "vite build", 11 | "preview": "vite preview" 12 | }, 13 | "devDependencies": { 14 | "@vitejs/plugin-vue": "^4.2.1", 15 | "sass": "^1.62.1", 16 | "vite": "^4.3.3", 17 | "vue": "^3.2.47" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Private/Language/locallang.xlf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | Florian Geierstanger 6 | florian@geierstanger.org 7 |
8 | 9 | 10 |
11 |
12 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Private/Language/locallang_db.xlf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | Florian Geierstanger 6 | florian@geierstanger.org 7 |
8 | 9 | 10 |
11 |
12 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/ext_localconf.php: -------------------------------------------------------------------------------- 1 | '); 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .pnpm-store 3 | .DS_Store 4 | .idea 5 | .env 6 | nbproject 7 | /var/* 8 | !/var/labels 9 | /vendor 10 | /public/* 11 | !/public/.htaccess 12 | !/public/typo3conf 13 | /public/typo3conf/* 14 | !/public/typo3conf/LocalConfiguration.php 15 | !/public/typo3conf/AdditionalConfiguration.php 16 | !/.ddev/db_snapshots/* 17 | 18 | # Exclude all extensions but locally added (all other extensions are loaded by composer) 19 | /public/typo3conf/ext/* 20 | 21 | packages/typo3_vite_demo/Resources/Public/Vite/* 22 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Configuration/TCA/Overrides/sys_template.php: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Configuration/TCA/Overrides/pages.php: -------------------------------------------------------------------------------- 1 | /dev/null; then 6 | if [ -f .env ]; then 7 | sed -i.bak '/^# start vite/,/^\# end vite/d;' .env 8 | # strip weird null characters from sed output. 9 | tr <.env -d '\000' >.env-post-sed 10 | cat .env-post-sed .env-frag >.env 11 | echo ".env updated to:" 12 | cat .env 13 | rm .env-post-sed 14 | else 15 | cp .env-frag .env 16 | fi 17 | rm .env-frag 18 | fi 19 | fi 20 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Private/JavaScript/Components/Counter.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import vue from '@vitejs/plugin-vue'; 3 | 4 | export default defineConfig({ 5 | plugins: [ 6 | vue(), 7 | ], 8 | server: { 9 | origin: '', 10 | }, 11 | publicDir: false, // disable copy `public/` to outDir 12 | build: { 13 | rollupOptions: { 14 | input: 'packages/typo3_vite_demo/Resources/Private/JavaScript/main.js', // overwrite default .html entry 15 | }, 16 | manifest: true, // generate manifest.json in outDir 17 | outDir: 'packages/typo3_vite_demo/Resources/Public/Vite/', // ⚠️ `pnpm build` purges outDir 18 | }, 19 | css: { 20 | devSourcemap: true, // disabled by default because of performance reasons 21 | } 22 | }) 23 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "florian-geierstanger/typo3-vite-demo", 3 | "version": "0.0.1", 4 | "type": "typo3-cms-extension", 5 | "description": "", 6 | "homepage": "https://florian.geierstanger.org/", 7 | "license": ["GPL-2.0-or-later"], 8 | "keywords": ["TYPO3 CMS"], 9 | "require": { 10 | "typo3/cms-core": "^11.5", 11 | "typo3/cms-rte-ckeditor": "^11.5", 12 | "typo3/cms-fluid-styled-content": "^11.5" 13 | }, 14 | "autoload": { 15 | "psr-4": { 16 | "FlorianGeierstanger\\Typo3ViteDemo\\": "Classes/" 17 | } 18 | }, 19 | "extra": { 20 | "typo3/cms": { 21 | "extension-key": "typo3_vite_demo" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Private/Language/locallang_be.xlf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | Florian Geierstanger 6 | florian@geierstanger.org 7 |
8 | 9 | 10 | Default 11 | 12 | 13 | Normal 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Private/JavaScript/main.js: -------------------------------------------------------------------------------- 1 | import 'vite/modulepreload-polyfill'; 2 | import '../Scss/main.scss'; 3 | import { createApp } from 'vue' 4 | import Counter from './Components/Counter.vue'; 5 | import Greeting from './Components/Greeting.vue'; 6 | 7 | document.addEventListener('DOMContentLoaded', () => { 8 | const containerElements = document.querySelectorAll('[data-container="vue"]'); 9 | containerElements.forEach(element => { 10 | const component = element.getAttribute('data-component'); 11 | switch (component) { 12 | case 'Counter': { 13 | createApp(Counter).mount(element); 14 | break; 15 | } 16 | case 'Greeting': { 17 | createApp(Greeting).mount(element); 18 | break; 19 | } 20 | } 21 | }) 22 | }) 23 | 24 | console.log('Hello Vite, hello TYPO3!'); 25 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/ext_emconf.php: -------------------------------------------------------------------------------- 1 | 'typo3-vite-demo', 8 | 'description' => '', 9 | 'category' => 'templates', 10 | 'constraints' => [ 11 | 'depends' => [ 12 | 'typo3' => '11.5.0-11.5.99', 13 | 'fluid_styled_content' => '11.5.0-11.5.99', 14 | 'rte_ckeditor' => '11.5.0-11.5.99', 15 | ], 16 | 'conflicts' => [ 17 | ], 18 | ], 19 | 'autoload' => [ 20 | 'psr-4' => [ 21 | 'FlorianGeierstanger\\Typo3ViteDemo\\' => 'Classes', 22 | ], 23 | ], 24 | 'state' => 'stable', 25 | 'uploadfolder' => 0, 26 | 'createDirs' => '', 27 | 'clearCacheOnLoad' => 1, 28 | 'author' => 'Florian Geierstanger', 29 | 'author_email' => 'florian@geierstanger.org', 30 | 'author_company' => 'Florian Geierstanger', 31 | 'version' => '1.0.0', 32 | ]; 33 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Private/Layouts/Page/Default.html: -------------------------------------------------------------------------------- 1 | 21 | 22 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | # Unix-style newlines with a newline ending every file 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | 10 | # HTML-Files 11 | [*.html] 12 | indent_style = space 13 | indent_size = 4 14 | 15 | # CSS-Files 16 | [*.css] 17 | indent_style = space 18 | indent_size = 2 19 | 20 | # SCSS-Files 21 | [*.scss] 22 | indent_style = space 23 | indent_size = 2 24 | 25 | # TypoScript-Files 26 | [*.typoscript] 27 | indent_style = space 28 | indent_size = 4 29 | 30 | # TMPL-Files 31 | [*.tmpl] 32 | indent_style = space 33 | indent_size = 4 34 | 35 | # XLF-Files 36 | [*.xlf] 37 | indent_style = tab 38 | indent_size = 4 39 | 40 | # JS-Files 41 | [*.js] 42 | indent_style = space 43 | indent_size = 2 44 | 45 | # PHP-Files 46 | [*.php] 47 | indent_style = space 48 | indent_size = 4 49 | 50 | # MD-Files 51 | [*.md] 52 | indent_style = space 53 | indent_size = 4 54 | 55 | # YML-Files 56 | [*.yml] 57 | indent_style = space 58 | indent_size = 4 59 | 60 | # package.json or .travis.yml 61 | [{package.json,.travis.yml}] 62 | indent_style = space 63 | indent_size = 2 64 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig: -------------------------------------------------------------------------------- 1 | # 2 | # BACKENDLAYOUT: DEFAULT 3 | # 4 | mod { 5 | web_layout { 6 | BackendLayouts { 7 | default { 8 | title = LLL:EXT:typo3_vite_demo/Resources/Private/Language/locallang_be.xlf:backend_layout.default 9 | config { 10 | backend_layout { 11 | colCount = 1 12 | rowCount = 1 13 | rows { 14 | 1 { 15 | columns { 16 | 1 { 17 | name = LLL:EXT:typo3_vite_demo/Resources/Private/Language/locallang_be.xlf:backend_layout.column.normal 18 | colPos = 0 19 | } 20 | } 21 | } 22 | } 23 | } 24 | } 25 | icon = EXT:typo3_vite_demo/Resources/Public/Images/BackendLayouts/default.png 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /.ddev/docker-compose.viteserve.yaml: -------------------------------------------------------------------------------- 1 | #ddev-generated 2 | # Override the web container's standard HTTP_EXPOSE and HTTPS_EXPOSE 3 | # Derived from the browsersync addition. 4 | # This is to expose the vite dev port. 5 | version: '3.6' 6 | services: 7 | web: 8 | expose: 9 | # needed so the upstream works: 10 | - ${VITE_PRIMARY_PORT:-5173} 11 | environment: 12 | # Set the vite-enabled js project here. 13 | # Actual settings are pulled from .ddev/.env, and 14 | # should be changed there, and not here. 15 | - VITE_PROJECT_DIR=${VITE_PROJECT_DIR:-frontend} 16 | - VITE_PRIMARY_PORT=${VITE_PRIMARY_PORT:-5173} 17 | - VITE_SECONDARY_PORT=${VITE_SECONDARY_PORT:-5273} 18 | - VITE_JS_PACKAGE_MGR=${VITE_JS_PACKAGE_MGR} 19 | # Expose the vite dev server's port (default 5173) here. 20 | # The odd port swap below is required so we do not need 21 | # to play with HMR settings due to different internal 22 | # and external ports. DDEV won't let us expose just HTTPS, 23 | # so a bit of trickery is required. 24 | - HTTP_EXPOSE=${DDEV_ROUTER_HTTP_PORT}:80,${DDEV_MAILHOG_PORT}:8025,${VITE_SECONDARY_PORT:-5273}:${VITE_PRIMARY_PORT:-5173} 25 | - HTTPS_EXPOSE=${DDEV_ROUTER_HTTPS_PORT}:80,${DDEV_MAILHOG_HTTPS_PORT}:8025,${VITE_PRIMARY_PORT:-5173}:${VITE_PRIMARY_PORT:-5173} 26 | -------------------------------------------------------------------------------- /.ddev/viteserve/build-dotenv1.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | #ddev-generated 3 | 4 | y_flag='' 5 | 6 | print_usage() { 7 | printf "Usage: $0 [-y]" 8 | } 9 | 10 | while getopts 'y' flag; do 11 | case "${flag}" in 12 | y) y_flag='true' ;; 13 | *) 14 | print_usage 15 | exit 1 16 | ;; 17 | esac 18 | done 19 | 20 | # defaults 21 | PROJ_DIR=frontend 22 | 23 | # check for special cases 24 | if [ "$DDEV_PROJECT_TYPE" = "laravel" ]; then 25 | PROJ_DIR=. 26 | fi 27 | 28 | # @see https://stackoverflow.com/a/27650122/8600734 29 | mapfile VITE_SETTINGS <.env-frag 48 | 49 | allow_upgrade=${y_flag} 50 | 51 | if [ "$allow_upgrade" = "" ]; then 52 | if [ ! -f "./.env" ]; then 53 | allow_upgrade="true" 54 | else 55 | if grep "^# start vite" .env >/dev/null; then 56 | echo "Found vite settings in your .ddev/.env file." 57 | echo -n "Replace old settings (y/n)? " 58 | allow_upgrade=ask 59 | fi 60 | fi 61 | fi 62 | echo $allow_upgrade >.allow-upgrade 63 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Classes/UserFunctions/InsertViteAssets.php: -------------------------------------------------------------------------------- 1 | '; 28 | $content .= ''; 29 | 30 | // check if there are any stylesheets imported by Vite 31 | if (is_array($stylesheetFiles)) { 32 | foreach ($stylesheetFiles as $stylesheetFile) { 33 | $stylesheetPath = $path . $stylesheetFile; 34 | $content .= ''; 35 | } 36 | } 37 | 38 | return $content; 39 | 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Configuration/RTE/Default.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" } 3 | - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" } 4 | - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" } 5 | 6 | editor: 7 | config: 8 | contentsCss: "EXT:typo3_vite_demo/Resources/Public/Css/rte.css" 9 | 10 | stylesSet: 11 | - { name: "Lead", element: "p", attributes: { 'class': 'lead' } } 12 | 13 | toolbarGroups: 14 | - { name: styles, groups: [ format, styles ] } 15 | - { name: basicstyles, groups: [ basicstyles ] } 16 | - { name: paragraph, groups: [ list, indent, blocks, align ] } 17 | - "/" 18 | - { name: links, groups: [ links ] } 19 | - { name: clipboard, groups: [ clipboard, cleanup, undo ] } 20 | - { name: editing, groups: [ spellchecker ] } 21 | - { name: insert, groups: [ insert ] } 22 | - { name: tools, groups: [ table, specialchar ] } 23 | - { name: document, groups: [ mode ] } 24 | 25 | format_tags: "p;h1;h2;h3;h4;h5;pre" 26 | 27 | justifyClasses: 28 | - text-left 29 | - text-center 30 | - text-right 31 | - text-justify 32 | 33 | extraPlugins: 34 | - justify 35 | 36 | removePlugins: 37 | - image 38 | 39 | removeButtons: 40 | - Anchor 41 | - Underline 42 | - Strike 43 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Resources/Public/Icons/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Configuration/TypoScript/constants.typoscript: -------------------------------------------------------------------------------- 1 | ###################### 2 | #### DEPENDENCIES #### 3 | ###################### 4 | @import 'EXT:fluid_styled_content/Configuration/TypoScript/constants.typoscript' 5 | @import 'EXT:seo/Configuration/TypoScript/XmlSitemap/constants.typoscript' 6 | 7 | 8 | ############################## 9 | #### FLUID STYLED CONTENT #### 10 | ############################## 11 | styles { 12 | templates { 13 | layoutRootPath = EXT:typo3_vite_demo/Resources/Private/Layouts/ContentElements/ 14 | partialRootPath = EXT:typo3_vite_demo/Resources/Private/Partials/ContentElements/ 15 | templateRootPath = EXT:typo3_vite_demo/Resources/Private/Templates/ContentElements/ 16 | } 17 | } 18 | 19 | 20 | ############ 21 | ### PAGE ### 22 | ############ 23 | page { 24 | fluidtemplate { 25 | layoutRootPath = EXT:typo3_vite_demo/Resources/Private/Layouts/Page/ 26 | partialRootPath = EXT:typo3_vite_demo/Resources/Private/Partials/Page/ 27 | templateRootPath = EXT:typo3_vite_demo/Resources/Private/Templates/Page/ 28 | } 29 | meta { 30 | description = 31 | author = 32 | keywords = 33 | viewport = width=device-width, initial-scale=1 34 | robots = index,follow 35 | apple-mobile-web-app-capable = no 36 | compatible = IE=edge 37 | } 38 | tracking { 39 | google { 40 | trackingID = 41 | anonymizeIp = 1 42 | } 43 | } 44 | } 45 | 46 | 47 | ############## 48 | ### CONFIG ### 49 | ############## 50 | config { 51 | no_cache = 0 52 | removeDefaultJS = 0 53 | admPanel = 1 54 | prefixLocalAnchors = all 55 | headerComment = build by sitepackagebuilder.com 56 | sendCacheHeaders = 1 57 | } 58 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typo3/cms-base-distribution", 3 | "description": "TYPO3 CMS Base Distribution", 4 | "license": "GPL-2.0-or-later", 5 | "config": { 6 | "allow-plugins": { 7 | "typo3/class-alias-loader": true, 8 | "typo3/cms-composer-installers": true, 9 | "helhum/dotenv-connector": true 10 | }, 11 | "platform": { 12 | "php": "8.1" 13 | }, 14 | "sort-packages": true 15 | }, 16 | "repositories": [ 17 | { 18 | "type": "path", 19 | "url": "./packages/*" 20 | } 21 | ], 22 | "require": { 23 | "florian-geierstanger/typo3-vite-demo": "^0.0.1", 24 | "helhum/dotenv-connector": "^3.0", 25 | "helhum/typo3-console": "^7.0.2", 26 | "typo3/cms-backend": "^11.5.0", 27 | "typo3/cms-belog": "^11.5.0", 28 | "typo3/cms-beuser": "^11.5.0", 29 | "typo3/cms-core": "^11.5.0", 30 | "typo3/cms-dashboard": "^11.5.0", 31 | "typo3/cms-extbase": "^11.5.0", 32 | "typo3/cms-extensionmanager": "^11.5.0", 33 | "typo3/cms-felogin": "^11.5.0", 34 | "typo3/cms-filelist": "^11.5.0", 35 | "typo3/cms-fluid": "^11.5.0", 36 | "typo3/cms-fluid-styled-content": "^11.5.0", 37 | "typo3/cms-form": "^11.5.0", 38 | "typo3/cms-frontend": "^11.5.0", 39 | "typo3/cms-impexp": "^11.5.0", 40 | "typo3/cms-info": "^11.5.0", 41 | "typo3/cms-install": "^11.5.0", 42 | "typo3/cms-recordlist": "^11.5.0", 43 | "typo3/cms-rte-ckeditor": "^11.5.0", 44 | "typo3/cms-seo": "^11.5.0", 45 | "typo3/cms-setup": "^11.5.0", 46 | "typo3/cms-sys-note": "^11.5.0", 47 | "typo3/cms-t3editor": "^11.5.0", 48 | "typo3/cms-tstemplate": "^11.5.0", 49 | "typo3/cms-viewpage": "^11.5.0" 50 | }, 51 | "scripts": { 52 | "typo3-cms-scripts": [ 53 | "typo3cms install:fixfolderstructure" 54 | ], 55 | "post-autoload-dump": [ 56 | "@typo3-cms-scripts" 57 | ] 58 | }, 59 | "autoload": { 60 | "psr-4": { 61 | "FlorianGeierstanger\\Typo3ViteDemo\\UserFunctions\\": "Classes/UserFunctions/" 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Configuration/TypoScript/Helper/DynamicContent.typoscript: -------------------------------------------------------------------------------- 1 | ################################################ 2 | #### DYNAMIC CONTENT LIB FOR USAGE IN FLUID #### 3 | ################################################ 4 | # 5 | # EXAMPLE 6 | # --------------- 7 | # |'}" /> 8 | # 9 | # 10 | # COLUMN NUMBERS 11 | # --------------- 12 | # 13 | # 0 = main 14 | # 1 = left 15 | # 2 = right 16 | # 3 = border 17 | # 18 | ################# 19 | lib.dynamicContent = COA 20 | lib.dynamicContent { 21 | 5 = LOAD_REGISTER 22 | 5 { 23 | colPos.cObject = TEXT 24 | colPos.cObject { 25 | field = colPos 26 | ifEmpty.cObject = TEXT 27 | ifEmpty.cObject { 28 | value.current = 1 29 | ifEmpty = 0 30 | } 31 | } 32 | pageUid.cObject = TEXT 33 | pageUid.cObject { 34 | field = pageUid 35 | ifEmpty.data = TSFE:id 36 | } 37 | contentFromPid.cObject = TEXT 38 | contentFromPid.cObject { 39 | data = DB:pages:{register:pageUid}:content_from_pid 40 | data.insertData = 1 41 | } 42 | wrap.cObject = TEXT 43 | wrap.cObject { 44 | field = wrap 45 | } 46 | } 47 | 20 = CONTENT 48 | 20 { 49 | table = tt_content 50 | select { 51 | includeRecordsWithoutDefaultTranslation = 1 52 | orderBy = sorting 53 | where = {#colPos}={register:colPos} 54 | where.insertData = 1 55 | pidInList.data = register:pageUid 56 | pidInList.override.data = register:contentFromPid 57 | } 58 | stdWrap { 59 | dataWrap = {register:wrap} 60 | required = 1 61 | } 62 | } 63 | 90 = RESTORE_REGISTER 64 | } 65 | -------------------------------------------------------------------------------- /.gitpod.yml: -------------------------------------------------------------------------------- 1 | image: drupalpod/drupalpod-gitpod-base:20221021 2 | 3 | tasks: 4 | - name: typo3 5 | init: | 6 | ddev start -y 7 | ddev composer install 8 | ddev snapshot restore --latest 9 | ddev pnpm install 10 | command: | 11 | ddev start -y 12 | gp sync-done prepare 13 | gp ports await 8080 && gp preview $(gp url 8080) 14 | 15 | - name: vite 16 | command: | 17 | gp sync-await prepare 18 | ddev vite-serve start 19 | 20 | ports: 21 | # Used by ddev - local db clients 22 | - port: 3306 23 | onOpen: ignore 24 | # Used by Vite 25 | - port: 5173 26 | onOpen: ignore 27 | # Used by projector 28 | - port: 6942 29 | onOpen: ignore 30 | # Used by MailHog 31 | - port: 8027 32 | onOpen: ignore 33 | # Used by phpMyAdmin 34 | - port: 8036 35 | onOpen: ignore 36 | # Direct-connect ddev-webserver port that is the main port 37 | - port: 8080 38 | onOpen: ignore 39 | # Ignore host https port 40 | - port: 8443 41 | onOpen: ignore 42 | # xdebug port 43 | - port: 9003 44 | onOpen: ignore 45 | # projector port 46 | - port: 9999 47 | onOpen: open-browser 48 | 49 | github: 50 | prebuilds: 51 | # enable for the master/default branch (defaults to true) 52 | master: true 53 | # enable for all branches in this repo (defaults to false) 54 | branches: true 55 | # enable for pull requests coming from this repo (defaults to true) 56 | pullRequests: true 57 | # enable for pull requests coming from forks (defaults to false) 58 | pullRequestsFromForks: true 59 | # add a check to pull requests (defaults to true) 60 | addCheck: true 61 | # add a "Review in Gitpod" button as a comment to pull requests (defaults to false) 62 | addComment: false 63 | # add a "Review in Gitpod" button to the pull request's description (defaults to false) 64 | addBadge: true 65 | # add a label once the prebuild is ready to pull requests (defaults to false) 66 | addLabel: true -------------------------------------------------------------------------------- /.ddev/commands/web/vite-serve: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | #ddev-generated 3 | 4 | CMD=$1 5 | VITE_DIR=${VITE_PROJECT_DIR:-frontend} 6 | VITE_PRIMARY_PORT=${VITE_PRIMARY_PORT:-5173} 7 | VITE_SECONDARY_PORT=${VITE_SECONDARY_PORT:-5273} 8 | 9 | pmMenu() { 10 | PMS="npm yarn pnpm" 11 | 12 | PS3="Choose the package manager to use: " 13 | select pkgdefault in $PMS; do 14 | if [ -n "$pkgdefault" ]; then 15 | echo "$pkgdefault" 16 | break 17 | else 18 | echo "'$REPLY' is not a legal entry" 19 | fi 20 | done 21 | } 22 | 23 | defaultPM() { 24 | 25 | if [ -n "$VITE_JS_PACKAGE_MGR" ]; then 26 | echo $VITE_JS_PACKAGE_MGR 27 | return 28 | fi 29 | 30 | if [ -f $VITE_DIR/package-lock.json ]; then 31 | echo npm 32 | elif [ -f $VITE_DIR/yarn.lock ]; then 33 | echo yarn 34 | elif [ -f $VITE_DIR/pnpm-lock.yaml ]; then 35 | echo pnpm 36 | else 37 | pmMenu 38 | fi 39 | 40 | } 41 | 42 | CMD=${CMD:=start} 43 | 44 | if [ $CMD = start ]; then 45 | 46 | # Make sure the project directory is actually there 47 | if [ ! -d $VITE_DIR ]; then 48 | echo "ERROR: js project directory $VITE_DIR was expected, not found" 49 | exit 1 50 | fi 51 | 52 | VITE_JS_PACKAGE_MGR=$(defaultPM) 53 | echo "'$VITE_JS_PACKAGE_MGR'" 54 | 55 | if ! command -v $VITE_JS_PACKAGE_MGR >/dev/null; then 56 | echo "ERROR: could not find package manager $VITE_JS_PACKAGE_MGR" 57 | exit 1 58 | fi 59 | 60 | echo "Using package manager $VITE_JS_PACKAGE_MGR" 61 | 62 | # make sure node_modules has linux and not mac code: 63 | cd $VITE_DIR 64 | $VITE_JS_PACKAGE_MGR install 65 | 66 | # Is js project a Vite project? 67 | if [ ! -d node_modules/vite ]; then 68 | echo "ERROR: project in $VITE_DIR does not appear to be Vite-enabled" 69 | exit 1 70 | fi 71 | 72 | # create a background tmux session and tell it to run 73 | # our vite script 74 | tmux kill-session -t vite-sess 2>/dev/null 75 | tmux new -s vite-sess -d 76 | tmux send "node node_modules/vite/bin/vite.js --port $VITE_PRIMARY_PORT --host" C-m 77 | echo "Vite now serving $VITE_DIR" 78 | 79 | # stopping 80 | elif [ $CMD = stop ]; then 81 | echo "stopping vite" 82 | # kill the vite session 83 | tmux kill-session -t vite-sess 84 | 85 | # show settings 86 | elif [ $CMD = status ]; then 87 | echo "ViteServe Status" 88 | echo "================" 89 | echo "Project: $VITE_PROJECT_DIR" 90 | echo "Vite Primary Port: $VITE_PRIMARY_PORT" 91 | echo "Vite Secondary Port: $VITE_SECONDARY_PORT" 92 | 93 | # usage 94 | else 95 | echo "$0 start|stop|status" 96 | fi 97 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TYPO3 Vite Demo 2 | 3 | This project demonstrates how to integrate [Vite](https://vitejs.dev/) with with [TYPO3](https://github.com/TYPO3/typo3) both as an optimized CSS/JS build pipeline and a fast local development server. This setup enables Hot Module Reloading, out-of-the-box TypeScript support, SCSS compilation, PostCSS and especially [Vite's plugins](https://github.com/vitejs/awesome-vite#plugins) for Vue, Svelte, React, Preact and Solid. 4 | 5 | Watch a demo video at https://florian.geierstanger.org/blog/typo3-vite 6 | 7 | ## New TYPO3 extension 8 | 9 | - Update 2023-12-13: This repo was an initial exploration that lead to https://github.com/s2b/vite-asset-collector 10 | 11 | ## Based on 12 | 13 | - https://github.com/torenware/ddev-viteserve 14 | - https://vitejs.dev/guide/backend-integration.html 15 | 16 | 17 | ## Prerequisites 18 | 19 | - [Docker Desktop or Colima](https://ddev.readthedocs.io/en/latest/users/install/docker-installation/) 20 | - [DDEV](https://ddev.readthedocs.io/en/latest/) 21 | - [Mutagen](https://ddev.readthedocs.io/en/latest/users/install/performance/#mutagen) needs to be enabled for HMR 22 | 23 | 24 | ## Local installation guide 25 | 26 | git clone https://github.com/fgeierst/typo3-vite-demo.git 27 | cd typo3-vite-demo 28 | ddev start 29 | ddev exec cp .env.example .env 30 | ddev composer install 31 | ddev snapshot restore --latest 32 | 33 | Login via [typo3-vite-demo.ddev.site/typo3](https://typo3-vite-demo.ddev.site/typo3) using these credentials: 34 | 35 | - Username: `admin` 36 | - Password: `oZim4R7eLEWzzL` 37 | 38 | 39 | ## Vite development server 40 | 41 | The development server is already running in the background (started by `ddev start`). You can control it with 42 | 43 | ddev vite-serve start|stop 44 | 45 | Running `ddev pnpm dev` does the same, but shows Vite's output in the terminal - which is helpful for debugging. 46 | 47 | ### File watcher 48 | 49 | All files that are imported by the main entry point [main.js](https://github.com/fgeierst/typo3-vite-demo/blob/c746ce69dbd42b626c93280f642dc7bb9d7ab973/packages/typo3_vite_demo/Resources/Private/JavaScript/main.js) are watched and trigger a Hot Module Replacement. 50 | 51 | 52 | ## Test the production build 53 | 54 | ddev pnpm build 55 | 56 | Switch applicationContext to production in _.env_ (or in .ddev/config.yaml under web_environment) 57 | 58 | # TYPO3_CONTEXT="Development/Local" 59 | TYPO3_CONTEXT="Production/Staging" 60 | 61 | This enviromental variable is read out in [setup.typoscript](https://github.com/fgeierst/typo3-vite-demo/blob/master/packages/typo3_vite_demo/Configuration/TypoScript/setup.typoscript#L177) and determines if TYPO3 loads CSS/JS from Vite's local dev server at port 5173 — or the optimized production build assets from _Ressources/Public/Vite/_. 62 | 63 | The latter filenames are hashed, therefore a UserFunction [InsertViteAssets.php](https://github.com/fgeierst/typo3-vite-demo/blob/3ad1dfef12eeee76e5bd646ea1b72b7705304a30/packages/typo3_vite_demo/Classes/UserFunctions/InsertViteAssets.php) parses _manifest.json_ (generated by Vite) to get the correct names. 64 | -------------------------------------------------------------------------------- /public/typo3conf/LocalConfiguration.php: -------------------------------------------------------------------------------- 1 | [ 4 | 'debug' => false, 5 | 'explicitADmode' => 'explicitAllow', 6 | 'installToolPassword' => '$argon2i$v=19$m=65536,t=16,p=1$dVh2Wng4S1YuMlRQVy5aSg$Erxk01rQYZ52LYLG7IKhUaZFWGinO0V3rtjDAuCHuBw', 7 | 'passwordHashing' => [ 8 | 'className' => 'TYPO3\\CMS\\Core\\Crypto\\PasswordHashing\\Argon2iPasswordHash', 9 | 'options' => [], 10 | ], 11 | ], 12 | 'DB' => [ 13 | 'Connections' => [ 14 | 'Default' => [ 15 | 'charset' => 'utf8', 16 | 'driver' => 'mysqli', 17 | ], 18 | ], 19 | ], 20 | 'EXTENSIONS' => [ 21 | 'backend' => [ 22 | 'backendFavicon' => '', 23 | 'backendLogo' => '', 24 | 'loginBackgroundImage' => '', 25 | 'loginFootnote' => '', 26 | 'loginHighlightColor' => '', 27 | 'loginLogo' => '', 28 | 'loginLogoAlt' => '', 29 | ], 30 | 'extensionmanager' => [ 31 | 'automaticInstallation' => '1', 32 | 'offlineMode' => '0', 33 | ], 34 | ], 35 | 'FE' => [ 36 | 'debug' => false, 37 | 'disableNoCacheParameter' => true, 38 | 'passwordHashing' => [ 39 | 'className' => 'TYPO3\\CMS\\Core\\Crypto\\PasswordHashing\\Argon2iPasswordHash', 40 | 'options' => [], 41 | ], 42 | ], 43 | 'GFX' => [ 44 | 'processor' => 'GraphicsMagick', 45 | 'processor_allowTemporaryMasksAsPng' => false, 46 | 'processor_colorspace' => 'RGB', 47 | 'processor_effects' => false, 48 | 'processor_enabled' => true, 49 | 'processor_path' => '/usr/bin/', 50 | 'processor_path_lzw' => '/usr/bin/', 51 | ], 52 | 'LOG' => [ 53 | 'TYPO3' => [ 54 | 'CMS' => [ 55 | 'deprecations' => [ 56 | 'writerConfiguration' => [ 57 | 'notice' => [ 58 | 'TYPO3\CMS\Core\Log\Writer\FileWriter' => [ 59 | 'disabled' => true, 60 | ], 61 | ], 62 | ], 63 | ], 64 | ], 65 | ], 66 | ], 67 | 'MAIL' => [ 68 | 'transport' => 'sendmail', 69 | 'transport_sendmail_command' => '/usr/local/bin/mailhog sendmail test@example.org --smtp-addr 127.0.0.1:1025', 70 | 'transport_smtp_encrypt' => '', 71 | 'transport_smtp_password' => '', 72 | 'transport_smtp_server' => '', 73 | 'transport_smtp_username' => '', 74 | ], 75 | 'SYS' => [ 76 | 'caching' => [ 77 | 'cacheConfigurations' => [ 78 | 'hash' => [ 79 | 'backend' => 'TYPO3\\CMS\\Core\\Cache\\Backend\\Typo3DatabaseBackend', 80 | ], 81 | 'imagesizes' => [ 82 | 'backend' => 'TYPO3\\CMS\\Core\\Cache\\Backend\\Typo3DatabaseBackend', 83 | 'options' => [ 84 | 'compression' => true, 85 | ], 86 | ], 87 | 'pages' => [ 88 | 'backend' => 'TYPO3\\CMS\\Core\\Cache\\Backend\\Typo3DatabaseBackend', 89 | 'options' => [ 90 | 'compression' => true, 91 | ], 92 | ], 93 | 'pagesection' => [ 94 | 'backend' => 'TYPO3\\CMS\\Core\\Cache\\Backend\\Typo3DatabaseBackend', 95 | 'options' => [ 96 | 'compression' => true, 97 | ], 98 | ], 99 | 'rootline' => [ 100 | 'backend' => 'TYPO3\\CMS\\Core\\Cache\\Backend\\Typo3DatabaseBackend', 101 | 'options' => [ 102 | 'compression' => true, 103 | ], 104 | ], 105 | ], 106 | ], 107 | 'devIPmask' => '', 108 | 'displayErrors' => 0, 109 | 'encryptionKey' => '31f4d5949e6677049d31b681c50f5f23cc392e56327b8596370f9ab315fb287b56ee6500d154c9b0d5f54035104d43c3', 110 | 'exceptionalErrors' => 4096, 111 | 'features' => [ 112 | 'unifiedPageTranslationHandling' => true, 113 | 'yamlImportsFollowDeclarationOrder' => true, 114 | ], 115 | 'sitename' => 'TYPO3 Vite Demo', 116 | ], 117 | ]; 118 | -------------------------------------------------------------------------------- /packages/typo3_vite_demo/Configuration/TypoScript/setup.typoscript: -------------------------------------------------------------------------------- 1 | ###################### 2 | #### DEPENDENCIES #### 3 | ###################### 4 | @import 'EXT:fluid_styled_content/Configuration/TypoScript/setup.typoscript' 5 | @import 'EXT:seo/Configuration/TypoScript/XmlSitemap/setup.typoscript' 6 | 7 | 8 | ################ 9 | #### HELPER #### 10 | ################ 11 | @import 'EXT:typo3_vite_demo/Configuration/TypoScript/Helper/DynamicContent.typoscript' 12 | 13 | 14 | ############## 15 | #### PAGE #### 16 | ############## 17 | page = PAGE 18 | page { 19 | typeNum = 0 20 | shortcutIcon = EXT:typo3_vite_demo/Resources/Public/Icons/favicon.svg 21 | 22 | 10 = FLUIDTEMPLATE 23 | 10 { 24 | # Template names will be generated automatically by converting the applied 25 | # backend_layout, there is no explicit mapping necessary anymore. 26 | # 27 | # BackendLayout Key 28 | # subnavigation_right_2_columns -> SubnavigationRight2Columns.html 29 | # 30 | # Backend Record 31 | # uid: 1 -> 1.html 32 | # 33 | # Database Entry 34 | # value: -1 -> None.html 35 | # value: pagets__subnavigation_right_2_columns -> SubnavigationRight2Columns.html 36 | templateName = TEXT 37 | templateName { 38 | cObject = TEXT 39 | cObject { 40 | data = pagelayout 41 | required = 1 42 | case = uppercamelcase 43 | split { 44 | token = pagets__ 45 | cObjNum = 1 46 | 1.current = 1 47 | } 48 | } 49 | ifEmpty = Default 50 | } 51 | templateRootPaths { 52 | 0 = EXT:typo3_vite_demo/Resources/Private/Templates/Page/ 53 | 1 = {$page.fluidtemplate.templateRootPath} 54 | } 55 | partialRootPaths { 56 | 0 = EXT:typo3_vite_demo/Resources/Private/Partials/Page/ 57 | 1 = {$page.fluidtemplate.partialRootPath} 58 | } 59 | layoutRootPaths { 60 | 0 = EXT:typo3_vite_demo/Resources/Private/Layouts/Page/ 61 | 1 = {$page.fluidtemplate.layoutRootPath} 62 | } 63 | dataProcessing { 64 | 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor 65 | 10 { 66 | references.fieldName = media 67 | } 68 | 20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor 69 | 20 { 70 | levels = 2 71 | includeSpacer = 1 72 | as = mainnavigation 73 | } 74 | } 75 | } 76 | 77 | meta { 78 | viewport = {$page.meta.viewport} 79 | robots = {$page.meta.robots} 80 | apple-mobile-web-app-capable = {$page.meta.apple-mobile-web-app-capable} 81 | description = {$page.meta.description} 82 | description { 83 | override.field = description 84 | } 85 | author = {$page.meta.author} 86 | author { 87 | override.field = author 88 | } 89 | keywords = {$page.meta.keywords} 90 | keywords { 91 | override.field = keywords 92 | } 93 | X-UA-Compatible = {$page.meta.compatible} 94 | X-UA-Compatible { 95 | attribute = http-equiv 96 | } 97 | 98 | # OpenGraph Tags 99 | og:title { 100 | attribute = property 101 | field = title 102 | } 103 | og:site_name { 104 | attribute = property 105 | data = TSFE:tmpl|setup|sitetitle 106 | } 107 | og:description = {$page.meta.description} 108 | og:description { 109 | attribute = property 110 | field = description 111 | } 112 | og:image { 113 | attribute = property 114 | stdWrap.cObject = FILES 115 | stdWrap.cObject { 116 | references { 117 | data = levelfield:-1, media, slide 118 | } 119 | maxItems = 1 120 | renderObj = COA 121 | renderObj { 122 | 10 = IMG_RESOURCE 123 | 10 { 124 | file { 125 | import.data = file:current:uid 126 | treatIdAsReference = 1 127 | width = 1280c 128 | height = 720c 129 | } 130 | stdWrap { 131 | typolink { 132 | parameter.data = TSFE:lastImgResourceInfo|3 133 | returnLast = url 134 | forceAbsoluteUrl = 1 135 | } 136 | } 137 | } 138 | } 139 | } 140 | } 141 | } 142 | 143 | includeCSSLibs { 144 | 145 | } 146 | 147 | includeCSS { 148 | 149 | } 150 | 151 | includeJSLibs { 152 | 153 | } 154 | 155 | includeJS { 156 | 157 | } 158 | 159 | includeJSFooterlibs { 160 | 161 | } 162 | 163 | includeJSFooter { 164 | 165 | } 166 | } 167 | 168 | # In development mode, JS and CSS are injected from the Vite dev server. 169 | [applicationContext == "Development/Local"] 170 | page.headerData { 171 | 10 = TEXT 172 | 10.value = 173 | 20 = TEXT 174 | 20.value = 175 | } 176 | [END] 177 | 178 | # In production mode read the hashed JS and CSS file names from Vite generated manifest.json. 179 | [applicationContext == "Production/Staging"] 180 | page.headerData { 181 | 10 = USER_INT 182 | 10 { 183 | userFunc = FlorianGeierstanger\Typo3ViteDemo\UserFunctions\InsertViteAssets->getScriptTags 184 | } 185 | } 186 | [END] 187 | 188 | ################ 189 | #### CONFIG #### 190 | ################ 191 | config { 192 | absRefPrefix = auto 193 | no_cache = {$config.no_cache} 194 | uniqueLinkVars = 1 195 | pageTitleFirst = 1 196 | linkVars = L 197 | prefixLocalAnchors = {$config.prefixLocalAnchors} 198 | renderCharset = utf-8 199 | metaCharset = utf-8 200 | doctype = html5 201 | removeDefaultJS = {$config.removeDefaultJS} 202 | inlineStyle2TempFile = 1 203 | admPanel = {$config.admPanel} 204 | debug = 0 205 | cache_period = 86400 206 | sendCacheHeaders = {$config.sendCacheHeaders} 207 | intTarget = 208 | extTarget = 209 | disablePrefixComment = 1 210 | index_enable = 1 211 | index_externals = 1 212 | index_metatags = 1 213 | headerComment = {$config.headerComment} 214 | 215 | // Disable Image Upscaling 216 | noScaleUp = 1 217 | 218 | // Compression and Concatenation of CSS and JS Files 219 | compressJs = 0 220 | compressCss = 0 221 | concatenateJs = 0 222 | concatenateCss = 0 223 | } 224 | -------------------------------------------------------------------------------- /.ddev/config.yaml: -------------------------------------------------------------------------------- 1 | name: typo3-vite-demo 2 | type: typo3 3 | docroot: public 4 | php_version: "8.1" 5 | webserver_type: nginx-fpm 6 | router_http_port: "80" 7 | router_https_port: "443" 8 | xdebug_enabled: false 9 | additional_hostnames: [] 10 | additional_fqdns: [] 11 | database: 12 | type: mariadb 13 | version: "10.3" 14 | nfs_mount_enabled: false 15 | mutagen_enabled: true 16 | use_dns_when_possible: true 17 | composer_version: "2" 18 | nodejs_version: "18" 19 | #web_environment: 20 | # - TYPO3_CONTEXT=Development/Local 21 | # - TYPO3_CONTEXT=Production/Staging 22 | hooks: 23 | post-start: 24 | - exec: .ddev/commands/web/vite-serve 25 | 26 | # Key features of ddev's config.yaml: 27 | 28 | # name: # Name of the project, automatically provides 29 | # http://projectname.ddev.site and https://projectname.ddev.site 30 | 31 | # type: # drupal6/7/8, backdrop, typo3, wordpress, php 32 | 33 | # docroot: # Relative path to the directory containing index.php. 34 | 35 | # php_version: "7.4" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1" 36 | 37 | # You can explicitly specify the webimage but this 38 | # is not recommended, as the images are often closely tied to ddev's' behavior, 39 | # so this can break upgrades. 40 | 41 | # webimage: # nginx/php docker image. 42 | 43 | # database: 44 | # type: # mysql, mariadb 45 | # version: # database version, like "10.3" or "8.0" 46 | # Note that mariadb_version or mysql_version from v1.18 and earlier 47 | # will automatically be converted to this notation with just a "ddev config --auto" 48 | 49 | # router_http_port: # Port to be used for http (defaults to port 80) 50 | # router_https_port: # Port for https (defaults to 443) 51 | 52 | # xdebug_enabled: false # Set to true to enable xdebug and "ddev start" or "ddev restart" 53 | # Note that for most people the commands 54 | # "ddev xdebug" to enable xdebug and "ddev xdebug off" to disable it work better, 55 | # as leaving xdebug enabled all the time is a big performance hit. 56 | 57 | # xhprof_enabled: false # Set to true to enable xhprof and "ddev start" or "ddev restart" 58 | # Note that for most people the commands 59 | # "ddev xhprof" to enable xhprof and "ddev xhprof off" to disable it work better, 60 | # as leaving xhprof enabled all the time is a big performance hit. 61 | 62 | # webserver_type: nginx-fpm # or apache-fpm 63 | 64 | # timezone: Europe/Berlin 65 | # This is the timezone used in the containers and by PHP; 66 | # it can be set to any valid timezone, 67 | # see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 68 | # For example Europe/Dublin or MST7MDT 69 | 70 | # composer_root: 71 | # Relative path to the composer root directory from the project root. This is 72 | # the directory which contains the composer.json and where all Composer related 73 | # commands are executed. 74 | 75 | # composer_version: "2" 76 | # if composer_version:"2" it will use the most recent composer v2 77 | # It can also be set to "1", to get most recent composer v1 78 | # or "" for the default v2 created at release time. 79 | # It can be set to any existing specific composer version. 80 | # After first project 'ddev start' this will not be updated until it changes 81 | 82 | # nodejs_version: "16" 83 | # change from the default system Node.js version to another supported version, like 12, 14, 17, 18. 84 | # Note that you can use 'ddev nvm' or nvm inside the web container to provide nearly any 85 | # Node.js version, including v6, etc. 86 | 87 | # additional_hostnames: 88 | # - somename 89 | # - someothername 90 | # would provide http and https URLs for "somename.ddev.site" 91 | # and "someothername.ddev.site". 92 | 93 | # additional_fqdns: 94 | # - example.com 95 | # - sub1.example.com 96 | # would provide http and https URLs for "example.com" and "sub1.example.com" 97 | # Please take care with this because it can cause great confusion. 98 | 99 | # upload_dir: custom/upload/dir 100 | # would set the destination path for ddev import-files to /custom/upload/dir 101 | 102 | # working_dir: 103 | # web: /var/www/html 104 | # db: /home 105 | # would set the default working directory for the web and db services. 106 | # These values specify the destination directory for ddev ssh and the 107 | # directory in which commands passed into ddev exec are run. 108 | 109 | # omit_containers: [db, dba, ddev-ssh-agent] 110 | # Currently only these containers are supported. Some containers can also be 111 | # omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit 112 | # the "db" container, several standard features of ddev that access the 113 | # database container will be unusable. In the global configuration it is also 114 | # possible to omit ddev-router, but not here. 115 | 116 | # nfs_mount_enabled: false 117 | # Great performance improvement but requires host configuration first. 118 | # See https://ddev.readthedocs.io/en/stable/users/performance/#using-nfs-to-mount-the-project-into-the-container 119 | 120 | # mutagen_enabled: false 121 | # Experimental performance improvement using mutagen asynchronous updates. 122 | # See https://ddev.readthedocs.io/en/latest/users/performance/#using-mutagen 123 | 124 | # fail_on_hook_fail: False 125 | # Decide whether 'ddev start' should be interrupted by a failing hook 126 | 127 | # host_https_port: "59002" 128 | # The host port binding for https can be explicitly specified. It is 129 | # dynamic unless otherwise specified. 130 | # This is not used by most people, most people use the *router* instead 131 | # of the localhost port. 132 | 133 | # host_webserver_port: "59001" 134 | # The host port binding for the ddev-webserver can be explicitly specified. It is 135 | # dynamic unless otherwise specified. 136 | # This is not used by most people, most people use the *router* instead 137 | # of the localhost port. 138 | 139 | # host_db_port: "59002" 140 | # The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic 141 | # unless explicitly specified. 142 | 143 | # phpmyadmin_port: "8036" 144 | # phpmyadmin_https_port: "8037" 145 | # The PHPMyAdmin ports can be changed from the default 8036 and 8037 146 | 147 | # host_phpmyadmin_port: "8036" 148 | # The phpmyadmin (dba) port is not normally bound on the host at all, instead being routed 149 | # through ddev-router, but it can be specified and bound. 150 | 151 | # mailhog_port: "8025" 152 | # mailhog_https_port: "8026" 153 | # The MailHog ports can be changed from the default 8025 and 8026 154 | 155 | # host_mailhog_port: "8025" 156 | # The mailhog port is not normally bound on the host at all, instead being routed 157 | # through ddev-router, but it can be bound directly to localhost if specified here. 158 | 159 | # webimage_extra_packages: [php7.4-tidy, php-bcmath] 160 | # Extra Debian packages that are needed in the webimage can be added here 161 | 162 | # dbimage_extra_packages: [telnet,netcat] 163 | # Extra Debian packages that are needed in the dbimage can be added here 164 | 165 | # use_dns_when_possible: true 166 | # If the host has internet access and the domain configured can 167 | # successfully be looked up, DNS will be used for hostname resolution 168 | # instead of editing /etc/hosts 169 | # Defaults to true 170 | 171 | # project_tld: ddev.site 172 | # The top-level domain used for project URLs 173 | # The default "ddev.site" allows DNS lookup via a wildcard 174 | # If you prefer you can change this to "ddev.local" to preserve 175 | # pre-v1.9 behavior. 176 | 177 | # ngrok_args: --basic-auth username:pass1234 178 | # Provide extra flags to the "ngrok http" command, see 179 | # https://ngrok.com/docs#http or run "ngrok http -h" 180 | 181 | # disable_settings_management: false 182 | # If true, ddev will not create CMS-specific settings files like 183 | # Drupal's settings.php/settings.ddev.php or TYPO3's AdditionalConfiguration.php 184 | # In this case the user must provide all such settings. 185 | 186 | # You can inject environment variables into the web container with: 187 | # web_environment: 188 | # - SOMEENV=somevalue 189 | # - SOMEOTHERENV=someothervalue 190 | 191 | # no_project_mount: false 192 | # (Experimental) If true, ddev will not mount the project into the web container; 193 | # the user is responsible for mounting it manually or via a script. 194 | # This is to enable experimentation with alternate file mounting strategies. 195 | # For advanced users only! 196 | 197 | # bind_all_interfaces: false 198 | # If true, host ports will be bound on all network interfaces, 199 | # not just the localhost interface. This means that ports 200 | # will be available on the local network if the host firewall 201 | # allows it. 202 | 203 | # Many ddev commands can be extended to run tasks before or after the 204 | # ddev command is executed, for example "post-start", "post-import-db", 205 | # "pre-composer", "post-composer" 206 | # See https://ddev.readthedocs.io/en/stable/users/extending-commands/ for more 207 | # information on the commands that can be extended and the tasks you can define 208 | # for them. Example: 209 | #hooks: 210 | # post-start: 211 | # - exec: composer install -d /var/www/html 212 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | devDependencies: 4 | '@vitejs/plugin-vue': 5 | specifier: ^4.2.1 6 | version: 4.2.1(vite@4.3.3)(vue@3.2.47) 7 | sass: 8 | specifier: ^1.62.1 9 | version: 1.62.1 10 | vite: 11 | specifier: ^4.3.3 12 | version: 4.3.3(sass@1.62.1) 13 | vue: 14 | specifier: ^3.2.47 15 | version: 3.2.47 16 | 17 | packages: 18 | 19 | /@babel/helper-string-parser@7.19.4: 20 | resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} 21 | engines: {node: '>=6.9.0'} 22 | dev: true 23 | 24 | /@babel/helper-validator-identifier@7.19.1: 25 | resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} 26 | engines: {node: '>=6.9.0'} 27 | dev: true 28 | 29 | /@babel/parser@7.21.4: 30 | resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} 31 | engines: {node: '>=6.0.0'} 32 | hasBin: true 33 | dependencies: 34 | '@babel/types': 7.21.4 35 | dev: true 36 | 37 | /@babel/types@7.21.4: 38 | resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} 39 | engines: {node: '>=6.9.0'} 40 | dependencies: 41 | '@babel/helper-string-parser': 7.19.4 42 | '@babel/helper-validator-identifier': 7.19.1 43 | to-fast-properties: 2.0.0 44 | dev: true 45 | 46 | /@esbuild/android-arm64@0.17.18: 47 | resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} 48 | engines: {node: '>=12'} 49 | cpu: [arm64] 50 | os: [android] 51 | requiresBuild: true 52 | dev: true 53 | optional: true 54 | 55 | /@esbuild/android-arm@0.17.18: 56 | resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} 57 | engines: {node: '>=12'} 58 | cpu: [arm] 59 | os: [android] 60 | requiresBuild: true 61 | dev: true 62 | optional: true 63 | 64 | /@esbuild/android-x64@0.17.18: 65 | resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} 66 | engines: {node: '>=12'} 67 | cpu: [x64] 68 | os: [android] 69 | requiresBuild: true 70 | dev: true 71 | optional: true 72 | 73 | /@esbuild/darwin-arm64@0.17.18: 74 | resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} 75 | engines: {node: '>=12'} 76 | cpu: [arm64] 77 | os: [darwin] 78 | requiresBuild: true 79 | dev: true 80 | optional: true 81 | 82 | /@esbuild/darwin-x64@0.17.18: 83 | resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} 84 | engines: {node: '>=12'} 85 | cpu: [x64] 86 | os: [darwin] 87 | requiresBuild: true 88 | dev: true 89 | optional: true 90 | 91 | /@esbuild/freebsd-arm64@0.17.18: 92 | resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} 93 | engines: {node: '>=12'} 94 | cpu: [arm64] 95 | os: [freebsd] 96 | requiresBuild: true 97 | dev: true 98 | optional: true 99 | 100 | /@esbuild/freebsd-x64@0.17.18: 101 | resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} 102 | engines: {node: '>=12'} 103 | cpu: [x64] 104 | os: [freebsd] 105 | requiresBuild: true 106 | dev: true 107 | optional: true 108 | 109 | /@esbuild/linux-arm64@0.17.18: 110 | resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} 111 | engines: {node: '>=12'} 112 | cpu: [arm64] 113 | os: [linux] 114 | requiresBuild: true 115 | dev: true 116 | optional: true 117 | 118 | /@esbuild/linux-arm@0.17.18: 119 | resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} 120 | engines: {node: '>=12'} 121 | cpu: [arm] 122 | os: [linux] 123 | requiresBuild: true 124 | dev: true 125 | optional: true 126 | 127 | /@esbuild/linux-ia32@0.17.18: 128 | resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} 129 | engines: {node: '>=12'} 130 | cpu: [ia32] 131 | os: [linux] 132 | requiresBuild: true 133 | dev: true 134 | optional: true 135 | 136 | /@esbuild/linux-loong64@0.17.18: 137 | resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} 138 | engines: {node: '>=12'} 139 | cpu: [loong64] 140 | os: [linux] 141 | requiresBuild: true 142 | dev: true 143 | optional: true 144 | 145 | /@esbuild/linux-mips64el@0.17.18: 146 | resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} 147 | engines: {node: '>=12'} 148 | cpu: [mips64el] 149 | os: [linux] 150 | requiresBuild: true 151 | dev: true 152 | optional: true 153 | 154 | /@esbuild/linux-ppc64@0.17.18: 155 | resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} 156 | engines: {node: '>=12'} 157 | cpu: [ppc64] 158 | os: [linux] 159 | requiresBuild: true 160 | dev: true 161 | optional: true 162 | 163 | /@esbuild/linux-riscv64@0.17.18: 164 | resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} 165 | engines: {node: '>=12'} 166 | cpu: [riscv64] 167 | os: [linux] 168 | requiresBuild: true 169 | dev: true 170 | optional: true 171 | 172 | /@esbuild/linux-s390x@0.17.18: 173 | resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} 174 | engines: {node: '>=12'} 175 | cpu: [s390x] 176 | os: [linux] 177 | requiresBuild: true 178 | dev: true 179 | optional: true 180 | 181 | /@esbuild/linux-x64@0.17.18: 182 | resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} 183 | engines: {node: '>=12'} 184 | cpu: [x64] 185 | os: [linux] 186 | requiresBuild: true 187 | dev: true 188 | optional: true 189 | 190 | /@esbuild/netbsd-x64@0.17.18: 191 | resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} 192 | engines: {node: '>=12'} 193 | cpu: [x64] 194 | os: [netbsd] 195 | requiresBuild: true 196 | dev: true 197 | optional: true 198 | 199 | /@esbuild/openbsd-x64@0.17.18: 200 | resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} 201 | engines: {node: '>=12'} 202 | cpu: [x64] 203 | os: [openbsd] 204 | requiresBuild: true 205 | dev: true 206 | optional: true 207 | 208 | /@esbuild/sunos-x64@0.17.18: 209 | resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} 210 | engines: {node: '>=12'} 211 | cpu: [x64] 212 | os: [sunos] 213 | requiresBuild: true 214 | dev: true 215 | optional: true 216 | 217 | /@esbuild/win32-arm64@0.17.18: 218 | resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} 219 | engines: {node: '>=12'} 220 | cpu: [arm64] 221 | os: [win32] 222 | requiresBuild: true 223 | dev: true 224 | optional: true 225 | 226 | /@esbuild/win32-ia32@0.17.18: 227 | resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} 228 | engines: {node: '>=12'} 229 | cpu: [ia32] 230 | os: [win32] 231 | requiresBuild: true 232 | dev: true 233 | optional: true 234 | 235 | /@esbuild/win32-x64@0.17.18: 236 | resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} 237 | engines: {node: '>=12'} 238 | cpu: [x64] 239 | os: [win32] 240 | requiresBuild: true 241 | dev: true 242 | optional: true 243 | 244 | /@vitejs/plugin-vue@4.2.1(vite@4.3.3)(vue@3.2.47): 245 | resolution: {integrity: sha512-ZTZjzo7bmxTRTkb8GSTwkPOYDIP7pwuyV+RV53c9PYUouwcbkIZIvWvNWlX2b1dYZqtOv7D6iUAnJLVNGcLrSw==} 246 | engines: {node: ^14.18.0 || >=16.0.0} 247 | peerDependencies: 248 | vite: ^4.0.0 249 | vue: ^3.2.25 250 | dependencies: 251 | vite: 4.3.3(sass@1.62.1) 252 | vue: 3.2.47 253 | dev: true 254 | 255 | /@vue/compiler-core@3.2.47: 256 | resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} 257 | dependencies: 258 | '@babel/parser': 7.21.4 259 | '@vue/shared': 3.2.47 260 | estree-walker: 2.0.2 261 | source-map: 0.6.1 262 | dev: true 263 | 264 | /@vue/compiler-dom@3.2.47: 265 | resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} 266 | dependencies: 267 | '@vue/compiler-core': 3.2.47 268 | '@vue/shared': 3.2.47 269 | dev: true 270 | 271 | /@vue/compiler-sfc@3.2.47: 272 | resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} 273 | dependencies: 274 | '@babel/parser': 7.21.4 275 | '@vue/compiler-core': 3.2.47 276 | '@vue/compiler-dom': 3.2.47 277 | '@vue/compiler-ssr': 3.2.47 278 | '@vue/reactivity-transform': 3.2.47 279 | '@vue/shared': 3.2.47 280 | estree-walker: 2.0.2 281 | magic-string: 0.25.9 282 | postcss: 8.4.23 283 | source-map: 0.6.1 284 | dev: true 285 | 286 | /@vue/compiler-ssr@3.2.47: 287 | resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} 288 | dependencies: 289 | '@vue/compiler-dom': 3.2.47 290 | '@vue/shared': 3.2.47 291 | dev: true 292 | 293 | /@vue/reactivity-transform@3.2.47: 294 | resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} 295 | dependencies: 296 | '@babel/parser': 7.21.4 297 | '@vue/compiler-core': 3.2.47 298 | '@vue/shared': 3.2.47 299 | estree-walker: 2.0.2 300 | magic-string: 0.25.9 301 | dev: true 302 | 303 | /@vue/reactivity@3.2.47: 304 | resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} 305 | dependencies: 306 | '@vue/shared': 3.2.47 307 | dev: true 308 | 309 | /@vue/runtime-core@3.2.47: 310 | resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} 311 | dependencies: 312 | '@vue/reactivity': 3.2.47 313 | '@vue/shared': 3.2.47 314 | dev: true 315 | 316 | /@vue/runtime-dom@3.2.47: 317 | resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} 318 | dependencies: 319 | '@vue/runtime-core': 3.2.47 320 | '@vue/shared': 3.2.47 321 | csstype: 2.6.21 322 | dev: true 323 | 324 | /@vue/server-renderer@3.2.47(vue@3.2.47): 325 | resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} 326 | peerDependencies: 327 | vue: 3.2.47 328 | dependencies: 329 | '@vue/compiler-ssr': 3.2.47 330 | '@vue/shared': 3.2.47 331 | vue: 3.2.47 332 | dev: true 333 | 334 | /@vue/shared@3.2.47: 335 | resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} 336 | dev: true 337 | 338 | /anymatch@3.1.3: 339 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 340 | engines: {node: '>= 8'} 341 | dependencies: 342 | normalize-path: 3.0.0 343 | picomatch: 2.3.1 344 | dev: true 345 | 346 | /binary-extensions@2.2.0: 347 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 348 | engines: {node: '>=8'} 349 | dev: true 350 | 351 | /braces@3.0.2: 352 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 353 | engines: {node: '>=8'} 354 | dependencies: 355 | fill-range: 7.0.1 356 | dev: true 357 | 358 | /chokidar@3.5.3: 359 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 360 | engines: {node: '>= 8.10.0'} 361 | dependencies: 362 | anymatch: 3.1.3 363 | braces: 3.0.2 364 | glob-parent: 5.1.2 365 | is-binary-path: 2.1.0 366 | is-glob: 4.0.3 367 | normalize-path: 3.0.0 368 | readdirp: 3.6.0 369 | optionalDependencies: 370 | fsevents: 2.3.2 371 | dev: true 372 | 373 | /csstype@2.6.21: 374 | resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} 375 | dev: true 376 | 377 | /esbuild@0.17.18: 378 | resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} 379 | engines: {node: '>=12'} 380 | hasBin: true 381 | requiresBuild: true 382 | optionalDependencies: 383 | '@esbuild/android-arm': 0.17.18 384 | '@esbuild/android-arm64': 0.17.18 385 | '@esbuild/android-x64': 0.17.18 386 | '@esbuild/darwin-arm64': 0.17.18 387 | '@esbuild/darwin-x64': 0.17.18 388 | '@esbuild/freebsd-arm64': 0.17.18 389 | '@esbuild/freebsd-x64': 0.17.18 390 | '@esbuild/linux-arm': 0.17.18 391 | '@esbuild/linux-arm64': 0.17.18 392 | '@esbuild/linux-ia32': 0.17.18 393 | '@esbuild/linux-loong64': 0.17.18 394 | '@esbuild/linux-mips64el': 0.17.18 395 | '@esbuild/linux-ppc64': 0.17.18 396 | '@esbuild/linux-riscv64': 0.17.18 397 | '@esbuild/linux-s390x': 0.17.18 398 | '@esbuild/linux-x64': 0.17.18 399 | '@esbuild/netbsd-x64': 0.17.18 400 | '@esbuild/openbsd-x64': 0.17.18 401 | '@esbuild/sunos-x64': 0.17.18 402 | '@esbuild/win32-arm64': 0.17.18 403 | '@esbuild/win32-ia32': 0.17.18 404 | '@esbuild/win32-x64': 0.17.18 405 | dev: true 406 | 407 | /estree-walker@2.0.2: 408 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 409 | dev: true 410 | 411 | /fill-range@7.0.1: 412 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 413 | engines: {node: '>=8'} 414 | dependencies: 415 | to-regex-range: 5.0.1 416 | dev: true 417 | 418 | /fsevents@2.3.2: 419 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 420 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 421 | os: [darwin] 422 | requiresBuild: true 423 | dev: true 424 | optional: true 425 | 426 | /glob-parent@5.1.2: 427 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 428 | engines: {node: '>= 6'} 429 | dependencies: 430 | is-glob: 4.0.3 431 | dev: true 432 | 433 | /immutable@4.3.0: 434 | resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} 435 | dev: true 436 | 437 | /is-binary-path@2.1.0: 438 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 439 | engines: {node: '>=8'} 440 | dependencies: 441 | binary-extensions: 2.2.0 442 | dev: true 443 | 444 | /is-extglob@2.1.1: 445 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 446 | engines: {node: '>=0.10.0'} 447 | dev: true 448 | 449 | /is-glob@4.0.3: 450 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 451 | engines: {node: '>=0.10.0'} 452 | dependencies: 453 | is-extglob: 2.1.1 454 | dev: true 455 | 456 | /is-number@7.0.0: 457 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 458 | engines: {node: '>=0.12.0'} 459 | dev: true 460 | 461 | /magic-string@0.25.9: 462 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 463 | dependencies: 464 | sourcemap-codec: 1.4.8 465 | dev: true 466 | 467 | /nanoid@3.3.6: 468 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 469 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 470 | hasBin: true 471 | dev: true 472 | 473 | /normalize-path@3.0.0: 474 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 475 | engines: {node: '>=0.10.0'} 476 | dev: true 477 | 478 | /picocolors@1.0.0: 479 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 480 | dev: true 481 | 482 | /picomatch@2.3.1: 483 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 484 | engines: {node: '>=8.6'} 485 | dev: true 486 | 487 | /postcss@8.4.23: 488 | resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} 489 | engines: {node: ^10 || ^12 || >=14} 490 | dependencies: 491 | nanoid: 3.3.6 492 | picocolors: 1.0.0 493 | source-map-js: 1.0.2 494 | dev: true 495 | 496 | /readdirp@3.6.0: 497 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 498 | engines: {node: '>=8.10.0'} 499 | dependencies: 500 | picomatch: 2.3.1 501 | dev: true 502 | 503 | /rollup@3.21.0: 504 | resolution: {integrity: sha512-ANPhVcyeHvYdQMUyCbczy33nbLzI7RzrBje4uvNiTDJGIMtlKoOStmympwr9OtS1LZxiDmE2wvxHyVhoLtf1KQ==} 505 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 506 | hasBin: true 507 | optionalDependencies: 508 | fsevents: 2.3.2 509 | dev: true 510 | 511 | /sass@1.62.1: 512 | resolution: {integrity: sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==} 513 | engines: {node: '>=14.0.0'} 514 | hasBin: true 515 | dependencies: 516 | chokidar: 3.5.3 517 | immutable: 4.3.0 518 | source-map-js: 1.0.2 519 | dev: true 520 | 521 | /source-map-js@1.0.2: 522 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 523 | engines: {node: '>=0.10.0'} 524 | dev: true 525 | 526 | /source-map@0.6.1: 527 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 528 | engines: {node: '>=0.10.0'} 529 | dev: true 530 | 531 | /sourcemap-codec@1.4.8: 532 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 533 | deprecated: Please use @jridgewell/sourcemap-codec instead 534 | dev: true 535 | 536 | /to-fast-properties@2.0.0: 537 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 538 | engines: {node: '>=4'} 539 | dev: true 540 | 541 | /to-regex-range@5.0.1: 542 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 543 | engines: {node: '>=8.0'} 544 | dependencies: 545 | is-number: 7.0.0 546 | dev: true 547 | 548 | /vite@4.3.3(sass@1.62.1): 549 | resolution: {integrity: sha512-MwFlLBO4udZXd+VBcezo3u8mC77YQk+ik+fbc0GZWGgzfbPP+8Kf0fldhARqvSYmtIWoAJ5BXPClUbMTlqFxrA==} 550 | engines: {node: ^14.18.0 || >=16.0.0} 551 | hasBin: true 552 | peerDependencies: 553 | '@types/node': '>= 14' 554 | less: '*' 555 | sass: '*' 556 | stylus: '*' 557 | sugarss: '*' 558 | terser: ^5.4.0 559 | peerDependenciesMeta: 560 | '@types/node': 561 | optional: true 562 | less: 563 | optional: true 564 | sass: 565 | optional: true 566 | stylus: 567 | optional: true 568 | sugarss: 569 | optional: true 570 | terser: 571 | optional: true 572 | dependencies: 573 | esbuild: 0.17.18 574 | postcss: 8.4.23 575 | rollup: 3.21.0 576 | sass: 1.62.1 577 | optionalDependencies: 578 | fsevents: 2.3.2 579 | dev: true 580 | 581 | /vue@3.2.47: 582 | resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} 583 | dependencies: 584 | '@vue/compiler-dom': 3.2.47 585 | '@vue/compiler-sfc': 3.2.47 586 | '@vue/runtime-dom': 3.2.47 587 | '@vue/server-renderer': 3.2.47(vue@3.2.47) 588 | '@vue/shared': 3.2.47 589 | dev: true 590 | --------------------------------------------------------------------------------