From 860280a56277b1bd641e3cd554a03b63372c7cae Mon Sep 17 00:00:00 2001 From: "Shahar \"Dawn\" Or" Date: Sat, 16 Nov 2024 02:39:59 +0700 Subject: [PATCH] nixify --- .github/workflows/ci.yml | 60 +- .gitignore | 3 +- Cargo.lock | 331 +----- crates/builder/Cargo.toml | 3 +- crates/builder/default.nix | 43 + .../{src/components/calendar => }/snippet.js | 0 crates/builder/src/components.rs | 3 - crates/builder/src/components/calendar.rs | 23 +- crates/builder/src/components/page_base.rs | 5 +- crates/builder/src/constants.rs | 22 - crates/builder/src/file_specs.rs | 22 +- crates/builder/src/fonts.rs | 13 +- crates/builder/src/google_font.rs | 21 +- crates/builder/src/graphic_file_specs.rs | 42 +- crates/builder/src/main.rs | 11 +- crates/builder/src/mob.rs | 16 +- crates/builder/src/pages.rs | 8 +- crates/builder/src/pages/index.rs | 8 +- crates/builder/src/tailwind.rs | 26 +- crates/builder/src/url.rs | 4 - crates/cli/src/input.css | 9 - crates/cli/src/main.rs | 87 +- crates/cli/src/tailwind.rs | 56 - crates/reactive/Cargo.toml | 2 +- crates/ssg-child/Cargo.toml | 3 - .../ssg-child/src/disk_caching_http_client.rs | 53 - crates/ssg-child/src/lib.rs | 1 - crates/ssg-child/src/sources.rs | 6 +- crates/ssg-child/src/sources/byte_array.rs | 12 + crates/ssg-child/src/sources/fs_path.rs | 18 + crates/ssg-child/src/sources/google_font.rs | 123 -- crates/ssg-child/src/sources/http.rs | 44 - crates/ssg-parent/src/lib.rs | 2 +- default.nix | 17 + deploy-preview.nix | 15 + devmode.nix | 23 + flake.lock | 279 +++++ flake.nix | 50 +- nci.nix | 24 + package-lock.json | 1050 ----------------- package.json | 7 - rust-toolchain.toml | 2 - tailwind.config.js | 3 - 43 files changed, 643 insertions(+), 1907 deletions(-) create mode 100644 crates/builder/default.nix rename crates/builder/{src/components/calendar => }/snippet.js (100%) delete mode 100644 crates/cli/src/input.css delete mode 100644 crates/cli/src/tailwind.rs delete mode 100644 crates/ssg-child/src/disk_caching_http_client.rs create mode 100644 crates/ssg-child/src/sources/byte_array.rs create mode 100644 crates/ssg-child/src/sources/fs_path.rs delete mode 100644 crates/ssg-child/src/sources/google_font.rs delete mode 100644 crates/ssg-child/src/sources/http.rs create mode 100644 default.nix create mode 100644 deploy-preview.nix create mode 100644 devmode.nix create mode 100644 nci.nix delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 rust-toolchain.toml delete mode 100644 tailwind.config.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index baad27cd..a6935240 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,59 +7,42 @@ permissions: contents: write pull-requests: write -env: - RUST_BACKTRACE: 1 - jobs: - build: + check-and-build: + permissions: + id-token: write + runs-on: ubuntu-latest - outputs: - output_dir: ${{ steps.get_output_dir.outputs.output_dir }} steps: - uses: actions/checkout@v3 - - run: rustup update - - id: get-rust-version - run: echo "rust_version=$(rustc --version)" >> $GITHUB_OUTPUT - shell: bash - - uses: actions/cache@v3 - with: - path: | - .bin/ - target/ - ~/.cargo/ - key: ${{ runner.os }}_${{ steps.get-rust-version.outputs.rust_version }}_${{ hashFiles('rust-toolchain.toml', 'Cargo.toml', 'Cargo.lock') }} - restore-keys: | - ${{ runner.os }}_${{ steps.get-rust-version.outputs.rust_version }}_ - ${{ runner.os }}_ - - run: npm ci - - run: ./git_hooks/pre-commit - - run: cargo run build - - uses: numtide/clean-git-action@v2 - - id: get_output_dir - run: echo "output_dir=$(cargo run -- print-output-dir)" >> $GITHUB_OUTPUT + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - run: nix --accept-flake-config flake check + - run: nix --accept-flake-config build - uses: actions/upload-artifact@v3 with: - name: build_output_dir - path: ${{ steps.get_output_dir.outputs.output_dir }} + path: ./result + if-no-files-found: error deploy-preview: if: github.event_name == 'pull_request' - needs: build + needs: check-and-build environment: pull_request_deployment runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main - uses: actions/download-artifact@v3 with: - name: build_output_dir - path: ${{ needs.build.outputs.output_dir }} + name: artifact + path: .vercel/output/static - id: deploy - run: | - npx vercel pull --yes --environment=preview --scope mobusoperandi --token=${{ secrets.VERCEL_TOKEN }} - URL=$(npx vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }}) - echo "URL=$URL" >> $GITHUB_OUTPUT + env: + VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} + run: nix --accept-flake-config run .#deploy-preview - uses: thollander/actions-comment-pull-request@v2 with: message: | @@ -68,14 +51,13 @@ jobs: deploy-production: if: github.ref == 'refs/heads/main' - needs: build + needs: check-and-build runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/download-artifact@v3 with: - name: build_output_dir - path: ${{ needs.build.outputs.output_dir }} + path: deploy - uses: JamesIves/github-pages-deploy-action@v4 with: - folder: ${{ needs.build.outputs.output_dir }} + folder: deploy diff --git a/.gitignore b/.gitignore index 89150303..d787b706 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ -/.vercel -/node_modules /target +/result diff --git a/Cargo.lock b/Cargo.lock index ce4a48c2..9d2b45b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,7 +29,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -64,7 +64,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" dependencies = [ "cipher", - "opaque-debug 0.3.1", + "opaque-debug", ] [[package]] @@ -74,7 +74,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" dependencies = [ "cipher", - "opaque-debug 0.3.1", + "opaque-debug", ] [[package]] @@ -292,7 +292,7 @@ dependencies = [ "futures-lite 2.3.0", "parking", "polling 3.7.3", - "rustix 0.38.36", + "rustix 0.38.40", "slab", "tracing", "windows-sys 0.59.0", @@ -333,7 +333,7 @@ dependencies = [ "cfg-if 1.0.0", "event-listener 5.3.1", "futures-lite 2.3.0", - "rustix 0.38.36", + "rustix 0.38.40", "tracing", "windows-sys 0.59.0", ] @@ -356,7 +356,7 @@ dependencies = [ "rand 0.7.3", "serde", "serde_json", - "sha2 0.9.9", + "sha2", ] [[package]] @@ -371,7 +371,7 @@ dependencies = [ "cfg-if 1.0.0", "futures-core", "futures-io", - "rustix 0.38.36", + "rustix 0.38.40", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -527,15 +527,6 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" -[[package]] -name = "base64" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" -dependencies = [ - "byteorder", -] - [[package]] name = "base64" version = "0.12.3" @@ -608,19 +599,7 @@ dependencies = [ "cfg-if 0.1.10", "constant_time_eq", "crypto-mac 0.8.0", - "digest 0.9.0", -] - -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array 0.12.4", + "digest", ] [[package]] @@ -629,16 +608,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", + "generic-array", ] [[package]] @@ -685,6 +655,7 @@ dependencies = [ "ssg-child", "strum", "syn 2.0.77", + "tempfile", "thiserror", "tokio", "url", @@ -696,12 +667,6 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - [[package]] name = "byteorder" version = "1.5.0" @@ -714,29 +679,6 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" -[[package]] -name = "cacache" -version = "10.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c13caedf5b624de6448b78e980320a27266557350198dc67cf64bc8561c27e8" -dependencies = [ - "async-std", - "digest 0.9.0", - "either", - "futures", - "hex 0.4.3", - "memmap2", - "serde", - "serde_derive", - "serde_json", - "sha-1 0.9.8", - "sha2 0.9.9", - "ssri", - "tempfile", - "thiserror", - "walkdir", -] - [[package]] name = "camino" version = "1.1.9" @@ -808,7 +750,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -1002,7 +944,7 @@ dependencies = [ "hmac 0.10.1", "percent-encoding", "rand 0.8.5", - "sha2 0.9.9", + "sha2", "time 0.2.27", "version_check", ] @@ -1068,7 +1010,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "generic-array 0.14.7", + "generic-array", "subtle", ] @@ -1078,7 +1020,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" dependencies = [ - "generic-array 0.14.7", + "generic-array", "subtle", ] @@ -1198,22 +1140,13 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "339544cc9e2c4dc3fc7149fd630c5f22263a4fdf18a98afd0075784968b5cf00" -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - [[package]] name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -1330,12 +1263,6 @@ dependencies = [ "pin-project-lite 0.2.14", ] -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - [[package]] name = "fancy-regex" version = "0.11.0" @@ -1549,15 +1476,6 @@ dependencies = [ "slab", ] -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -1608,7 +1526,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97304e4cd182c3846f7575ced3890c53012ce534ad9114046b0a9e00bb30a375" dependencies = [ - "opaque-debug 0.3.1", + "opaque-debug", "polyval", ] @@ -1708,25 +1626,13 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" -[[package]] -name = "hex" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - [[package]] name = "hkdf" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51ab2f639c231793c5f6114bdb9bbe50a7dbbfcd7c7c6bd8475dec2d991e964f" dependencies = [ - "digest 0.9.0", + "digest", "hmac 0.10.1", ] @@ -1737,7 +1643,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" dependencies = [ "crypto-mac 0.8.0", - "digest 0.9.0", + "digest", ] [[package]] @@ -1747,7 +1653,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" dependencies = [ "crypto-mac 0.10.0", - "digest 0.9.0", + "digest", ] [[package]] @@ -1772,55 +1678,6 @@ dependencies = [ "pin-project-lite 0.2.14", ] -[[package]] -name = "http-cache" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb1456e593b7972039e70113f31bd33ebbe97d0b6e269c35449525ca0284a3b" -dependencies = [ - "anyhow", - "async-trait", - "bincode", - "cacache", - "http", - "http-cache-semantics", - "httpdate", - "miette", - "serde", - "thiserror", - "url", -] - -[[package]] -name = "http-cache-reqwest" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f7c0d9fa1b970ae42aeb7a4b957fa055caf03acd37b2178941dd258e68a8e49" -dependencies = [ - "anyhow", - "async-trait", - "http", - "http-cache", - "http-cache-semantics", - "reqwest", - "reqwest-middleware", - "serde", - "task-local-extensions", - "url", -] - -[[package]] -name = "http-cache-semantics" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aec9f678bca3f4a15194b980f20ed9bfe0dd38e8d298c65c559a93dfbd6380a" -dependencies = [ - "http", - "http-serde", - "serde", - "time 0.3.36", -] - [[package]] name = "http-client" version = "6.5.3" @@ -1833,16 +1690,6 @@ dependencies = [ "log", ] -[[package]] -name = "http-serde" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f560b665ad9f1572cfcaf034f7fb84338a7ce945216d64a90fd81f046a3caee" -dependencies = [ - "http", - "serde", -] - [[package]] name = "http-types" version = "2.12.0" @@ -2179,9 +2026,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "libredox" @@ -2306,38 +2153,6 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] - -[[package]] -name = "miette" -version = "5.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" -dependencies = [ - "miette-derive", - "once_cell", - "thiserror", - "unicode-width", -] - -[[package]] -name = "miette-derive" -version = "5.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - [[package]] name = "mime" version = "0.3.17" @@ -2522,12 +2337,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - [[package]] name = "opaque-debug" version = "0.3.1" @@ -2796,7 +2605,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite 0.2.14", - "rustix 0.38.36", + "rustix 0.38.40", "tracing", "windows-sys 0.59.0", ] @@ -2808,7 +2617,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eebcc4aa140b9abd2bc40d9c3f7ccec842679cd79045ac3a7ac698c1a064b7cd" dependencies = [ "cpuid-bool", - "opaque-debug 0.3.1", + "opaque-debug", "universal-hash", ] @@ -3111,7 +2920,6 @@ dependencies = [ "js-sys", "log", "mime", - "mime_guess", "once_cell", "percent-encoding", "pin-project-lite 0.2.14", @@ -3133,21 +2941,6 @@ dependencies = [ "winreg", ] -[[package]] -name = "reqwest-middleware" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" -dependencies = [ - "anyhow", - "async-trait", - "http", - "reqwest", - "serde", - "task-local-extensions", - "thiserror", -] - [[package]] name = "ring" version = "0.17.8" @@ -3224,9 +3017,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.36" +version = "0.38.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f55e80d50763938498dd5ebb18647174e0c76dc38c5505294bb224624f30f36" +checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" dependencies = [ "bitflags 2.6.0", "errno", @@ -3447,29 +3240,17 @@ dependencies = [ "unsafe-libyaml", ] -[[package]] -name = "sha-1" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - [[package]] name = "sha-1" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ - "block-buffer 0.9.0", + "block-buffer", "cfg-if 1.0.0", "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.1", + "digest", + "opaque-debug", ] [[package]] @@ -3487,29 +3268,17 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" -[[package]] -name = "sha2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - [[package]] name = "sha2" version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ - "block-buffer 0.9.0", + "block-buffer", "cfg-if 1.0.0", "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.1", + "digest", + "opaque-debug", ] [[package]] @@ -3609,13 +3378,10 @@ dependencies = [ "dirs", "futures", "getset", - "http-cache-reqwest", "lazy-regex", "once_cell", "readext", "relative-path", - "reqwest", - "reqwest-middleware", "task-local-extensions", "thiserror", "tokio", @@ -3643,21 +3409,6 @@ dependencies = [ "url", ] -[[package]] -name = "ssri" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9cec0d388f39fbe79d7aa600e8d38053bf97b1bc8d350da7c0ba800d0f423f2" -dependencies = [ - "base64 0.10.1", - "digest 0.8.1", - "hex 0.3.2", - "serde", - "sha-1 0.8.2", - "sha2 0.8.2", - "thiserror", -] - [[package]] name = "standback" version = "0.2.17" @@ -3917,14 +3668,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if 1.0.0", "fastrand 2.1.1", "once_cell", - "rustix 0.38.36", + "rustix 0.38.40", "windows-sys 0.59.0", ] @@ -3943,7 +3694,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "rustix 0.38.36", + "rustix 0.38.40", "windows-sys 0.48.0", ] @@ -4014,7 +3765,7 @@ dependencies = [ "pin-project", "serde", "serde_json", - "sha-1 0.9.8", + "sha-1", "tide", ] @@ -4303,7 +4054,7 @@ dependencies = [ "input_buffer", "log", "rand 0.8.5", - "sha-1 0.9.8", + "sha-1", "thiserror", "url", "utf-8", @@ -4366,12 +4117,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-width" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" - [[package]] name = "unicode-xid" version = "0.2.5" @@ -4390,7 +4135,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8326b2c654932e3e4f9196e69d08fdf7cfd718e1dc6f66b347e6024a0c961402" dependencies = [ - "generic-array 0.14.7", + "generic-array", "subtle", ] diff --git a/crates/builder/Cargo.toml b/crates/builder/Cargo.toml index 71fb2e75..8cffb4ad 100644 --- a/crates/builder/Cargo.toml +++ b/crates/builder/Cargo.toml @@ -28,7 +28,8 @@ syn = {version = "2.0.5", features = ["full"]} thiserror = "1.0.40" # TODO less features tokio = {version = "1.21.0", features = ["full"]} -url = "2.3.1" +url = {version = "2.3.1", features = ["serde"]} +tempfile = "3.14.0" ssg-child.workspace = true [features] diff --git a/crates/builder/default.nix b/crates/builder/default.nix new file mode 100644 index 00000000..f2468eb8 --- /dev/null +++ b/crates/builder/default.nix @@ -0,0 +1,43 @@ +{ inputs, lib, ... }: +{ + perSystem = + { pkgs, ... }: + { + nci.crates.builder.drvConfig = { + env = { + inherit (inputs) + FULLCALENDAR + FULLCALENDAR_RRULE + INVERTICAT_LOGO + RRULE + TWITTER_LOGO + YOUTUBE_LOGO + ZULIP_LOGO + ; + + VOLLKORN = "${pkgs.vollkorn}/share/fonts/truetype/Vollkorn-Regular.ttf"; + TAILWINDCSS = lib.getExe pkgs.tailwindcss; + CALENDAR_SNIPPET_JS = builtins.readFile ./snippet.js |> pkgs.writeText "snippet.js"; + + TAILWINDCSS_CONFIG = pkgs.writeText "tailwind.config.js" '' + module.exports = { + plugins: [require("@tailwindcss/typography")], + }; + ''; + + TAILWINDCSS_INPUT = pkgs.writeText "input.css" '' + @tailwind base; + @tailwind components; + @tailwind utilities; + + @layer base { + a { + @apply underline; + } + } + ''; + }; + }; + + }; +} diff --git a/crates/builder/src/components/calendar/snippet.js b/crates/builder/snippet.js similarity index 100% rename from crates/builder/src/components/calendar/snippet.js rename to crates/builder/snippet.js diff --git a/crates/builder/src/components.rs b/crates/builder/src/components.rs index 6cf5cf60..a0641b59 100644 --- a/crates/builder/src/components.rs +++ b/crates/builder/src/components.rs @@ -8,7 +8,4 @@ pub(crate) mod schema; pub(crate) use calendar::Calendar; pub(crate) use calendar::CalendarEvent; -pub(crate) use calendar::FULLCALENDAR_RRULE_URL as CALENDAR_FULLCALENDAR_RRULE_URL; -pub(crate) use calendar::LIBRARY_URL as CALENDAR_LIBRARY_URL; -pub(crate) use calendar::RRULE_URL as CALENDAR_RRULE_URL; pub(crate) use page_base::PageBase; diff --git a/crates/builder/src/components/calendar.rs b/crates/builder/src/components/calendar.rs index 720f74de..2f5f114f 100644 --- a/crates/builder/src/components/calendar.rs +++ b/crates/builder/src/components/calendar.rs @@ -1,7 +1,6 @@ use chrono::Duration; use csscolorparser::Color; use maud::{html, Markup, PreEscaped, Render}; -use once_cell::sync::Lazy; use rrule::RRuleSet; use serde::{Serialize, Serializer}; use serde_json::json; @@ -10,7 +9,6 @@ use crate::html::css_class; use crate::mob; use crate::relative_path::RelativePathBuf; use crate::style::{BUTTON_CLASSES, BUTTON_GAP, TEXT_COLOR}; -use crate::url::Url; pub(crate) struct Calendar { events: Vec, @@ -80,25 +78,6 @@ where )) } -const FULLCALENDAR_VERSION: &str = "6.0.2"; - -pub(crate) static LIBRARY_URL: Lazy = Lazy::new(|| { - Url::parse( - &(format!( - "https://cdn.jsdelivr.net/npm/fullcalendar@{FULLCALENDAR_VERSION}/index.global.min.js" - )), - ) - .unwrap() -}); - -pub(crate) static RRULE_URL: Lazy = Lazy::new(|| { - Url::parse("https://cdn.jsdelivr.net/npm/rrule@2.7.2/dist/es5/rrule.min.js").unwrap() -}); - -pub(crate) static FULLCALENDAR_RRULE_URL: Lazy = Lazy::new(|| { - Url::parse(&format!("https://cdn.jsdelivr.net/npm/@fullcalendar/rrule@{FULLCALENDAR_VERSION}/index.global.min.js")).unwrap() -}); - impl Render for Calendar { fn render(&self) -> maud::Markup { #[derive(Debug, PartialEq, Eq)] @@ -124,7 +103,7 @@ impl Render for Calendar { } } - const CALENDAR_FN_SNIPPET: &str = include_str!("calendar/snippet.js"); + const CALENDAR_FN_SNIPPET: &str = include_str!(env!("CALENDAR_SNIPPET_JS")); const INPUT_ATTR: &str = "data-input"; let calendar_container_class = css_class(); let date_range_class = css_class(); diff --git a/crates/builder/src/components/page_base.rs b/crates/builder/src/components/page_base.rs index 1ef7ba2a..c34a2ad5 100644 --- a/crates/builder/src/components/page_base.rs +++ b/crates/builder/src/components/page_base.rs @@ -5,7 +5,7 @@ use maud::{html, Markup, Render, DOCTYPE}; use ssg_child::sources::ExpectedFiles; use crate::{ - constants::{COMMIT_HASH, DESCRIPTION, GITHUB_ORGANIZATION_URL, NAME, REPO_URL, ZULIP_URL}, + constants::{DESCRIPTION, GITHUB_ORGANIZATION_URL, NAME, REPO_URL, ZULIP_URL}, expected_files::ExpectedFilesExt, fonts, html::Classes, @@ -111,7 +111,7 @@ impl Render for Page { let brand_classes = classes!("tracking-widest", "text-center"); let root_classes = classes![ - format!("font-[{}]", *fonts::VOLLKORN), + format!("font-[{}]", fonts::VOLLKORN.family()), "[font-size:16px]", format!("bg-{}", style::BACKGROUND_COLOR), format!("text-{}", style::TEXT_COLOR), @@ -208,7 +208,6 @@ impl Render for Page { hr; div class=(classes!("flex", "justify-between", "flex-wrap", "items-end")) { - pre class=(classes!("text-xs")) { code { (*COMMIT_HASH) } } a class=(classes!("text-sm")) href=(*REPO_URL) { "Source"} } } diff --git a/crates/builder/src/constants.rs b/crates/builder/src/constants.rs index a44ddffb..a9b1a659 100644 --- a/crates/builder/src/constants.rs +++ b/crates/builder/src/constants.rs @@ -1,4 +1,3 @@ -use camino::Utf8PathBuf; use once_cell::sync::Lazy; use crate::url::Url; @@ -8,12 +7,6 @@ pub(crate) const DESCRIPTION: &str = "A mob programming community"; pub(crate) const MOBS_DIR: &str = "mobs"; -pub(crate) static MOBS_PATH: Lazy = Lazy::new(|| { - [env!("CARGO_MANIFEST_DIR"), "..", "..", MOBS_DIR] - .iter() - .collect() -}); - pub(crate) static ZULIP_URL: Lazy = Lazy::new(|| "https://mobusoperandi.zulipchat.com".parse().unwrap()); @@ -27,21 +20,6 @@ pub(crate) static GITHUB_ORGANIZATION_URL: Lazy = Lazy::new(|| { url }); -pub(crate) static COMMIT_HASH: Lazy = Lazy::new(|| { - let output = std::process::Command::new("git") - .args(["rev-parse", "HEAD"]) - .output() - .unwrap(); - - assert!( - output.status.success(), - "exit code: {:?}", - output.status.code() - ); - - String::from_utf8(output.stdout).unwrap() -}); - const REPOSITORY: &str = "website"; pub(crate) static REPO_URL: Lazy = Lazy::new(|| { diff --git a/crates/builder/src/file_specs.rs b/crates/builder/src/file_specs.rs index 275ec777..00b5f7f7 100644 --- a/crates/builder/src/file_specs.rs +++ b/crates/builder/src/file_specs.rs @@ -1,28 +1,24 @@ +use camino::Utf8Path; +use itertools::Itertools; use ssg_child::FileSpec; -use crate::{components, fonts, graphic_file_specs, pages}; +use crate::{fonts, graphic_file_specs, pages}; -pub(crate) fn get() -> impl Iterator { +pub(crate) fn get(mobs_path: &Utf8Path) -> impl Iterator { let fonts = fonts::all(); - let pages = pages::all(); + let mobs = crate::mob::get_all(mobs_path).into_iter().collect_vec(); + let pages = pages::all(mobs); let calendar_library = FileSpec::new( "/fullcalendar.js", - ssg_child::sources::Http::from(components::CALENDAR_LIBRARY_URL.to_inner().clone()), + include_bytes!(env!("FULLCALENDAR")).as_slice(), ); - let rrule_library = FileSpec::new( - "/rrule.js", - ssg_child::sources::Http::from(components::CALENDAR_RRULE_URL.to_inner().clone()), - ); + let rrule_library = FileSpec::new("/rrule.js", include_bytes!(env!("RRULE")).as_slice()); let fullcalendar_rrule = FileSpec::new( "/fullcalendar_rrule.js", - ssg_child::sources::Http::from( - components::CALENDAR_FULLCALENDAR_RRULE_URL - .to_inner() - .clone(), - ), + include_bytes!(env!("FULLCALENDAR_RRULE")).as_slice(), ); [calendar_library, rrule_library, fullcalendar_rrule] diff --git a/crates/builder/src/fonts.rs b/crates/builder/src/fonts.rs index 356e3476..3d59997d 100644 --- a/crates/builder/src/fonts.rs +++ b/crates/builder/src/fonts.rs @@ -1,17 +1,12 @@ use once_cell::sync::Lazy; use ssg_child::FileSpec; -use crate::google_font::GoogleFont; +use crate::google_font::TrueTypeFont; -pub(crate) static VOLLKORN: Lazy = Lazy::new(|| { - GoogleFont::new( - "Vollkorn".to_owned(), - "latin".to_owned(), - "regular".to_owned(), - ) -}); +pub(crate) const VOLLKORN: TrueTypeFont = + TrueTypeFont::new(include_bytes!(env!("VOLLKORN")), "Vollkorn"); -pub(crate) static ALL: Lazy<[GoogleFont; 1]> = Lazy::new(|| [VOLLKORN.clone()]); +pub(crate) static ALL: Lazy<[TrueTypeFont; 1]> = Lazy::new(|| [VOLLKORN.clone()]); pub(crate) fn all() -> [FileSpec; 1] { ALL.clone() diff --git a/crates/builder/src/google_font.rs b/crates/builder/src/google_font.rs index 969010ce..500ff7b1 100644 --- a/crates/builder/src/google_font.rs +++ b/crates/builder/src/google_font.rs @@ -4,16 +4,19 @@ use ssg_child::sources::FileSource; use crate::relative_path::RelativePathBuf; -#[derive(Debug, Clone, derive_more::Display)] -pub(crate) struct GoogleFont(ssg_child::sources::GoogleFont); +#[derive(Debug, Clone)] +pub(crate) struct TrueTypeFont { + bytes: &'static [u8], + family: &'static str, +} -impl GoogleFont { - pub(crate) fn new(family: String, subset: String, variant: String) -> GoogleFont { - Self(ssg_child::sources::GoogleFont::new(family, subset, variant)) +impl TrueTypeFont { + pub(crate) const fn new(bytes: &'static [u8], family: &'static str) -> TrueTypeFont { + Self { bytes, family } } pub(crate) fn family(&self) -> &str { - self.0.family() + self.family } pub(crate) fn filename(&self) -> RelativePathBuf { @@ -21,16 +24,16 @@ impl GoogleFont { } } -impl FileSource for GoogleFont { +impl FileSource for TrueTypeFont { fn obtain_content( &self, ) -> BoxFuture>> { - self.0.obtain_content() + self.bytes.obtain_content() } } -impl Render for GoogleFont { +impl Render for TrueTypeFont { fn render(&self) -> Markup { PreEscaped(format!( " diff --git a/crates/builder/src/graphic_file_specs.rs b/crates/builder/src/graphic_file_specs.rs index ace98722..18424b36 100644 --- a/crates/builder/src/graphic_file_specs.rs +++ b/crates/builder/src/graphic_file_specs.rs @@ -1,46 +1,12 @@ use ssg_child::FileSpec; -use crate::url::Url; - pub(crate) fn get() -> [FileSpec; 5] { const FAVICON: [u8; 0] = []; let favicon = FileSpec::new("/favicon.ico", FAVICON.as_slice()); - - let twitter_logo = FileSpec::new( - "/twitter_logo.svg", - ssg_child::sources::Http::from( - Url::parse("https://cdn.svgporn.com/logos/twitter.svg") - .unwrap() - .to_inner() - .clone(), - ), - ); - - let zulip_logo = FileSpec::new("/zulip_logo.svg", - ssg_child::sources::Http::from( - Url::parse("https://raw.githubusercontent.com/zulip/zulip/main/static/images/logo/zulip-icon-square.svg") - .unwrap().to_inner().clone(), - ) - ); - - let inverticat_logo = FileSpec::new( - "/inverticat.svg", - ssg_child::sources::Http::from( - Url::parse( - "https://raw.githubusercontent.com/primer/octicons/v19.0.0/icons/mark-github-16.svg", - ) - .unwrap() - .to_inner() - .clone(), - ), - ); - - let youtube_logo = FileSpec::new("/youtube_logo.svg", - ssg_child::sources::Http::from( - Url::parse("https://upload.wikimedia.org/wikipedia/commons/0/09/YouTube_full-color_icon_%282017%29.svg") - .unwrap().to_inner().clone(), - ) - ); + let twitter_logo = FileSpec::new("/twitter_logo.svg", include_bytes!(env!("TWITTER_LOGO"))); + let zulip_logo = FileSpec::new("/zulip_logo.svg", include_bytes!(env!("ZULIP_LOGO"))); + let inverticat_logo = FileSpec::new("/inverticat.svg", include_bytes!(env!("INVERTICAT_LOGO"))); + let youtube_logo = FileSpec::new("/youtube_logo.svg", include_bytes!(env!("YOUTUBE_LOGO"))); [ favicon, diff --git a/crates/builder/src/main.rs b/crates/builder/src/main.rs index 2367efa8..6715145c 100644 --- a/crates/builder/src/main.rs +++ b/crates/builder/src/main.rs @@ -16,6 +16,7 @@ mod pages; mod relative_path; mod style; mod syn_helpers; +mod tailwind; mod url; use camino::Utf8PathBuf; @@ -24,14 +25,18 @@ use ssg_child::generate_static_site; #[derive(Parser)] struct Cli { + mobs_path: Utf8PathBuf, output_dir: Utf8PathBuf, } #[tokio::main] async fn main() { - let Cli { output_dir } = Cli::parse(); + let Cli { + mobs_path, + output_dir, + } = Cli::parse(); - let file_specs = file_specs::get(); + let file_specs = file_specs::get(&mobs_path); let mut generation_task = generate_static_site(output_dir.clone(), file_specs); generation_task.set_file_result_fn(|progress_report| { @@ -39,4 +44,6 @@ async fn main() { }); generation_task.await.unwrap(); + + tailwind::execute(&output_dir).await; } diff --git a/crates/builder/src/mob.rs b/crates/builder/src/mob.rs index e0cbbb37..0edd9d16 100644 --- a/crates/builder/src/mob.rs +++ b/crates/builder/src/mob.rs @@ -11,18 +11,17 @@ use std::collections::BTreeSet; use std::io; use anyhow::{anyhow, Context, Result}; +use camino::Utf8Path; use chrono::DateTime; use csscolorparser::Color; use getset::Getters; use maud::{html, Markup, Render}; -use once_cell::sync::Lazy; use ssg_child::sources::BytesSource; use ssg_child::sources::ExpectedFiles; use ssg_child::FileSpec; use crate::components::{self, CalendarEvent}; -use crate::constants::MOBS_PATH; use crate::expected_files::ExpectedFilesExt; use crate::markdown::Markdown; use crate::relative_path::RelativePathBuf; @@ -188,15 +187,12 @@ impl Mob { } } -pub(crate) static MOBS: Lazy> = Lazy::new(|| { - std::fs::read_dir(MOBS_PATH.as_path()) - .unwrap() - .map(read_mob) - .collect::>() -}); +pub(crate) fn get_all(mobs_path: &Utf8Path) -> impl IntoIterator { + std::fs::read_dir(mobs_path).unwrap().map(read_mob) +} -pub(crate) fn get_all_participants() -> BTreeSet { - MOBS.iter() +pub(crate) fn get_all_participants(mobs: &[Mob]) -> BTreeSet { + mobs.iter() .flat_map(|mob| mob.participants.clone()) .filter_map(|participant| match participant { Participant::Hidden => None, diff --git a/crates/builder/src/pages.rs b/crates/builder/src/pages.rs index 000d442d..b7c65a3e 100644 --- a/crates/builder/src/pages.rs +++ b/crates/builder/src/pages.rs @@ -3,10 +3,10 @@ mod index; use ssg_child::FileSpec; -use crate::mob::{Mob, MOBS}; +use crate::mob::Mob; -pub(crate) fn all() -> impl Iterator { - [index::page(), add::page()] +pub(crate) fn all(mobs: Vec) -> impl Iterator { + [index::page(&mobs), add::page()] .into_iter() - .chain(MOBS.iter().cloned().map(Mob::page)) + .chain(mobs.into_iter().map(|m| Mob::page(m))) } diff --git a/crates/builder/src/pages/index.rs b/crates/builder/src/pages/index.rs index 24a5171d..0fe21609 100644 --- a/crates/builder/src/pages/index.rs +++ b/crates/builder/src/pages/index.rs @@ -6,17 +6,17 @@ use ssg_child::FileSpec; use crate::components::home_page::event_content_template; use crate::expected_files::ExpectedFilesExt; -use crate::mob::MOBS; +use crate::mob::Mob; use crate::relative_path::RelativePathBuf; use crate::{components, mob}; -pub fn page() -> FileSpec { +pub fn page(mobs: &[Mob]) -> FileSpec { let path = RelativePathBuf::from("/index.html"); let mut expected_files = ExpectedFiles::default(); - let participants = mob::get_all_participants(); + let participants = mob::get_all_participants(mobs); - let events = MOBS + let events = mobs .iter() .filter(|mob| { !matches!( diff --git a/crates/builder/src/tailwind.rs b/crates/builder/src/tailwind.rs index 0d339825..f9356f46 100644 --- a/crates/builder/src/tailwind.rs +++ b/crates/builder/src/tailwind.rs @@ -1,18 +1,20 @@ use std::io::{stdout, Write}; -use anyhow::ensure; use camino::{Utf8Path, Utf8PathBuf}; +use tempfile::NamedTempFile; use tokio::process::Command; -pub(crate) async fn execute(output_dir: &Utf8Path) -> anyhow::Result<()> { - let output = Command::new("npx") +pub(crate) async fn execute(output_dir: &Utf8Path) { + let input_contents = include_bytes!(env!("TAILWINDCSS_INPUT")); + let mut input_file = NamedTempFile::new().unwrap(); + input_file.write_all(input_contents).unwrap(); + + let output = Command::new(env!("TAILWINDCSS")) .args([ - "tailwindcss", + "--config", + env!("TAILWINDCSS_CONFIG"), "--input", - [env!("CARGO_MANIFEST_DIR"), "src", "input.css"] - .iter() - .collect::() - .as_ref(), + input_file.path().to_str().unwrap(), "--output", [".".as_ref(), output_dir, "index.css".as_ref()] .iter() @@ -26,10 +28,10 @@ pub(crate) async fn execute(output_dir: &Utf8Path) -> anyhow::Result<()> { .as_ref(), ]) .output() - .await?; + .await + .unwrap(); - stdout().write_all(&output.stderr)?; + stdout().write_all(&output.stderr).unwrap(); - ensure!(output.status.success()); - Ok(()) + assert!(output.status.success()); } diff --git a/crates/builder/src/url.rs b/crates/builder/src/url.rs index bfa2aec3..103cf4ee 100644 --- a/crates/builder/src/url.rs +++ b/crates/builder/src/url.rs @@ -10,10 +10,6 @@ impl Url { url::Url::parse(input).map(Self) } - pub(crate) fn to_inner(&self) -> &url::Url { - &self.0 - } - pub(crate) fn set_path(&mut self, path: &str) { self.0.set_path(path); } diff --git a/crates/cli/src/input.css b/crates/cli/src/input.css deleted file mode 100644 index 874792c1..00000000 --- a/crates/cli/src/input.css +++ /dev/null @@ -1,9 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - a { - @apply underline; - } -} diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 4215dda6..24fc111f 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1,45 +1,16 @@ #![warn(clippy::all, clippy::pedantic)] -mod tailwind; - use camino::Utf8PathBuf; -use clap::{Parser, Subcommand}; -use once_cell::sync::Lazy; +use clap::Parser; use ssg_parent::Parent; -pub static OUTPUT_DIR: Lazy = Lazy::new(|| { - path_clean::clean( - Utf8PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../.vercel/output/static"), - ) - .try_into() - .unwrap() -}); - #[derive(Debug, Parser)] struct Cli { - #[command(subcommand)] - mode: Option, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Subcommand)] -enum Mode { - /// build the website - Build, - /// watch for changes and rebuild the website - /// and start a development web server - Dev { - /// open website in a browser - #[arg(short, long)] - open: bool, - }, - /// print the output directory path - PrintOutputDir, -} - -impl Default for Mode { - fn default() -> Self { - Mode::Dev { open: true } - } + mobs_path: Utf8PathBuf, + output_dir: Utf8PathBuf, + /// open website in a browser + #[arg(short, long)] + open: bool, } #[tokio::main] @@ -50,29 +21,27 @@ async fn main() { let cli = Cli::parse(); let parent = Parent::new( - OUTPUT_DIR.clone(), + &cli.output_dir, "cargo", - ["run", "--package", "builder", "--", OUTPUT_DIR.as_str()], - ) - .post_build(tailwind::execute); - - match cli.mode.unwrap_or_default() { - Mode::Build => { - parent.build().await.unwrap(); - } - Mode::Dev { open } => { - let error = parent - .dev( - [Utf8PathBuf::from_iter([ - env!("CARGO_MANIFEST_DIR"), - "..", - "builder", - ])], - open, - ) - .await; - panic!("{error}"); - } - Mode::PrintOutputDir => print!("{}", OUTPUT_DIR.as_os_str().to_str().unwrap()), - }; + [ + "run", + "--package", + "builder", + "--", + cli.mobs_path.as_str(), + cli.output_dir.as_str(), + ], + ); + + let error = parent + .dev( + [Utf8PathBuf::from_iter([ + env!("CARGO_MANIFEST_DIR"), + "..", + "builder", + ])], + cli.open, + ) + .await; + panic!("{error}"); } diff --git a/crates/cli/src/tailwind.rs b/crates/cli/src/tailwind.rs deleted file mode 100644 index d64e9c06..00000000 --- a/crates/cli/src/tailwind.rs +++ /dev/null @@ -1,56 +0,0 @@ -use std::io::{stdout, Write}; - -use camino::Utf8PathBuf; -use futures::{future::BoxFuture, FutureExt}; -use tokio::process::Command; - -use crate::OUTPUT_DIR; - -pub(crate) fn execute( -) -> BoxFuture<'static, Result<(), Box>> { - async { - let output = Command::new("npx") - .args([ - "tailwindcss", - "--input", - [env!("CARGO_MANIFEST_DIR"), "src", "input.css"] - .iter() - .collect::() - .as_ref(), - "--output", - [".".as_ref(), OUTPUT_DIR.as_path(), "index.css".as_ref()] - .iter() - .collect::() - .as_ref(), - "--content", - // TODO explicit list instead of pattern - [ - ".".as_ref(), - OUTPUT_DIR.as_path(), - "**".as_ref(), - "*.html".as_ref(), - ] - .iter() - .collect::() - .as_ref(), - ]) - .output() - .await; - - let output = match output { - Ok(output) => output, - Err(error) => return Err(Box::new(error) as Box), - }; - - if let Err(error) = stdout().write_all(&output.stderr) { - return Err(Box::new(error)); - } - - if !output.status.success() { - return Err("tailwind failed".into()); - } - - Ok(()) - } - .boxed() -} diff --git a/crates/reactive/Cargo.toml b/crates/reactive/Cargo.toml index b3baca59..176811ce 100644 --- a/crates/reactive/Cargo.toml +++ b/crates/reactive/Cargo.toml @@ -2,7 +2,7 @@ futures = "0.3.28" notify = "6.1.1" open = "5.0.0" -tokio = "1.29.1" +tokio = {version = "1.29.1", features = ["process"]} [package] name = "reactive" diff --git a/crates/ssg-child/Cargo.toml b/crates/ssg-child/Cargo.toml index aa4c9eb2..390463c3 100644 --- a/crates/ssg-child/Cargo.toml +++ b/crates/ssg-child/Cargo.toml @@ -5,13 +5,10 @@ derive_more = "0.99.17" dirs = "5.0.1" futures = "0.3.24" getset = "0.1.2" -http-cache-reqwest = "0.5.0" lazy-regex = "2.5.0" once_cell = "1.17.1" readext = "0.1.0" relative-path = "1.8.0" -reqwest = {version = "0.11.11", default-features = false, features = ["rustls-tls"]} -reqwest-middleware = "0.2.0" task-local-extensions = "0.1.3" thiserror = "1.0.38" # TODO less features diff --git a/crates/ssg-child/src/disk_caching_http_client.rs b/crates/ssg-child/src/disk_caching_http_client.rs deleted file mode 100644 index 664ffc2b..00000000 --- a/crates/ssg-child/src/disk_caching_http_client.rs +++ /dev/null @@ -1,53 +0,0 @@ -use camino::Utf8PathBuf; -use http_cache_reqwest::{CACacheManager, Cache, CacheMode, HttpCache}; -use once_cell::sync::Lazy; -use reqwest::{Client, Request, Response}; -use reqwest_middleware::{ClientBuilder, ClientWithMiddleware, Middleware, Next, Result}; -use task_local_extensions::Extensions; - -struct LoggingMiddleware; - -#[async_trait::async_trait] -impl Middleware for LoggingMiddleware { - async fn handle( - &self, - req: Request, - extensions: &mut Extensions, - next: Next<'_>, - ) -> Result { - let url = req.url().clone(); - - println!("request {url}"); - - let response = next.run(req, extensions).await; - - if let Ok(response) = &response { - let header_x_cache = response.headers().get("x-cache").unwrap(); - - println!("response {header_x_cache:?} {url}"); - } - - response - } -} - -pub(crate) static HTTP_CLIENT: Lazy = Lazy::new(|| { - const CRATE_NAME: &str = env!("CARGO_CRATE_NAME"); - const UUID: &str = "a6c07a0f-7599-468d-8627-88b85ede9fde"; - - let cache_path = Utf8PathBuf::try_from(dirs::cache_dir().unwrap()) - .unwrap() - .join(format!("{CRATE_NAME}.{UUID}")); - - ClientBuilder::new(Client::new()) - .with(LoggingMiddleware) - .with(Cache(HttpCache { - // TODO don't leave it as ForceCache - mode: CacheMode::ForceCache, - manager: CACacheManager { - path: cache_path.to_string(), - }, - options: None, - })) - .build() -}); diff --git a/crates/ssg-child/src/lib.rs b/crates/ssg-child/src/lib.rs index 6f53ac15..c367043d 100644 --- a/crates/ssg-child/src/lib.rs +++ b/crates/ssg-child/src/lib.rs @@ -1,6 +1,5 @@ #![warn(clippy::all, clippy::pedantic)] -mod disk_caching_http_client; pub mod file_error; mod file_spec; pub mod file_success; diff --git a/crates/ssg-child/src/sources.rs b/crates/ssg-child/src/sources.rs index bb89f4f9..3c836d5e 100644 --- a/crates/ssg-child/src/sources.rs +++ b/crates/ssg-child/src/sources.rs @@ -1,6 +1,6 @@ +mod byte_array; mod bytes; -mod google_font; -mod http; +mod fs_path; mod static_byte_slice; use std::collections::BTreeSet; @@ -8,8 +8,6 @@ use std::collections::BTreeSet; pub use bytes::*; use futures::future::BoxFuture; use getset::Getters; -pub use google_font::*; -pub use http::*; use relative_path::RelativePathBuf; pub trait FileSource { diff --git a/crates/ssg-child/src/sources/byte_array.rs b/crates/ssg-child/src/sources/byte_array.rs new file mode 100644 index 00000000..fab6d0f8 --- /dev/null +++ b/crates/ssg-child/src/sources/byte_array.rs @@ -0,0 +1,12 @@ +use futures::FutureExt; + +use super::{FileContents, FileSource}; + +impl FileSource for &[u8; N] { + fn obtain_content( + &self, + ) -> futures::future::BoxFuture>> + { + async { Ok(FileContents::new(self.to_vec(), None)) }.boxed() + } +} diff --git a/crates/ssg-child/src/sources/fs_path.rs b/crates/ssg-child/src/sources/fs_path.rs new file mode 100644 index 00000000..6787c6e7 --- /dev/null +++ b/crates/ssg-child/src/sources/fs_path.rs @@ -0,0 +1,18 @@ +use std::path::Path; + +use super::{FileContents, FileSource}; +use futures::{future::BoxFuture, FutureExt, TryFutureExt}; + +impl FileSource for Path { + fn obtain_content( + &self, + ) -> BoxFuture<'static, Result>> { + let path = self.to_owned(); + async move { + let bytes = tokio::fs::read(path).await?; + Ok(FileContents::new(bytes, None)) + } + .map_err(|error: std::io::Error| -> Box { Box::new(error) }) + .boxed() + } +} diff --git a/crates/ssg-child/src/sources/google_font.rs b/crates/ssg-child/src/sources/google_font.rs deleted file mode 100644 index f460c02c..00000000 --- a/crates/ssg-child/src/sources/google_font.rs +++ /dev/null @@ -1,123 +0,0 @@ -use std::fmt::Display; - -use futures::{future::BoxFuture, FutureExt, TryFutureExt}; -use getset::Getters; -use lazy_regex::regex_captures; -use readext::ReadExt; -use reqwest::{header::CONTENT_DISPOSITION, Url}; - -use crate::disk_caching_http_client::HTTP_CLIENT; - -use super::{FileContents, FileSource}; - -#[derive(Debug, Clone, Getters)] -pub struct GoogleFont { - #[getset(get = "pub")] - family: String, - subset: String, - variant: String, -} - -impl GoogleFont { - #[must_use] - pub fn new(family: String, subset: String, variant: String) -> Self { - Self { - family, - subset, - variant, - } - } -} - -#[derive(Debug, thiserror::Error)] -enum DownloadError { - #[error(transparent)] - UrlParse(#[from] url::ParseError), - #[error(transparent)] - Http(#[from] reqwest_middleware::Error), - #[error(transparent)] - Zip(#[from] zip::result::ZipError), - #[error(transparent)] - Io(#[from] std::io::Error), - #[error("no Content-Disposition header present")] - NoContentDisposition, - #[error("Content-Disposition value not UTF-8")] - ContentDispositionNotUtf8(#[from] reqwest::header::ToStrError), - #[error("could not parse value of Content-Disposition")] - BadContentDisposition(String), -} - -impl FileSource for GoogleFont { - fn obtain_content( - &self, - ) -> BoxFuture<'static, Result>> { - let Self { - family, - subset, - variant, - } = self.clone(); - - async move { - let url = Url::parse_with_params( - &format!( - "https://gwfh.mranftl.com/api/fonts/{}", - family.to_lowercase(), - ), - [ - ("download", "zip"), - ("subsets", &subset), - ("variants", &variant), - ], - )?; - - let response = HTTP_CLIENT - .get(url.clone()) - .send() - .await? - .error_for_status() - .map_err(reqwest_middleware::Error::Reqwest)?; - - let content_disposition = response - .headers() - .get(CONTENT_DISPOSITION) - .ok_or(DownloadError::NoContentDisposition)? - .to_str()?; - - let (_, version) = regex_captures!( - // `attachment; filename=vollkorn-v22-latin.zip` - r"attachment; filename=.*-v(\d*)-.*", - content_disposition - ) - .ok_or_else(|| DownloadError::BadContentDisposition(content_disposition.to_owned()))?; - - let version = version.to_owned(); - - let archive = response - .bytes() - .await - .map_err(reqwest_middleware::Error::Reqwest)?; - - let mut archive = zip::ZipArchive::new(std::io::Cursor::new(archive))?; - - let mut font_file = archive.by_name(&format!( - "{}-v{}-{}-{}.woff2", - family.to_lowercase(), - version, - subset, - variant - ))?; - - Ok(FileContents::new(font_file.read_into_vec()?, None)) - } - .map_err( - move |error: DownloadError| -> Box { Box::new(error) }, - ) - .boxed() - } -} - -impl Display for GoogleFont { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.family) - } -} diff --git a/crates/ssg-child/src/sources/http.rs b/crates/ssg-child/src/sources/http.rs deleted file mode 100644 index a273be32..00000000 --- a/crates/ssg-child/src/sources/http.rs +++ /dev/null @@ -1,44 +0,0 @@ -use futures::{future::BoxFuture, FutureExt, TryFutureExt}; -use reqwest::Url; - -use crate::disk_caching_http_client::HTTP_CLIENT; - -use super::{FileContents, FileSource}; - -#[derive(Debug, Clone)] -pub struct Http(Url); - -impl From for Http { - fn from(url: Url) -> Self { - Self(url) - } -} - -#[derive(thiserror::Error, Debug)] -#[error(transparent)] -struct HttpError(#[from] reqwest_middleware::Error); - -impl FileSource for Http { - fn obtain_content( - &self, - ) -> BoxFuture<'static, Result>> { - let url = self.0.clone(); - - async { - let bytes = HTTP_CLIENT - .get(url) - .send() - .await? - .error_for_status() - .map_err(reqwest_middleware::Error::Reqwest)? - .bytes() - .await - .map_err(reqwest_middleware::Error::Reqwest)? - .to_vec(); - - Ok(FileContents::new(bytes, None)) - } - .map_err(|error: HttpError| -> Box { Box::new(error) }) - .boxed() - } -} diff --git a/crates/ssg-parent/src/lib.rs b/crates/ssg-parent/src/lib.rs index bc9012fe..b2199e15 100644 --- a/crates/ssg-parent/src/lib.rs +++ b/crates/ssg-parent/src/lib.rs @@ -428,7 +428,7 @@ mod test { let actual = format!("{parent_no_post_build:?}"); let expected = - "Parent { output_dir: \"path/to/there\", builder: AwaitingChild, post_build: None }"; + "Parent { output_dir: \"path/to/there\", builder: AwaitingChild, post_build: None, .. }"; assert_eq!(actual, expected); } } diff --git a/default.nix b/default.nix new file mode 100644 index 00000000..5b04256f --- /dev/null +++ b/default.nix @@ -0,0 +1,17 @@ +{ + perSystem = + { pkgs, config, ... }: + { + packages.default = + pkgs.runCommand "build" + { + nativeBuildInputs = [ + config.nci.outputs.builder.packages.dev + pkgs.git + ]; + } + '' + builder ${./mobs} $out + ''; + }; +} diff --git a/deploy-preview.nix b/deploy-preview.nix new file mode 100644 index 00000000..72f6b4c0 --- /dev/null +++ b/deploy-preview.nix @@ -0,0 +1,15 @@ +{ + perSystem = + { pkgs, ... }: + { + packages.deploy-preview = pkgs.writeShellApplication { + name = "deploy-preview"; + runtimeInputs = [ pkgs.nodePackages.vercel ]; + text = '' + vercel pull --yes --environment=preview --scope mobusoperandi --token="$VERCEL_TOKEN" + URL=$(vercel deploy --prebuilt --token="$VERCEL_TOKEN") + echo "URL=$URL" >> "$GITHUB_OUTPUT" + ''; + }; + }; +} diff --git a/devmode.nix b/devmode.nix new file mode 100644 index 00000000..c484de4b --- /dev/null +++ b/devmode.nix @@ -0,0 +1,23 @@ +{ + perSystem = + { pkgs, ... }: + { + devshells.default = { + devshell.packages = [ + pkgs.coreutils + pkgs.git + ]; + commands = [ + { + name = "devmode"; + command = '' + cargo run \ + $(git rev-parse --show-toplevel)/mobs \ + $(mktemp --directory) \ + --open + ''; + } + ]; + }; + }; +} diff --git a/flake.lock b/flake.lock index 66a12de1..b9b4925f 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,106 @@ { "nodes": { + "FULLCALENDAR": { + "flake": false, + "locked": { + "narHash": "sha256-KbpuhhrZ2TK8Y6YWc+/IWXYKQ7Mt58m5iFz4qF4bXGE=", + "type": "file", + "url": "https://cdn.jsdelivr.net/npm/fullcalendar@6.0.2/index.global.min.js" + }, + "original": { + "type": "file", + "url": "https://cdn.jsdelivr.net/npm/fullcalendar@6.0.2/index.global.min.js" + } + }, + "FULLCALENDAR_RRULE": { + "flake": false, + "locked": { + "narHash": "sha256-hTaXP+kjvPFk/CVdpCx9FqRuR7Rj5fV7KTKNvCQbDLU=", + "type": "file", + "url": "https://cdn.jsdelivr.net/npm/@fullcalendar/rrule@6.0.2/index.global.min.js" + }, + "original": { + "type": "file", + "url": "https://cdn.jsdelivr.net/npm/@fullcalendar/rrule@6.0.2/index.global.min.js" + } + }, + "INVERTICAT_LOGO": { + "flake": false, + "locked": { + "narHash": "sha256-OdzocZO9cgxk/Gho9OnbZtuYshkUQuQYCPy2KavldEY=", + "type": "file", + "url": "https://raw.githubusercontent.com/primer/octicons/v19.0.0/icons/mark-github-16.svg" + }, + "original": { + "type": "file", + "url": "https://raw.githubusercontent.com/primer/octicons/v19.0.0/icons/mark-github-16.svg" + } + }, + "RRULE": { + "flake": false, + "locked": { + "narHash": "sha256-A2GtRCHmuW0ZU3miK1ocU9IkuBw7ASMxkq5a6UVPtYA=", + "type": "file", + "url": "https://cdn.jsdelivr.net/npm/rrule@2.7.2/dist/es5/rrule.min.js" + }, + "original": { + "type": "file", + "url": "https://cdn.jsdelivr.net/npm/rrule@2.7.2/dist/es5/rrule.min.js" + } + }, + "TWITTER_LOGO": { + "flake": false, + "locked": { + "narHash": "sha256-a5IGAh2IqK5B4WyCS5/uZ8Cijh74KxHxi5kj1lRCSYk=", + "type": "file", + "url": "https://cdn.svgporn.com/logos/twitter.svg" + }, + "original": { + "type": "file", + "url": "https://cdn.svgporn.com/logos/twitter.svg" + } + }, + "YOUTUBE_LOGO": { + "flake": false, + "locked": { + "narHash": "sha256-STGB9hLLHAY5e6qadc0mNDMOqPhG96OSlUx/9Owovms=", + "type": "file", + "url": "https://upload.wikimedia.org/wikipedia/commons/0/09/YouTube_full-color_icon_%282017%29.svg" + }, + "original": { + "type": "file", + "url": "https://upload.wikimedia.org/wikipedia/commons/0/09/YouTube_full-color_icon_%282017%29.svg" + } + }, + "ZULIP_LOGO": { + "flake": false, + "locked": { + "narHash": "sha256-WJgwor7BYAJFAsovkDZbainkq73qg+ToQ+nYs1nQVRM=", + "type": "file", + "url": "https://raw.githubusercontent.com/zulip/zulip/main/static/images/logo/zulip-icon-square.svg" + }, + "original": { + "type": "file", + "url": "https://raw.githubusercontent.com/zulip/zulip/main/static/images/logo/zulip-icon-square.svg" + } + }, + "crane": { + "flake": false, + "locked": { + "lastModified": 1727316705, + "narHash": "sha256-/mumx8AQ5xFuCJqxCIOFCHTVlxHkMT21idpbgbm/TIE=", + "owner": "ipetkov", + "repo": "crane", + "rev": "5b03654ce046b5167e7b0bccbd8244cb56c16f0e", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "ref": "v0.19.0", + "repo": "crane", + "type": "github" + } + }, "devshell": { "inputs": { "nixpkgs": [ @@ -20,6 +121,45 @@ "type": "github" } }, + "dream2nix": { + "inputs": { + "nixpkgs": [ + "nci", + "nixpkgs" + ], + "purescript-overlay": "purescript-overlay", + "pyproject-nix": "pyproject-nix" + }, + "locked": { + "lastModified": 1731424167, + "narHash": "sha256-nKKeRwq7mxcW8cBTmPKzSg0DR/inVrtuJudVM81GISU=", + "owner": "nix-community", + "repo": "dream2nix", + "rev": "44d41411686bc798876bd6d9f36a4c1143138d85", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "dream2nix", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -40,6 +180,52 @@ "type": "github" } }, + "mk-naked-shell": { + "flake": false, + "locked": { + "lastModified": 1681286841, + "narHash": "sha256-3XlJrwlR0nBiREnuogoa5i1b4+w/XPe0z8bbrJASw0g=", + "owner": "yusdacra", + "repo": "mk-naked-shell", + "rev": "7612f828dd6f22b7fb332cc69440e839d7ffe6bd", + "type": "github" + }, + "original": { + "owner": "yusdacra", + "repo": "mk-naked-shell", + "type": "github" + } + }, + "nci": { + "inputs": { + "crane": "crane", + "dream2nix": "dream2nix", + "mk-naked-shell": "mk-naked-shell", + "nixpkgs": [ + "nixpkgs" + ], + "parts": [ + "flake-parts" + ], + "rust-overlay": "rust-overlay", + "treefmt": [ + "treefmt-nix" + ] + }, + "locked": { + "lastModified": 1731605339, + "narHash": "sha256-O0vWXiC1pBYXgdsKbQGw0Jev8Sc6dxR9Up0NKgIeH9g=", + "owner": "yusdacra", + "repo": "nix-cargo-integration", + "rev": "1680ec3b8192fe4a0e8ca4973affcd1f4bb67de3", + "type": "github" + }, + "original": { + "owner": "yusdacra", + "repo": "nix-cargo-integration", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1730272153, @@ -55,15 +241,108 @@ "type": "indirect" } }, + "purescript-overlay": { + "inputs": { + "flake-compat": "flake-compat", + "nixpkgs": [ + "nci", + "dream2nix", + "nixpkgs" + ], + "slimlock": "slimlock" + }, + "locked": { + "lastModified": 1728546539, + "narHash": "sha256-Sws7w0tlnjD+Bjck1nv29NjC5DbL6nH5auL9Ex9Iz2A=", + "owner": "thomashoneyman", + "repo": "purescript-overlay", + "rev": "4ad4c15d07bd899d7346b331f377606631eb0ee4", + "type": "github" + }, + "original": { + "owner": "thomashoneyman", + "repo": "purescript-overlay", + "type": "github" + } + }, + "pyproject-nix": { + "flake": false, + "locked": { + "lastModified": 1702448246, + "narHash": "sha256-hFg5s/hoJFv7tDpiGvEvXP0UfFvFEDgTdyHIjDVHu1I=", + "owner": "davhau", + "repo": "pyproject.nix", + "rev": "5a06a2697b228c04dd2f35659b4b659ca74f7aeb", + "type": "github" + }, + "original": { + "owner": "davhau", + "ref": "dream2nix", + "repo": "pyproject.nix", + "type": "github" + } + }, "root": { "inputs": { + "FULLCALENDAR": "FULLCALENDAR", + "FULLCALENDAR_RRULE": "FULLCALENDAR_RRULE", + "INVERTICAT_LOGO": "INVERTICAT_LOGO", + "RRULE": "RRULE", + "TWITTER_LOGO": "TWITTER_LOGO", + "YOUTUBE_LOGO": "YOUTUBE_LOGO", + "ZULIP_LOGO": "ZULIP_LOGO", "devshell": "devshell", "flake-parts": "flake-parts", + "nci": "nci", "nixpkgs": "nixpkgs", "systems": "systems", "treefmt-nix": "treefmt-nix" } }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "nci", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1731551344, + "narHash": "sha256-wr8OOqgw7M1pWfe4W7WA5lErzOVMg3zvrrxx/dy/nPo=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "27570abfd3461875f11fc07c9b01c141a6332b4f", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "slimlock": { + "inputs": { + "nixpkgs": [ + "nci", + "dream2nix", + "purescript-overlay", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688756706, + "narHash": "sha256-xzkkMv3neJJJ89zo3o2ojp7nFeaZc2G0fYwNXNJRFlo=", + "owner": "thomashoneyman", + "repo": "slimlock", + "rev": "cf72723f59e2340d24881fd7bf61cb113b4c407c", + "type": "github" + }, + "original": { + "owner": "thomashoneyman", + "repo": "slimlock", + "type": "github" + } + }, "systems": { "locked": { "lastModified": 1681028828, diff --git a/flake.nix b/flake.nix index 1c868211..e1a42560 100644 --- a/flake.nix +++ b/flake.nix @@ -12,23 +12,71 @@ inputs.nixpkgs-lib.follows = "nixpkgs"; }; + FULLCALENDAR = { + flake = false; + url = "https://cdn.jsdelivr.net/npm/fullcalendar@6.0.2/index.global.min.js"; + }; + + FULLCALENDAR_RRULE = { + flake = false; + url = "https://cdn.jsdelivr.net/npm/@fullcalendar/rrule@6.0.2/index.global.min.js"; + }; + + INVERTICAT_LOGO = { + flake = false; + url = "https://raw.githubusercontent.com/primer/octicons/v19.0.0/icons/mark-github-16.svg"; + }; + + nci = { + url = "github:yusdacra/nix-cargo-integration"; + inputs = { + nixpkgs.follows = "nixpkgs"; + parts.follows = "flake-parts"; + treefmt.follows = "treefmt-nix"; + }; + }; + nixpkgs.url = "nixpkgs/nixpkgs-unstable"; + RRULE = { + flake = false; + url = "https://cdn.jsdelivr.net/npm/rrule@2.7.2/dist/es5/rrule.min.js"; + }; + systems.url = "github:nix-systems/default"; treefmt-nix = { url = "github:numtide/treefmt-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; + + TWITTER_LOGO = { + flake = false; + url = "https://cdn.svgporn.com/logos/twitter.svg"; + }; + + YOUTUBE_LOGO = { + flake = false; + url = "https://upload.wikimedia.org/wikipedia/commons/0/09/YouTube_full-color_icon_%282017%29.svg"; + }; + + ZULIP_LOGO = { + flake = false; + url = "https://raw.githubusercontent.com/zulip/zulip/main/static/images/logo/zulip-icon-square.svg"; + }; }; outputs = inputs: inputs.flake-parts.lib.mkFlake { inherit inputs; } { imports = [ + ./crates/builder + ./default.nix + ./deploy-preview.nix + ./devmode.nix ./fmt.nix + ./nci.nix ./systems.nix - inputs.devshell.flakeModule ]; }; } diff --git a/nci.nix b/nci.nix new file mode 100644 index 00000000..3433b4f4 --- /dev/null +++ b/nci.nix @@ -0,0 +1,24 @@ +{ inputs, lib, ... }: +{ + imports = [ + inputs.nci.flakeModule + inputs.devshell.flakeModule + ]; + + perSystem = + { config, pkgs, ... }: + { + nci.projects.default = { + numtideDevshell = "default"; + path = ./.; + }; + + devshells.default = { + devshell.packages = [ + pkgs.rust-analyzer + pkgs.typescript + ]; + env = lib.concatMapAttrs (_: crate: crate.drvConfig.env) config.nci.crates |> lib.attrsToList; + }; + }; +} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 4522aba6..00000000 --- a/package-lock.json +++ /dev/null @@ -1,1050 +0,0 @@ -{ - "name": "website", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "version": "1.0.0", - "devDependencies": { - "@tailwindcss/typography": "0.5.9", - "tailwindcss": "3.3.2" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.9.tgz", - "integrity": "sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==", - "dev": true, - "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sucrase": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", - "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", - "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", - "dev": 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.2.12", - "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.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", - "dev": true, - "engines": { - "node": ">= 14" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index c952a85e..00000000 --- a/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": "1.0.0", - "devDependencies": { - "@tailwindcss/typography": "0.5.9", - "tailwindcss": "3.3.2" - } -} diff --git a/rust-toolchain.toml b/rust-toolchain.toml deleted file mode 100644 index 292fe499..00000000 --- a/rust-toolchain.toml +++ /dev/null @@ -1,2 +0,0 @@ -[toolchain] -channel = "stable" diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index f7d8a60c..00000000 --- a/tailwind.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - plugins: [require("@tailwindcss/typography")], -};