From 48437fed9cfaef2ae98e5917f1d680164659b526 Mon Sep 17 00:00:00 2001 From: Adam <24621027+adoyle0@users.noreply.github.com> Date: Sun, 2 Jul 2023 04:52:35 -0400 Subject: [PATCH] rust --- doordesk-rs/.gitignore | 14 + .../main.scssc | Bin 0 -> 1655 bytes .../main.scssc | Bin 0 -> 1649 bytes doordesk-rs/Cargo.toml | 116 ++++ doordesk-rs/LICENSE | 21 + doordesk-rs/README.md | 58 ++ doordesk-rs/end2end/package-lock.json | 74 +++ doordesk-rs/end2end/package.json | 13 + doordesk-rs/end2end/playwright.config.ts | 107 ++++ doordesk-rs/end2end/tests/example.spec.ts | 9 + doordesk-rs/package.json | 5 + doordesk-rs/pnpm-lock.yaml | 563 ++++++++++++++++++ doordesk-rs/public/about.txt | 6 + doordesk-rs/public/android-chrome-192x192.png | Bin 0 -> 12011 bytes doordesk-rs/public/android-chrome-512x512.png | Bin 0 -> 38637 bytes doordesk-rs/public/apple-touch-icon.png | Bin 0 -> 10677 bytes doordesk-rs/public/favicon-16x16.png | Bin 0 -> 685 bytes doordesk-rs/public/favicon-32x32.png | Bin 0 -> 1500 bytes doordesk-rs/public/favicon.ico | Bin 0 -> 15406 bytes doordesk-rs/public/site.webmanifest | 1 + doordesk-rs/rust-toolchain.toml | 3 + doordesk-rs/src/app.rs | 53 ++ doordesk-rs/src/error_template.rs | 76 +++ doordesk-rs/src/fileserv.rs | 40 ++ doordesk-rs/src/lib.rs | 21 + doordesk-rs/src/main.rs | 43 ++ doordesk-rs/style/main.scss | 4 + doordesk-rs/style/tailwind.css | 37 ++ doordesk-rs/tailwind.config.js | 12 + 29 files changed, 1276 insertions(+) create mode 100644 doordesk-rs/.gitignore create mode 100644 doordesk-rs/.sass-cache/8efb9c9d1efc93d03ff1d34928f1034c581c4284/main.scssc create mode 100644 doordesk-rs/.sass-cache/ef9787e5abb760f339d783fc63e76b78b0e24b62/main.scssc create mode 100644 doordesk-rs/Cargo.toml create mode 100644 doordesk-rs/LICENSE create mode 100644 doordesk-rs/README.md create mode 100644 doordesk-rs/end2end/package-lock.json create mode 100644 doordesk-rs/end2end/package.json create mode 100644 doordesk-rs/end2end/playwright.config.ts create mode 100644 doordesk-rs/end2end/tests/example.spec.ts create mode 100644 doordesk-rs/package.json create mode 100644 doordesk-rs/pnpm-lock.yaml create mode 100644 doordesk-rs/public/about.txt create mode 100644 doordesk-rs/public/android-chrome-192x192.png create mode 100644 doordesk-rs/public/android-chrome-512x512.png create mode 100644 doordesk-rs/public/apple-touch-icon.png create mode 100644 doordesk-rs/public/favicon-16x16.png create mode 100644 doordesk-rs/public/favicon-32x32.png create mode 100644 doordesk-rs/public/favicon.ico create mode 100644 doordesk-rs/public/site.webmanifest create mode 100644 doordesk-rs/rust-toolchain.toml create mode 100644 doordesk-rs/src/app.rs create mode 100644 doordesk-rs/src/error_template.rs create mode 100644 doordesk-rs/src/fileserv.rs create mode 100644 doordesk-rs/src/lib.rs create mode 100644 doordesk-rs/src/main.rs create mode 100644 doordesk-rs/style/main.scss create mode 100644 doordesk-rs/style/tailwind.css create mode 100644 doordesk-rs/tailwind.config.js diff --git a/doordesk-rs/.gitignore b/doordesk-rs/.gitignore new file mode 100644 index 0000000..a1e76e1 --- /dev/null +++ b/doordesk-rs/.gitignore @@ -0,0 +1,14 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +pkg +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# node e2e test tools and outputs +node_modules/ +test-results/ +end2end/playwright-report/ +playwright/.cache/ diff --git a/doordesk-rs/.sass-cache/8efb9c9d1efc93d03ff1d34928f1034c581c4284/main.scssc b/doordesk-rs/.sass-cache/8efb9c9d1efc93d03ff1d34928f1034c581c4284/main.scssc new file mode 100644 index 0000000000000000000000000000000000000000..e6d833c2d68039eab1b5c24f9ef8cd65d23b101d GIT binary patch literal 1655 zcmbVMTW`}a80`Z}FWcxC2)Yf%R0QMJHto0!n+GEVQYC~Ct$5i(@h$9X1*jr7S#o&^fq`@?AH*G z`ztPzG=?H;Ezi2Wn)NP*1f;DaV#yOI@Y4F2G_xI(@(_Fs$3lYe@c2^^gUj_1pqWj+ zBKT~nW;%4os*S*USa8bC>F>&WJhsU~f#&iA6lpCmWShvW+pXg?W4X3Ls<6dwIpvcw z!U`p;bPExzGc}zWu(;e{Afv2=?q)%HTQqRAgXkkvq(Es4+INNYdj83mWS5x*@j(e6 z-LBIeb>7dTcP{*`(Y;~&hOzS)dI=Y@YeHi@q>J8FWIu;JTueptyhk8rZY(4NE61PdMM~)i%(vyDqqDZiiv}JC|5Msx24xDIR>2w9Qpgjd=uMB_ zaSDUha!(4%51K$A9$ zAk`3Zix){q9FzulV+10?9H(%Vw$w!tt7wWFOA+1Q9^GR*^e)?__eF(VW2izJn7Oq4 zC#gv|LrN;nEsxp5fAp(f-jCeM?#v~IV%<{3R)K)DaxO0^S-5TipY@6oMIS7LXR AUjP6A literal 0 HcmV?d00001 diff --git a/doordesk-rs/.sass-cache/ef9787e5abb760f339d783fc63e76b78b0e24b62/main.scssc b/doordesk-rs/.sass-cache/ef9787e5abb760f339d783fc63e76b78b0e24b62/main.scssc new file mode 100644 index 0000000000000000000000000000000000000000..cc82d7f80740c2440451524dbfd635219c17c9b0 GIT binary patch literal 1649 zcmb7EU2oGc6zu~_Keo{^Cg>Q9sR#yxwP^=q*gO~^kSZaBXvNDOA~(6+42d0V7pTzw zJJ(6mEoD6L6vy}L_?%-Oc3yU#H^P4Z#j*e5u;25K54qoi@yi|@`MtybtE1!aIE-F} z(C3q|ajmAv){q-R$VdYa@>wbSQAMyyuCwq=#E}Mh;w>jlV{l1L(qJ0bC*Gi4AFF8Q z5%1lIY_ODT15w~&Mv-AQbk)Tl z{1q2T8bgt_l4spr&UzO^0@BtIvE&I9cxin^n%Ry?c?dp+VIZo!R7i0&`if) z5q!2(Qyscv)rMd_EI8xl?7Z?Gk8QG0pt(E+MOt$V*(NgUcI!CJSgvi5Dr~V`PWhya zutLcy-9QAZOid;REH2j=$S5nJ+gXs_6%8EiAo>UuDNx#i_FW;pnSb&n*=A-=d{Dwi zx9aqcy6ET8dzb!J=+27w@)+09`O=2Ou;?-7WZ84F1bVQDnc zpuOKcQwel=#FK8SmE+HJBc*f%=G$W7dLk(rcpUt9U5gnMC~ztTKe?7do*G4OdGxju zq`@p78&RR&Np;D=pR`JygV*W0Gw=FDNqaEiiHK(zpcVFm$5S-+;;_R|i_{j^PMl^N0H)uBvm*&8L7L%;`8dIs0+5E0JjI$I-Q$*-aF%h6in?;an z2)V^8BqR<>1H3B&5n+zgwn|&-vV2vv!{$Oh_qRiL*d2PGZPSOMLT)hRKMl-GTKY55D$XbS?D0SPRj=+xZfCdU3M;WrsbZr*Kw3GMSCq{CHiyr;MTw%1=E5{B{IUl; z7N;^Z-ySMLA3NIVlZ@My5IF&z1>Iqu(r5I*aa3F4sD`ZETp)CRTg5oX5$(`!nUt#< zT#!<3;OBBMRvK_)F`!qHYYv6IS;QAgcm-//app.css +style-file = "style/main.scss" + +# The tailwind input file. +# +# Optional, Activates the tailwind build +tailwind-input-file = "style/tailwind.css" + +# The tailwind config file. +# +# Optional, defaults to "./tailwind.config.js" which if is not present +# is generated for you +tailwind-config-file = "./tailwind.config.js" + +# Assets source dir. All files found here will be copied and synchronized to site-root. +# The assets-dir cannot have a sub directory with the same name/path as site-pkg-dir. +# +# Optional. Env: LEPTOS_ASSETS_DIR. +assets-dir = "public" + +# The IP and port (ex: 127.0.0.1:3000) where the server serves the content. Use it in your server setup. +site-addr = "127.0.0.1:3000" + +# The port to use for automatic reload monitoring +reload-port = 3001 + +# [Optional] Command to use when running end2end tests. It will run in the end2end dir. +# [Windows] for non-WSL use "npx.cmd playwright test" +# This binary name can be checked in Powershell with Get-Command npx +end2end-cmd = "npx playwright test" +end2end-dir = "end2end" + +# The browserlist query used for optimizing the CSS. +browserquery = "defaults" + +# Set by cargo-leptos watch when building with that tool. Controls whether autoreload JS will be included in the head +watch = false + +# The environment Leptos will run in, usually either "DEV" or "PROD" +env = "DEV" + +# The features to use when compiling the bin target +# +# Optional. Can be over-ridden with the command line parameter --bin-features +bin-features = ["ssr"] + +# If the --no-default-features flag should be used when compiling the bin target +# +# Optional. Defaults to false. +bin-default-features = false + +# The features to use when compiling the lib target +# +# Optional. Can be over-ridden with the command line parameter --lib-features +lib-features = ["hydrate"] + +# If the --no-default-features flag should be used when compiling the lib target +# +# Optional. Defaults to false. +lib-default-features = false diff --git a/doordesk-rs/LICENSE b/doordesk-rs/LICENSE new file mode 100644 index 0000000..e869ce3 --- /dev/null +++ b/doordesk-rs/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 henrik + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doordesk-rs/README.md b/doordesk-rs/README.md new file mode 100644 index 0000000..d209ce3 --- /dev/null +++ b/doordesk-rs/README.md @@ -0,0 +1,58 @@ +# doordesk-rs + +## Dev Server + +```bash +cargo install cargo-leptos +``` + +```bash +cargo leptos watch +``` + +By default, `cargo-leptos` uses `nightly` Rust, `cargo-generate`, and `sass`. If you run into any trouble, you may need to install one or more of these tools. + +1. `rustup toolchain install nightly --allow-downgrade` - make sure you have Rust nightly +2. `rustup target add wasm32-unknown-unknown` - add the ability to compile Rust to WebAssembly +3. `cargo install cargo-generate` - install `cargo-generate` binary (should be installed automatically in future) +4. `npm install -g sass` - install `dart-sass` (should be optional in future + +## Compiling for Release +```bash +cargo leptos build --release +``` + +Will generate your server binary in target/server/release and your site package in target/site + +## Testing Your Project +```bash +cargo leptos end-to-end +``` + +```bash +cargo leptos end-to-end --release +``` + +Cargo-leptos uses Playwright as the end-to-end test tool. +Tests are located in end2end/tests directory. + +## Executing a Server on a Remote Machine Without the Toolchain +After running a `cargo leptos build --release` the minimum files needed are: + +1. The server binary located in `target/server/release` +2. The `site` directory and all files within located in `target/site` + +Copy these files to your remote server. The directory structure should be: +```text +start-axum +site/ +``` +Set the following environment variables (updating for your project as needed): +```text +LEPTOS_OUTPUT_NAME="start-axum" +LEPTOS_SITE_ROOT="site" +LEPTOS_SITE_PKG_DIR="pkg" +LEPTOS_SITE_ADDR="127.0.0.1:3000" +LEPTOS_RELOAD_PORT="3001" +``` +Finally, run the server binary. diff --git a/doordesk-rs/end2end/package-lock.json b/doordesk-rs/end2end/package-lock.json new file mode 100644 index 0000000..f12af44 --- /dev/null +++ b/doordesk-rs/end2end/package-lock.json @@ -0,0 +1,74 @@ +{ + "name": "end2end", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "end2end", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@playwright/test": "^1.28.0" + } + }, + "node_modules/@playwright/test": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.28.0.tgz", + "integrity": "sha512-vrHs5DFTPwYox5SGKq/7TDn/S4q6RA1zArd7uhO6EyP9hj3XgZBBM12ktMbnDQNxh/fL1IUKsTNLxihmsU38lQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "playwright-core": "1.28.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "node_modules/playwright-core": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.28.0.tgz", + "integrity": "sha512-nJLknd28kPBiCNTbqpu6Wmkrh63OEqJSFw9xOfL9qxfNwody7h6/L3O2dZoWQ6Oxcm0VOHjWmGiCUGkc0X3VZA==", + "dev": true, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + } + } + }, + "dependencies": { + "@playwright/test": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.28.0.tgz", + "integrity": "sha512-vrHs5DFTPwYox5SGKq/7TDn/S4q6RA1zArd7uhO6EyP9hj3XgZBBM12ktMbnDQNxh/fL1IUKsTNLxihmsU38lQ==", + "dev": true, + "requires": { + "@types/node": "*", + "playwright-core": "1.28.0" + } + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "playwright-core": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.28.0.tgz", + "integrity": "sha512-nJLknd28kPBiCNTbqpu6Wmkrh63OEqJSFw9xOfL9qxfNwody7h6/L3O2dZoWQ6Oxcm0VOHjWmGiCUGkc0X3VZA==", + "dev": true + } + } +} diff --git a/doordesk-rs/end2end/package.json b/doordesk-rs/end2end/package.json new file mode 100644 index 0000000..ed78585 --- /dev/null +++ b/doordesk-rs/end2end/package.json @@ -0,0 +1,13 @@ +{ + "name": "end2end", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": {}, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@playwright/test": "^1.28.0" + } +} diff --git a/doordesk-rs/end2end/playwright.config.ts b/doordesk-rs/end2end/playwright.config.ts new file mode 100644 index 0000000..e9891c0 --- /dev/null +++ b/doordesk-rs/end2end/playwright.config.ts @@ -0,0 +1,107 @@ +import type { PlaywrightTestConfig } from "@playwright/test"; +import { devices } from "@playwright/test"; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +const config: PlaywrightTestConfig = { + testDir: "./tests", + /* Maximum time one test can run for. */ + timeout: 30 * 1000, + expect: { + /** + * Maximum time expect() should wait for the condition to be met. + * For example in `await expect(locator).toHaveText();` + */ + timeout: 5000, + }, + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: "html", + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ + actionTimeout: 0, + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://localhost:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: "on-first-retry", + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: "chromium", + use: { + ...devices["Desktop Chrome"], + }, + }, + + { + name: "firefox", + use: { + ...devices["Desktop Firefox"], + }, + }, + + { + name: "webkit", + use: { + ...devices["Desktop Safari"], + }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { + // ...devices['Pixel 5'], + // }, + // }, + // { + // name: 'Mobile Safari', + // use: { + // ...devices['iPhone 12'], + // }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { + // channel: 'msedge', + // }, + // }, + // { + // name: 'Google Chrome', + // use: { + // channel: 'chrome', + // }, + // }, + ], + + /* Folder for test artifacts such as screenshots, videos, traces, etc. */ + // outputDir: 'test-results/', + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // port: 3000, + // }, +}; + +export default config; diff --git a/doordesk-rs/end2end/tests/example.spec.ts b/doordesk-rs/end2end/tests/example.spec.ts new file mode 100644 index 0000000..a461f35 --- /dev/null +++ b/doordesk-rs/end2end/tests/example.spec.ts @@ -0,0 +1,9 @@ +import { test, expect } from "@playwright/test"; + +test("homepage has title and links to intro page", async ({ page }) => { + await page.goto("http://localhost:3000/"); + + await expect(page).toHaveTitle("Welcome to Leptos"); + + await expect(page.locator("h1")).toHaveText("Welcome to Leptos!"); +}); diff --git a/doordesk-rs/package.json b/doordesk-rs/package.json new file mode 100644 index 0000000..4626b70 --- /dev/null +++ b/doordesk-rs/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "tailwindcss": "^3.3.2" + } +} diff --git a/doordesk-rs/pnpm-lock.yaml b/doordesk-rs/pnpm-lock.yaml new file mode 100644 index 0000000..515ac49 --- /dev/null +++ b/doordesk-rs/pnpm-lock.yaml @@ -0,0 +1,563 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +devDependencies: + tailwindcss: + specifier: ^3.3.2 + version: 3.3.2 + +packages: + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /fast-glob@3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /jiti@1.18.2: + resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} + hasBin: true + dev: true + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /postcss-import@15.1.0(postcss@8.4.24): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.2 + dev: true + + /postcss-js@4.0.1(postcss@8.4.24): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.24 + dev: true + + /postcss-load-config@4.0.1(postcss@8.4.24): + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.24 + yaml: 2.3.1 + dev: true + + /postcss-nested@6.0.1(postcss@8.4.24): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@8.4.24: + resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /sucrase@3.32.0: + resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /tailwindcss@3.3.2: + resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.0 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.18.2 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.24 + postcss-import: 15.1.0(postcss@8.4.24) + postcss-js: 4.0.1(postcss@8.4.24) + postcss-load-config: 4.0.1(postcss@8.4.24) + postcss-nested: 6.0.1(postcss@8.4.24) + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + resolve: 1.22.2 + sucrase: 3.32.0 + transitivePeerDependencies: + - ts-node + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yaml@2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: '>= 14'} + dev: true diff --git a/doordesk-rs/public/about.txt b/doordesk-rs/public/about.txt new file mode 100644 index 0000000..5cd61e0 --- /dev/null +++ b/doordesk-rs/public/about.txt @@ -0,0 +1,6 @@ +This favicon was generated using the following graphics from Twitter Twemoji: + +- Graphics Title: 1f37b.svg +- Graphics Author: Copyright 2020 Twitter, Inc and other contributors (https://github.com/twitter/twemoji) +- Graphics Source: https://github.com/twitter/twemoji/blob/master/assets/svg/1f37b.svg +- Graphics License: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/) diff --git a/doordesk-rs/public/android-chrome-192x192.png b/doordesk-rs/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..27552b1883861048ede430f493409923358c6721 GIT binary patch literal 12011 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 QW9@+4M`fw+5~jib1Am95#{d8T literal 0 HcmV?d00001 diff --git a/doordesk-rs/public/android-chrome-512x512.png b/doordesk-rs/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..224ed386abe536372df33a18721b1e62b9b37b94 GIT binary patch literal 38637 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 literal 0 HcmV?d00001 diff --git a/doordesk-rs/public/apple-touch-icon.png b/doordesk-rs/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a91602a3e86feee62c57c7a2ebed24dfb825470d GIT binary patch literal 10677 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 XJkaJ^1vWm?F`?w7l)qL>n1=ix9I(;d literal 0 HcmV?d00001 diff --git a/doordesk-rs/public/favicon-16x16.png b/doordesk-rs/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..00f369c9222947b3d6d179451e364e19231eaf57 GIT binary patch literal 685 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 literal 0 HcmV?d00001 diff --git a/doordesk-rs/public/site.webmanifest b/doordesk-rs/public/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/doordesk-rs/public/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/doordesk-rs/rust-toolchain.toml b/doordesk-rs/rust-toolchain.toml new file mode 100644 index 0000000..e9743fb --- /dev/null +++ b/doordesk-rs/rust-toolchain.toml @@ -0,0 +1,3 @@ + +[toolchain] +channel = "nightly" diff --git a/doordesk-rs/src/app.rs b/doordesk-rs/src/app.rs new file mode 100644 index 0000000..899d27d --- /dev/null +++ b/doordesk-rs/src/app.rs @@ -0,0 +1,53 @@ +use crate::error_template::{AppError, ErrorTemplate}; +use leptos::*; +use leptos_meta::*; +use leptos_router::*; + +#[component] +pub fn App(cx: Scope) -> impl IntoView { + // Provides context that manages stylesheets, titles, meta tags, etc. + provide_meta_context(cx); + + view! { + cx, + + // injects a stylesheet into the document + // id=leptos means cargo-leptos will hot-reload this stylesheet + + + // sets the document title + + + // content for this welcome page + <Router fallback=|cx| { + let mut outside_errors = Errors::default(); + outside_errors.insert_with_default_key(AppError::NotFound); + view! { cx, + <ErrorTemplate outside_errors/> + } + .into_view(cx) + }> + <main> + <Routes> + <Route path="" view=|cx| view! { cx, <HomePage/> }/> + </Routes> + </main> + </Router> + } +} + +/// Renders the home page of your application. +#[component] +fn HomePage(cx: Scope) -> impl IntoView { + let (count, set_count) = create_signal(cx, 0); + let on_click = move |_| set_count.update(|count| *count += 1); + + view! { cx, + <article class="bg-zinc-700 mx-auto p-7 my-5 w-11/12 max-w-screen-xl rounded-md shadow-1g bg-opacity-10"> + <h1 class="max-6-xs text-3xl text-orange-600 font-light capitalize">"Ligma."</h1> + <hr class="opacity-50" /> + <span class="opacity-50 text-xs pt-0 m-t pb-3.5">"today"</span> + <button on:click=on_click>"Click Me: " {count}</button> + </article> + } +} diff --git a/doordesk-rs/src/error_template.rs b/doordesk-rs/src/error_template.rs new file mode 100644 index 0000000..3a947fa --- /dev/null +++ b/doordesk-rs/src/error_template.rs @@ -0,0 +1,76 @@ +use cfg_if::cfg_if; +use http::status::StatusCode; +use leptos::*; +use thiserror::Error; + +#[cfg(feature = "ssr")] +use leptos_axum::ResponseOptions; + +#[derive(Clone, Debug, Error)] +pub enum AppError { + #[error("Not Found")] + NotFound, +} + +impl AppError { + pub fn status_code(&self) -> StatusCode { + match self { + AppError::NotFound => StatusCode::NOT_FOUND, + } + } +} + +// A basic function to display errors served by the error boundaries. +// Feel free to do more complicated things here than just displaying the error. +#[component] +pub fn ErrorTemplate( + cx: Scope, + #[prop(optional)] outside_errors: Option<Errors>, + #[prop(optional)] errors: Option<RwSignal<Errors>>, +) -> impl IntoView { + let errors = match outside_errors { + Some(e) => create_rw_signal(cx, e), + None => match errors { + Some(e) => e, + None => panic!("No Errors found and we expected errors!"), + }, + }; + // Get Errors from Signal + let errors = errors.get(); + + // Downcast lets us take a type that implements `std::error::Error` + let errors: Vec<AppError> = errors + .into_iter() + .filter_map(|(_k, v)| v.downcast_ref::<AppError>().cloned()) + .collect(); + println!("Errors: {errors:#?}"); + + // Only the response code for the first error is actually sent from the server + // this may be customized by the specific application + cfg_if! { if #[cfg(feature="ssr")] { + let response = use_context::<ResponseOptions>(cx); + if let Some(response) = response { + response.set_status(errors[0].status_code()); + } + }} + + view! {cx, + <h1>{if errors.len() > 1 {"Errors"} else {"Error"}}</h1> + <For + // a function that returns the items we're iterating over; a signal is fine + each= move || {errors.clone().into_iter().enumerate()} + // a unique key for each item as a reference + key=|(index, _error)| *index + // renders each item to a view + view= move |cx, error| { + let error_string = error.1.to_string(); + let error_code= error.1.status_code(); + view! { + cx, + <h2>{error_code.to_string()}</h2> + <p>"Error: " {error_string}</p> + } + } + /> + } +} diff --git a/doordesk-rs/src/fileserv.rs b/doordesk-rs/src/fileserv.rs new file mode 100644 index 0000000..07fade7 --- /dev/null +++ b/doordesk-rs/src/fileserv.rs @@ -0,0 +1,40 @@ +use cfg_if::cfg_if; + +cfg_if! { if #[cfg(feature = "ssr")] { + use axum::{ + body::{boxed, Body, BoxBody}, + extract::State, + response::IntoResponse, + http::{Request, Response, StatusCode, Uri}, + }; + use axum::response::Response as AxumResponse; + use tower::ServiceExt; + use tower_http::services::ServeDir; + use leptos::*; + use crate::app::App; + + pub async fn file_and_error_handler(uri: Uri, State(options): State<LeptosOptions>, req: Request<Body>) -> AxumResponse { + let root = options.site_root.clone(); + let res = get_static_file(uri.clone(), &root).await.unwrap(); + + if res.status() == StatusCode::OK { + res.into_response() + } else { + let handler = leptos_axum::render_app_to_stream(options.to_owned(), move |cx| view!{cx, <App/>}); + handler(req).await.into_response() + } + } + + async fn get_static_file(uri: Uri, root: &str) -> Result<Response<BoxBody>, (StatusCode, String)> { + let req = Request::builder().uri(uri.clone()).body(Body::empty()).unwrap(); + // `ServeDir` implements `tower::Service` so we can call it with `tower::ServiceExt::oneshot` + // This path is relative to the cargo root + match ServeDir::new(root).oneshot(req).await { + Ok(res) => Ok(res.map(boxed)), + Err(err) => Err(( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Something went wrong: {err}"), + )), + } + } +}} diff --git a/doordesk-rs/src/lib.rs b/doordesk-rs/src/lib.rs new file mode 100644 index 0000000..7190a49 --- /dev/null +++ b/doordesk-rs/src/lib.rs @@ -0,0 +1,21 @@ +use cfg_if::cfg_if; +pub mod app; +pub mod error_template; +pub mod fileserv; + +cfg_if! { if #[cfg(feature = "hydrate")] { + use leptos::*; + use wasm_bindgen::prelude::wasm_bindgen; + use crate::app::*; + + #[wasm_bindgen] + pub fn hydrate() { + // initializes logging using the `log` crate + _ = console_log::init_with_level(log::Level::Debug); + console_error_panic_hook::set_once(); + + leptos::mount_to_body(move |cx| { + view! { cx, <App/> } + }); + } +}} diff --git a/doordesk-rs/src/main.rs b/doordesk-rs/src/main.rs new file mode 100644 index 0000000..2ba6ec3 --- /dev/null +++ b/doordesk-rs/src/main.rs @@ -0,0 +1,43 @@ +#[cfg(feature = "ssr")] +#[tokio::main] +async fn main() { + use axum::{routing::post, Router}; + use leptos::*; + use leptos_axum::{generate_route_list, LeptosRoutes}; + use doordesk::app::*; + use doordesk::fileserv::file_and_error_handler; + + simple_logger::init_with_level(log::Level::Debug).expect("couldn't initialize logging"); + + // Setting get_configuration(None) means we'll be using cargo-leptos's env values + // For deployment these variables are: + // <https://github.com/leptos-rs/start-axum#executing-a-server-on-a-remote-machine-without-the-toolchain> + // Alternately a file can be specified such as Some("Cargo.toml") + // The file would need to be included with the executable when moved to deployment + let conf = get_configuration(None).await.unwrap(); + let leptos_options = conf.leptos_options; + let addr = leptos_options.site_addr; + let routes = generate_route_list(|cx| view! { cx, <App/> }).await; + + // build our application with a route + let app = Router::new() + .route("/api/*fn_name", post(leptos_axum::handle_server_fns)) + .leptos_routes(&leptos_options, routes, |cx| view! { cx, <App/> }) + .fallback(file_and_error_handler) + .with_state(leptos_options); + + // run our app with hyper + // `axum::Server` is a re-export of `hyper::Server` + log!("listening on http://{}", &addr); + axum::Server::bind(&addr) + .serve(app.into_make_service()) + .await + .unwrap(); +} + +#[cfg(not(feature = "ssr"))] +pub fn main() { + // no client-side main function + // unless we want this to work with e.g., Trunk for a purely client-side app + // see lib.rs for hydration function instead +} diff --git a/doordesk-rs/style/main.scss b/doordesk-rs/style/main.scss new file mode 100644 index 0000000..e4538e1 --- /dev/null +++ b/doordesk-rs/style/main.scss @@ -0,0 +1,4 @@ +body { + font-family: sans-serif; + text-align: center; +} \ No newline at end of file diff --git a/doordesk-rs/style/tailwind.css b/doordesk-rs/style/tailwind.css new file mode 100644 index 0000000..4621685 --- /dev/null +++ b/doordesk-rs/style/tailwind.css @@ -0,0 +1,37 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + @apply bg-gradient-to-br from-zinc-900 to-zinc-950; + @apply w-screen h-screen; +} + +/* for innerHTML articles */ +article p { + @apply mt-5 indent-4; +} + +article h3 { + @apply mt-8; +} + +article h3 { + @apply text-2xl text-orange-600; +} + +article a { + @apply text-orange-300 hover:underline; +} + +article ul, article ol { + @apply mt-5 list-inside; +} + +article ul { + @apply list-disc; +} + +article ol { + @apply list-decimal; +} diff --git a/doordesk-rs/tailwind.config.js b/doordesk-rs/tailwind.config.js new file mode 100644 index 0000000..d8b8f37 --- /dev/null +++ b/doordesk-rs/tailwind.config.js @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ + module.exports = { + content: { + relative: true, + files: ["*.html", "./src/**/*.rs"], + }, + theme: { + extend: {}, + }, + plugins: [], + } + \ No newline at end of file