From 42cba4f19ec50d4791f2423b6beb2e550f3df736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Fri, 13 Dec 2024 16:18:45 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=AE=E5=89=8D=E5=BD=A2=E6=88=90=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=8F=AF=E4=BB=A5=E4=BD=BF=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E5=85=A8=E9=87=8F=E6=B8=B2=E6=9F=93=E7=BB=84=E4=BB=B6=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E7=A4=BA=E4=BE=8B=E4=BB=A3=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 74 +++ .gitignore | 1029 ++++++++++++++++++++++++++++++++++++++ .prettierignore | 3 + .prettierrc | 12 + README.md | 50 ++ bun.lockb | Bin 0 -> 143774 bytes eslint.config.js | 25 + index.html | 13 + package.json | 42 ++ postcss.config.cjs | 12 + server.ts | 26 + src/App.tsx | 26 + src/index.css | 27 + src/main.tsx | 8 + src/pages/MainLayout.tsx | 15 + src/vite-env.d.ts | 1 + tsconfig.app.json | 26 + tsconfig.json | 7 + tsconfig.node.json | 24 + vite.config.ts | 7 + 20 files changed, 1427 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package.json create mode 100644 postcss.config.cjs create mode 100644 server.ts create mode 100644 src/App.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/pages/MainLayout.tsx create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..641881e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,74 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 +max_line_length = 100 + +[*.java] +indent_size = 4 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.{yml, yaml}] +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.json] +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.sql] +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.go] +indent_style = space +indent_size = 4 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.py] +indent_style = space +indent_size = 4 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.sh] +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.rs] +indent_size = 4 +indent_style = space +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0253e21 --- /dev/null +++ b/.gitignore @@ -0,0 +1,1029 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + +# RustRover +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work +go.work.sum + +# env file +.env + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Log/OS Files +*.log + +# Android Studio generated files and folders +captures/ +.externalNativeBuild/ +.cxx/ +*.apk +output.json + +# IntelliJ +*.iml +.idea/ +misc.xml +deploymentTargetDropDown.xml +render.experimental.xml + +# Keystore files +*.jks +*.keystore + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Android Profiling +*.hprof + +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps +CMakeUserPresets.json + +# See https://www.dartlang.org/guides/libraries/private-files + +# Files and directories created by pub +.dart_tool/ +.packages +build/ +# If you're building an application, you may want to check-in your pubspec.lock +pubspec.lock + +# Directory created by dartdoc +# If you don't generate documentation locally you can remove this line. +doc/api/ + +# dotenv environment variables file +.env* + +# Avoid committing generated Javascript files: +*.dart.js +*.info.json # Produced by the --dump-info flag. +*.js # When generated by dart2js. Don't specify *.js if your + # project includes source files written in JavaScript. +*.js_ +*.js.deps +*.js.map + +.flutter-plugins +.flutter-plugins-dependencies + +.gradle +**/build/ +!src/**/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Avoid ignore Gradle wrappper properties +!gradle-wrapper.properties + +# Cache of project +.gradletasknamecache + +# Eclipse Gradle plugin generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +# This .gitignore is appropriate for repositories deployed to GitHub Pages and using +# a Gemfile as specified at https://github.com/github/pages-gem#conventional + +# Basic Jekyll gitignores (synchronize to Jekyll.gitignore) +_site/ +.sass-cache/ +.jekyll-cache/ +.jekyll-metadata + +# Additional Ruby/bundler ignore for when you run: bundle install +/vendor + +# Specific ignore for GitHub Pages +# GitHub Pages will always use its own deployed version of pages-gem +# This means GitHub Pages will NOT use your Gemfile.lock and therefore it is +# counterproductive to check this file into the repository. +# Details at https://github.com/github/pages-gem/issues/768 +Gemfile.lock diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..d592b12 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +**/*.md +.env +.env.* diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..ab14e5f --- /dev/null +++ b/.prettierrc @@ -0,0 +1,12 @@ +{ + "bracketSpacing": true, + "bracketSameLine": true, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": true, + "jsxSingleQuote": false, + "trailingComma": "all", + "arrowParens": "always", + "printWidth": 100 +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..74872fd --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react' + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}) +``` diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..c1d33b109afdd9751641e05584ec37f21ecbd7d8 GIT binary patch literal 143774 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 literal 0 HcmV?d00001 diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..67b0f50 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,25 @@ +import js from '@eslint/js'; +import reactHooks from 'eslint-plugin-react-hooks'; +import reactRefresh from 'eslint-plugin-react-refresh'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': 'off', + }, + }, +); diff --git a/index.html b/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..d376351 --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "ssr-prove", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@elysiajs/static": "^1.1.1", + "elysia": "^1.1.26", + "elysia-connect-middleware": "^0.0.3", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.0.2", + "sanitize.css": "^13.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.15.0", + "@types/bun": "^1.1.14", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^9.15.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.14", + "globals": "^15.12.0", + "postcss": "^8.4.49", + "postcss-custom-properties": "^14.0.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-import": "^16.1.0", + "postcss-nesting": "^13.0.1", + "postcss-preset-env": "^10.1.1", + "postcss-url": "^10.1.3", + "typescript": "^5.7.2", + "typescript-eslint": "^8.15.0", + "vite": "^6.0.1" + } +} diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 0000000..792df9d --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,12 @@ +module.exports = { + plugins: { + 'postcss-import': {}, + 'postcss-url': {}, + 'postcss-preset-env': { + stage: 2, + }, + 'postcss-custom-properties': {}, + 'postcss-nesting': {}, + 'postcss-flexbugs-fixes': {}, + }, +}; diff --git a/server.ts b/server.ts new file mode 100644 index 0000000..dbc48dc --- /dev/null +++ b/server.ts @@ -0,0 +1,26 @@ +import Elysia from 'elysia'; +import { connect } from 'elysia-connect-middleware'; +import { createElement } from 'react'; +import { renderToReadableStream } from 'react-dom/server'; +import { createServer } from 'vite'; +import { App } from './src/App'; + +const app = new Elysia(); +const vite = await createServer({ + server: { middlewareMode: true }, + appType: 'custom', +}); +app.use(connect(vite.middlewares)); +app.get('/', async () => { + const app = createElement(App); + const stream = await renderToReadableStream(app, { bootstrapScripts: ['/src/main.tsx'] }); + return new Response(stream, { + headers: { + 'Content-Type': 'text/html', + }, + }); +}); + +app.listen(3000); + +console.log(`Server running at http://${app.server?.hostname}:${app.server?.port}`); diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..99bc758 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,26 @@ +/// Bootstrap scripts +import { StrictMode } from 'react'; +import { Route, Routes, StaticRouter } from 'react-router-dom'; +import { MainLayout } from './pages/MainLayout'; + +export const App = () => { + return ( + + + + + + React SSR App + + + + + + } /> + + + + + + ); +}; diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..0ec520a --- /dev/null +++ b/src/index.css @@ -0,0 +1,27 @@ +@layer lib, base, theme, component, page, custom; + +@import 'sanitize.css' layer(lib); + +@layer base { + :root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + font-size: 62.5%; + + color-scheme: light dark; + color: hsla(0, 0%, 100%, 0.87); + background-color: hsl(0, 0%, 14%); + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + html, + body { + margin: 0; + padding: 0; + } +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..ddfcadd --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,8 @@ +// Boot styles +// import './index.css'; + +// Boot scripts +import { hydrateRoot } from 'react-dom/client'; +import { App } from './App'; + +hydrateRoot(document, ); diff --git a/src/pages/MainLayout.tsx b/src/pages/MainLayout.tsx new file mode 100644 index 0000000..d9ecdcd --- /dev/null +++ b/src/pages/MainLayout.tsx @@ -0,0 +1,15 @@ +import { Outlet } from 'react-router-dom'; +import styles from './MainLayout.module.css'; + +export const MainLayout = () => { + return ( +
+
+

React SSR

+
+
+ +
+
+ ); +}; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..358ca9b --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..db0becc --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..2328e17 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react-swc' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +})