website

#astro#js#html#css

git clone https://git.pyrossh.dev/website

木 Personal website of pyrossh. Built with astrojs, shiki, vite.


778e0a4pyrossh 2026-08-05T10:34:09+05:30
add infra
.gitignore CHANGED
@@ -6,3 +6,7 @@ dist/
6
6
  .wrangler/
7
7
  playwright-report/
8
8
  test-results/
9
+ infra/.terraform/
10
+ infra/*.tfstate
11
+ infra/*.tfstate.*
12
+ infra/terraform.tfvars
infra/.terraform.lock.hcl ADDED
@@ -0,0 +1,19 @@
1
+ # This file is maintained automatically by "terraform init".
2
+ # Manual edits may be lost in future updates.
3
+
4
+ provider "registry.terraform.io/cloudflare/cloudflare" {
5
+ version = "5.22.0"
6
+ constraints = "~> 5.0"
7
+ hashes = [
8
+ "h1:H3XmcpcMLeDyuGU6QsBXeVOB2CQGnIVRt6PJf7hfrtE=",
9
+ "zh:45f3b7c50254b1da1dc21e77e03cd1e931cab40fb75c7cba822a53ed54cd232e",
10
+ "zh:8437138c0af1a1a557b516ca42dae54499933cc81072396abe7eefd267218f79",
11
+ "zh:9140044a3c909e1a2767c8b2dd95370b8152bcbc7cb26c47e376e81f75512d32",
12
+ "zh:b69a80d2bb33059e93dec94490065fe210c621d8bdf32d745b1d1972aa85abbf",
13
+ "zh:ca4bf16742a7e59319a482f003d32f6f6abbc5fbf862916ce1a136278e6d420d",
14
+ "zh:cd767016ea7382e384e560f6ddb302637ecb1b53ece15c9326032010effe6c33",
15
+ "zh:d952f92ae1a688ed376757127ae1aa3b625571bf1fc606214a5822eae98213e0",
16
+ "zh:f5213814c8ca0d736623438b283143b9a7f98e72ca4992eb906966e7f8cc383b",
17
+ "zh:f809ab383cca0a5f83072981c64208cbd7fa67e986a86ee02dd2c82333221e32",
18
+ ]
19
+ }
infra/main.tf ADDED
@@ -0,0 +1,44 @@
1
+ terraform {
2
+ required_providers {
3
+ cloudflare = {
4
+ source = "cloudflare/cloudflare"
5
+ version = "~> 5.0"
6
+ }
7
+ }
8
+ }
9
+
10
+ provider "cloudflare" {}
11
+
12
+ resource "cloudflare_r2_bucket" "website" {
13
+ account_id = var.cloudflare_account_id
14
+ name = "website"
15
+ }
16
+
17
+ resource "cloudflare_r2_custom_domain" "website" {
18
+ account_id = var.cloudflare_account_id
19
+ bucket_name = cloudflare_r2_bucket.website.name
20
+ domain = "pyrossh.dev"
21
+ zone_id = var.cloudflare_zone_id
22
+ enabled = true
23
+ }
24
+
25
+ # Syncs ../dist into the bucket on every `terraform apply` — `terraform_data`
26
+ # has no real infra state of its own, so `triggers_replace` on a timestamp is
27
+ # the standard way to force its provisioner to re-run every time rather than
28
+ # only on the first apply. `rclone sync` (not `copy`) both uploads changed
29
+ # files and deletes remote objects no longer present locally, so the bucket
30
+ # always matches the latest build exactly.
31
+ #
32
+ # Requires `rclone` on the machine running `terraform apply`, with a remote
33
+ # named "website" configured for R2 (`rclone config`) — an S3-compatible
34
+ # access key/secret scoped to this bucket, not the Cloudflare API token used
35
+ # above.
36
+ resource "terraform_data" "sync_website" {
37
+ triggers_replace = [timestamp()]
38
+
39
+ depends_on = [cloudflare_r2_bucket.website]
40
+
41
+ provisioner "local-exec" {
42
+ command = "rclone sync ${path.module}/../dist website:${cloudflare_r2_bucket.website.name} --checksum --fast-list"
43
+ }
44
+ }
infra/outputs.tf ADDED
@@ -0,0 +1,11 @@
1
+ output "bucket_name" {
2
+ value = cloudflare_r2_bucket.website.name
3
+ }
4
+
5
+ output "custom_domain_ownership_status" {
6
+ value = cloudflare_r2_custom_domain.website.status.ownership
7
+ }
8
+
9
+ output "custom_domain_ssl_status" {
10
+ value = cloudflare_r2_custom_domain.website.status.ssl
11
+ }
infra/variables.tf ADDED
@@ -0,0 +1,11 @@
1
+ variable "cloudflare_account_id" {
2
+ description = "Cloudflare account ID"
3
+ type = string
4
+ default = "dfdb8ca4e419990852eb214c5b50bd5e"
5
+ }
6
+
7
+ variable "cloudflare_zone_id" {
8
+ description = "Zone ID for the pyrossh.dev zone"
9
+ type = string
10
+ default = "e95a5d8957b75859c814579deebfce33"
11
+ }
package-lock.json CHANGED
@@ -5,7 +5,6 @@
5
5
  "packages": {
6
6
  "": {
7
7
  "name": "pyrossh-dev",
8
- "hasInstallScript": true,
9
8
  "dependencies": {
10
9
  "diff2html": "^3.4.52",
11
10
  "htmx.org": "^2.0.4",
@@ -16,8 +15,7 @@
16
15
  "@11ty/eleventy": "^3.0.0",
17
16
  "@11ty/eleventy-plugin-rss": "^2.0.0",
18
17
  "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0",
19
- "@iconify-json/vscode-icons": "^1.2.68",
18
+ "@iconify-json/vscode-icons": "^1.2.68"
20
- "patch-package": "^8.0.1"
21
19
  }
22
20
  },
23
21
  "node_modules/@11ty/dependency-tree": {
@@ -298,13 +296,6 @@
298
296
  "url": "https://github.com/sponsors/sindresorhus"
299
297
  }
300
298
  },
301
- "node_modules/@yarnpkg/lockfile": {
302
- "version": "1.1.0",
303
- "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
304
- "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
305
- "dev": true,
306
- "license": "BSD-2-Clause"
307
- },
308
299
  "node_modules/a-sync-waterfall": {
309
300
  "version": "1.0.1",
310
301
  "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz",
@@ -344,22 +335,6 @@
344
335
  "node": ">=0.4.0"
345
336
  }
346
337
  },
347
- "node_modules/ansi-styles": {
348
- "version": "4.3.0",
349
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
350
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
351
- "dev": true,
352
- "license": "MIT",
353
- "dependencies": {
354
- "color-convert": "^2.0.1"
355
- },
356
- "engines": {
357
- "node": ">=8"
358
- },
359
- "funding": {
360
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
361
- }
362
- },
363
338
  "node_modules/anymatch": {
364
339
  "version": "3.1.3",
365
340
  "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -484,73 +459,6 @@
484
459
  "node": ">=8"
485
460
  }
486
461
  },
487
- "node_modules/call-bind": {
488
- "version": "1.0.9",
489
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
490
- "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
491
- "dev": true,
492
- "license": "MIT",
493
- "dependencies": {
494
- "call-bind-apply-helpers": "^1.0.2",
495
- "es-define-property": "^1.0.1",
496
- "get-intrinsic": "^1.3.0",
497
- "set-function-length": "^1.2.2"
498
- },
499
- "engines": {
500
- "node": ">= 0.4"
501
- },
502
- "funding": {
503
- "url": "https://github.com/sponsors/ljharb"
504
- }
505
- },
506
- "node_modules/call-bind-apply-helpers": {
507
- "version": "1.0.2",
508
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
509
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
510
- "dev": true,
511
- "license": "MIT",
512
- "dependencies": {
513
- "es-errors": "^1.3.0",
514
- "function-bind": "^1.1.2"
515
- },
516
- "engines": {
517
- "node": ">= 0.4"
518
- }
519
- },
520
- "node_modules/call-bound": {
521
- "version": "1.0.4",
522
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
523
- "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
524
- "dev": true,
525
- "license": "MIT",
526
- "dependencies": {
527
- "call-bind-apply-helpers": "^1.0.2",
528
- "get-intrinsic": "^1.3.0"
529
- },
530
- "engines": {
531
- "node": ">= 0.4"
532
- },
533
- "funding": {
534
- "url": "https://github.com/sponsors/ljharb"
535
- }
536
- },
537
- "node_modules/chalk": {
538
- "version": "4.1.2",
539
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
540
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
541
- "dev": true,
542
- "license": "MIT",
543
- "dependencies": {
544
- "ansi-styles": "^4.1.0",
545
- "supports-color": "^7.1.0"
546
- },
547
- "engines": {
548
- "node": ">=10"
549
- },
550
- "funding": {
551
- "url": "https://github.com/chalk/chalk?sponsor=1"
552
- }
553
- },
554
462
  "node_modules/chokidar": {
555
463
  "version": "3.6.0",
556
464
  "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -576,42 +484,6 @@
576
484
  "fsevents": "~2.3.2"
577
485
  }
578
486
  },
579
- "node_modules/ci-info": {
580
- "version": "3.9.0",
581
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
582
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
583
- "dev": true,
584
- "funding": [
585
- {
586
- "type": "github",
587
- "url": "https://github.com/sponsors/sibiraj-s"
588
- }
589
- ],
590
- "license": "MIT",
591
- "engines": {
592
- "node": ">=8"
593
- }
594
- },
595
- "node_modules/color-convert": {
596
- "version": "2.0.1",
597
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
598
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
599
- "dev": true,
600
- "license": "MIT",
601
- "dependencies": {
602
- "color-name": "~1.1.4"
603
- },
604
- "engines": {
605
- "node": ">=7.0.0"
606
- }
607
- },
608
- "node_modules/color-name": {
609
- "version": "1.1.4",
610
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
611
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
612
- "dev": true,
613
- "license": "MIT"
614
- },
615
487
  "node_modules/commander": {
616
488
  "version": "10.0.1",
617
489
  "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
@@ -629,21 +501,6 @@
629
501
  "dev": true,
630
502
  "license": "MIT"
631
503
  },
632
- "node_modules/cross-spawn": {
633
- "version": "7.0.6",
634
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
635
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
636
- "dev": true,
637
- "license": "MIT",
638
- "dependencies": {
639
- "path-key": "^3.1.0",
640
- "shebang-command": "^2.0.0",
641
- "which": "^2.0.1"
642
- },
643
- "engines": {
644
- "node": ">= 8"
645
- }
646
- },
647
504
  "node_modules/debug": {
648
505
  "version": "4.4.3",
649
506
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -662,24 +519,6 @@
662
519
  }
663
520
  }
664
521
  },
665
- "node_modules/define-data-property": {
666
- "version": "1.1.4",
667
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
668
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
669
- "dev": true,
670
- "license": "MIT",
671
- "dependencies": {
672
- "es-define-property": "^1.0.0",
673
- "es-errors": "^1.3.0",
674
- "gopd": "^1.0.1"
675
- },
676
- "engines": {
677
- "node": ">= 0.4"
678
- },
679
- "funding": {
680
- "url": "https://github.com/sponsors/ljharb"
681
- }
682
- },
683
522
  "node_modules/depd": {
684
523
  "version": "2.0.0",
685
524
  "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -725,21 +564,6 @@
725
564
  "highlight.js": "11.11.1"
726
565
  }
727
566
  },
728
- "node_modules/dunder-proto": {
729
- "version": "1.0.1",
730
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
731
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
732
- "dev": true,
733
- "license": "MIT",
734
- "dependencies": {
735
- "call-bind-apply-helpers": "^1.0.1",
736
- "es-errors": "^1.3.0",
737
- "gopd": "^1.2.0"
738
- },
739
- "engines": {
740
- "node": ">= 0.4"
741
- }
742
- },
743
567
  "node_modules/ee-first": {
744
568
  "version": "1.1.1",
745
569
  "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -783,39 +607,6 @@
783
607
  "errno": "cli.js"
784
608
  }
785
609
  },
786
- "node_modules/es-define-property": {
787
- "version": "1.0.1",
788
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
789
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
790
- "dev": true,
791
- "license": "MIT",
792
- "engines": {
793
- "node": ">= 0.4"
794
- }
795
- },
796
- "node_modules/es-errors": {
797
- "version": "1.3.0",
798
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
799
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
800
- "dev": true,
801
- "license": "MIT",
802
- "engines": {
803
- "node": ">= 0.4"
804
- }
805
- },
806
- "node_modules/es-object-atoms": {
807
- "version": "1.1.2",
808
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
809
- "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
810
- "dev": true,
811
- "license": "MIT",
812
- "dependencies": {
813
- "es-errors": "^1.3.0"
814
- },
815
- "engines": {
816
- "node": ">= 0.4"
817
- }
818
- },
819
610
  "node_modules/escape-html": {
820
611
  "version": "1.0.3",
821
612
  "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -966,16 +757,6 @@
966
757
  "dev": true,
967
758
  "license": "MIT"
968
759
  },
969
- "node_modules/find-yarn-workspace-root": {
970
- "version": "2.0.0",
971
- "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz",
972
- "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==",
973
- "dev": true,
974
- "license": "Apache-2.0",
975
- "dependencies": {
976
- "micromatch": "^4.0.2"
977
- }
978
- },
979
760
  "node_modules/fresh": {
980
761
  "version": "2.0.0",
981
762
  "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
@@ -986,21 +767,6 @@
986
767
  "node": ">= 0.8"
987
768
  }
988
769
  },
989
- "node_modules/fs-extra": {
990
- "version": "10.1.0",
991
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
992
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
993
- "dev": true,
994
- "license": "MIT",
995
- "dependencies": {
996
- "graceful-fs": "^4.2.0",
997
- "jsonfile": "^6.0.1",
998
- "universalify": "^2.0.0"
999
- },
1000
- "engines": {
1001
- "node": ">=12"
1002
- }
1003
- },
1004
770
  "node_modules/fsevents": {
1005
771
  "version": "2.3.3",
1006
772
  "dev": true,
@@ -1013,55 +779,6 @@
1013
779
  "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1014
780
  }
1015
781
  },
1016
- "node_modules/function-bind": {
1017
- "version": "1.1.2",
1018
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1019
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1020
- "dev": true,
1021
- "license": "MIT",
1022
- "funding": {
1023
- "url": "https://github.com/sponsors/ljharb"
1024
- }
1025
- },
1026
- "node_modules/get-intrinsic": {
1027
- "version": "1.3.0",
1028
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
1029
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
1030
- "dev": true,
1031
- "license": "MIT",
1032
- "dependencies": {
1033
- "call-bind-apply-helpers": "^1.0.2",
1034
- "es-define-property": "^1.0.1",
1035
- "es-errors": "^1.3.0",
1036
- "es-object-atoms": "^1.1.1",
1037
- "function-bind": "^1.1.2",
1038
- "get-proto": "^1.0.1",
1039
- "gopd": "^1.2.0",
1040
- "has-symbols": "^1.1.0",
1041
- "hasown": "^2.0.2",
1042
- "math-intrinsics": "^1.1.0"
1043
- },
1044
- "engines": {
1045
- "node": ">= 0.4"
1046
- },
1047
- "funding": {
1048
- "url": "https://github.com/sponsors/ljharb"
1049
- }
1050
- },
1051
- "node_modules/get-proto": {
1052
- "version": "1.0.1",
1053
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
1054
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
1055
- "dev": true,
1056
- "license": "MIT",
1057
- "dependencies": {
1058
- "dunder-proto": "^1.0.1",
1059
- "es-object-atoms": "^1.0.0"
1060
- },
1061
- "engines": {
1062
- "node": ">= 0.4"
1063
- }
1064
- },
1065
782
  "node_modules/glob-parent": {
1066
783
  "version": "5.1.2",
1067
784
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -1075,26 +792,6 @@
1075
792
  "node": ">= 6"
1076
793
  }
1077
794
  },
1078
- "node_modules/gopd": {
1079
- "version": "1.2.0",
1080
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
1081
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
1082
- "dev": true,
1083
- "license": "MIT",
1084
- "engines": {
1085
- "node": ">= 0.4"
1086
- },
1087
- "funding": {
1088
- "url": "https://github.com/sponsors/ljharb"
1089
- }
1090
- },
1091
- "node_modules/graceful-fs": {
1092
- "version": "4.2.11",
1093
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
1094
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
1095
- "dev": true,
1096
- "license": "ISC"
1097
- },
1098
795
  "node_modules/gray-matter": {
1099
796
  "version": "4.0.3",
1100
797
  "dev": true,
@@ -1129,55 +826,6 @@
1129
826
  "js-yaml": "bin/js-yaml.js"
1130
827
  }
1131
828
  },
1132
- "node_modules/has-flag": {
1133
- "version": "4.0.0",
1134
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1135
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1136
- "dev": true,
1137
- "license": "MIT",
1138
- "engines": {
1139
- "node": ">=8"
1140
- }
1141
- },
1142
- "node_modules/has-property-descriptors": {
1143
- "version": "1.0.2",
1144
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
1145
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
1146
- "dev": true,
1147
- "license": "MIT",
1148
- "dependencies": {
1149
- "es-define-property": "^1.0.0"
1150
- },
1151
- "funding": {
1152
- "url": "https://github.com/sponsors/ljharb"
1153
- }
1154
- },
1155
- "node_modules/has-symbols": {
1156
- "version": "1.1.0",
1157
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
1158
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
1159
- "dev": true,
1160
- "license": "MIT",
1161
- "engines": {
1162
- "node": ">= 0.4"
1163
- },
1164
- "funding": {
1165
- "url": "https://github.com/sponsors/ljharb"
1166
- }
1167
- },
1168
- "node_modules/hasown": {
1169
- "version": "2.0.4",
1170
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
1171
- "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
1172
- "dev": true,
1173
- "license": "MIT",
1174
- "dependencies": {
1175
- "function-bind": "^1.1.2"
1176
- },
1177
- "engines": {
1178
- "node": ">= 0.4"
1179
- }
1180
- },
1181
829
  "node_modules/highlight.js": {
1182
830
  "version": "11.11.1",
1183
831
  "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz",
@@ -1282,22 +930,6 @@
1282
930
  "url": "https://github.com/sponsors/wooorm"
1283
931
  }
1284
932
  },
1285
- "node_modules/is-docker": {
1286
- "version": "2.2.1",
1287
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
1288
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
1289
- "dev": true,
1290
- "license": "MIT",
1291
- "bin": {
1292
- "is-docker": "cli.js"
1293
- },
1294
- "engines": {
1295
- "node": ">=8"
1296
- },
1297
- "funding": {
1298
- "url": "https://github.com/sponsors/sindresorhus"
1299
- }
1300
- },
1301
933
  "node_modules/is-extendable": {
1302
934
  "version": "0.1.1",
1303
935
  "dev": true,
@@ -1346,33 +978,6 @@
1346
978
  "node": ">=0.12.0"
1347
979
  }
1348
980
  },
1349
- "node_modules/is-wsl": {
1350
- "version": "2.2.0",
1351
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
1352
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
1353
- "dev": true,
1354
- "license": "MIT",
1355
- "dependencies": {
1356
- "is-docker": "^2.0.0"
1357
- },
1358
- "engines": {
1359
- "node": ">=8"
1360
- }
1361
- },
1362
- "node_modules/isarray": {
1363
- "version": "2.0.5",
1364
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
1365
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
1366
- "dev": true,
1367
- "license": "MIT"
1368
- },
1369
- "node_modules/isexe": {
1370
- "version": "2.0.0",
1371
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1372
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1373
- "dev": true,
1374
- "license": "ISC"
1375
- },
1376
981
  "node_modules/iso-639-1": {
1377
982
  "version": "3.1.6",
1378
983
  "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-3.1.6.tgz",
@@ -1406,49 +1011,6 @@
1406
1011
  "js-yaml": "bin/js-yaml.js"
1407
1012
  }
1408
1013
  },
1409
- "node_modules/json-stable-stringify": {
1410
- "version": "1.3.0",
1411
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz",
1412
- "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==",
1413
- "dev": true,
1414
- "license": "MIT",
1415
- "dependencies": {
1416
- "call-bind": "^1.0.8",
1417
- "call-bound": "^1.0.4",
1418
- "isarray": "^2.0.5",
1419
- "jsonify": "^0.0.1",
1420
- "object-keys": "^1.1.1"
1421
- },
1422
- "engines": {
1423
- "node": ">= 0.4"
1424
- },
1425
- "funding": {
1426
- "url": "https://github.com/sponsors/ljharb"
1427
- }
1428
- },
1429
- "node_modules/jsonfile": {
1430
- "version": "6.2.1",
1431
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
1432
- "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
1433
- "dev": true,
1434
- "license": "MIT",
1435
- "dependencies": {
1436
- "universalify": "^2.0.0"
1437
- },
1438
- "optionalDependencies": {
1439
- "graceful-fs": "^4.1.6"
1440
- }
1441
- },
1442
- "node_modules/jsonify": {
1443
- "version": "0.0.1",
1444
- "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz",
1445
- "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==",
1446
- "dev": true,
1447
- "license": "Public Domain",
1448
- "funding": {
1449
- "url": "https://github.com/sponsors/ljharb"
1450
- }
1451
- },
1452
1014
  "node_modules/junk": {
1453
1015
  "version": "3.1.0",
1454
1016
  "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz",
@@ -1467,16 +1029,6 @@
1467
1029
  "node": ">=0.10.0"
1468
1030
  }
1469
1031
  },
1470
- "node_modules/klaw-sync": {
1471
- "version": "6.0.0",
1472
- "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
1473
- "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
1474
- "dev": true,
1475
- "license": "MIT",
1476
- "dependencies": {
1477
- "graceful-fs": "^4.1.11"
1478
- }
1479
- },
1480
1032
  "node_modules/kleur": {
1481
1033
  "version": "4.1.5",
1482
1034
  "dev": true,
@@ -1581,49 +1133,12 @@
1581
1133
  "url": "https://github.com/fb55/entities?sponsor=1"
1582
1134
  }
1583
1135
  },
1584
- "node_modules/math-intrinsics": {
1585
- "version": "1.1.0",
1586
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
1587
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
1588
- "dev": true,
1589
- "license": "MIT",
1590
- "engines": {
1591
- "node": ">= 0.4"
1592
- }
1593
- },
1594
1136
  "node_modules/mdurl": {
1595
1137
  "version": "2.1.0",
1596
1138
  "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz",
1597
1139
  "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==",
1598
1140
  "license": "MIT"
1599
1141
  },
1600
- "node_modules/micromatch": {
1601
- "version": "4.0.8",
1602
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
1603
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
1604
- "dev": true,
1605
- "license": "MIT",
1606
- "dependencies": {
1607
- "braces": "^3.0.3",
1608
- "picomatch": "^2.3.1"
1609
- },
1610
- "engines": {
1611
- "node": ">=8.6"
1612
- }
1613
- },
1614
- "node_modules/micromatch/node_modules/picomatch": {
1615
- "version": "2.3.2",
1616
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
1617
- "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
1618
- "dev": true,
1619
- "license": "MIT",
1620
- "engines": {
1621
- "node": ">=8.6"
1622
- },
1623
- "funding": {
1624
- "url": "https://github.com/sponsors/jonschlinkert"
1625
- }
1626
- },
1627
1142
  "node_modules/mime": {
1628
1143
  "version": "3.0.0",
1629
1144
  "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
@@ -1789,16 +1304,6 @@
1789
1304
  "node": ">= 6"
1790
1305
  }
1791
1306
  },
1792
- "node_modules/object-keys": {
1793
- "version": "1.1.1",
1794
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1795
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
1796
- "dev": true,
1797
- "license": "MIT",
1798
- "engines": {
1799
- "node": ">= 0.4"
1800
- }
1801
- },
1802
1307
  "node_modules/on-finished": {
1803
1308
  "version": "2.4.1",
1804
1309
  "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@@ -1812,23 +1317,6 @@
1812
1317
  "node": ">= 0.8"
1813
1318
  }
1814
1319
  },
1815
- "node_modules/open": {
1816
- "version": "7.4.2",
1817
- "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
1818
- "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
1819
- "dev": true,
1820
- "license": "MIT",
1821
- "dependencies": {
1822
- "is-docker": "^2.0.0",
1823
- "is-wsl": "^2.1.1"
1824
- },
1825
- "engines": {
1826
- "node": ">=8"
1827
- },
1828
- "funding": {
1829
- "url": "https://github.com/sponsors/sindresorhus"
1830
- }
1831
- },
1832
1320
  "node_modules/parse-srcset": {
1833
1321
  "version": "1.0.2",
1834
1322
  "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
@@ -1846,56 +1334,6 @@
1846
1334
  "node": ">= 0.8"
1847
1335
  }
1848
1336
  },
1849
- "node_modules/patch-package": {
1850
- "version": "8.0.1",
1851
- "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz",
1852
- "integrity": "sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==",
1853
- "dev": true,
1854
- "license": "MIT",
1855
- "dependencies": {
1856
- "@yarnpkg/lockfile": "^1.1.0",
1857
- "chalk": "^4.1.2",
1858
- "ci-info": "^3.7.0",
1859
- "cross-spawn": "^7.0.3",
1860
- "find-yarn-workspace-root": "^2.0.0",
1861
- "fs-extra": "^10.0.0",
1862
- "json-stable-stringify": "^1.0.2",
1863
- "klaw-sync": "^6.0.0",
1864
- "minimist": "^1.2.6",
1865
- "open": "^7.4.2",
1866
- "semver": "^7.5.3",
1867
- "slash": "^2.0.0",
1868
- "tmp": "^0.2.4",
1869
- "yaml": "^2.2.2"
1870
- },
1871
- "bin": {
1872
- "patch-package": "index.js"
1873
- },
1874
- "engines": {
1875
- "node": ">=14",
1876
- "npm": ">5"
1877
- }
1878
- },
1879
- "node_modules/patch-package/node_modules/slash": {
1880
- "version": "2.0.0",
1881
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
1882
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
1883
- "dev": true,
1884
- "license": "MIT",
1885
- "engines": {
1886
- "node": ">=6"
1887
- }
1888
- },
1889
- "node_modules/path-key": {
1890
- "version": "3.1.1",
1891
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1892
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1893
- "dev": true,
1894
- "license": "MIT",
1895
- "engines": {
1896
- "node": ">=8"
1897
- }
1898
- },
1899
1337
  "node_modules/picomatch": {
1900
1338
  "version": "4.0.5",
1901
1339
  "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
@@ -2198,24 +1636,6 @@
2198
1636
  "url": "https://opencollective.com/express"
2199
1637
  }
2200
1638
  },
2201
- "node_modules/set-function-length": {
2202
- "version": "1.2.2",
2203
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
2204
- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
2205
- "dev": true,
2206
- "license": "MIT",
2207
- "dependencies": {
2208
- "define-data-property": "^1.1.4",
2209
- "es-errors": "^1.3.0",
2210
- "function-bind": "^1.1.2",
2211
- "get-intrinsic": "^1.2.4",
2212
- "gopd": "^1.0.1",
2213
- "has-property-descriptors": "^1.0.2"
2214
- },
2215
- "engines": {
2216
- "node": ">= 0.4"
2217
- }
2218
- },
2219
1639
  "node_modules/setprototypeof": {
2220
1640
  "version": "1.2.0",
2221
1641
  "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -2223,29 +1643,6 @@
2223
1643
  "dev": true,
2224
1644
  "license": "ISC"
2225
1645
  },
2226
- "node_modules/shebang-command": {
2227
- "version": "2.0.0",
2228
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2229
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2230
- "dev": true,
2231
- "license": "MIT",
2232
- "dependencies": {
2233
- "shebang-regex": "^3.0.0"
2234
- },
2235
- "engines": {
2236
- "node": ">=8"
2237
- }
2238
- },
2239
- "node_modules/shebang-regex": {
2240
- "version": "3.0.0",
2241
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2242
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2243
- "dev": true,
2244
- "license": "MIT",
2245
- "engines": {
2246
- "node": ">=8"
2247
- }
2248
- },
2249
1646
  "node_modules/slash": {
2250
1647
  "version": "3.0.0",
2251
1648
  "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -2302,19 +1699,6 @@
2302
1699
  "node": ">=0.10.0"
2303
1700
  }
2304
1701
  },
2305
- "node_modules/supports-color": {
2306
- "version": "7.2.0",
2307
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2308
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2309
- "dev": true,
2310
- "license": "MIT",
2311
- "dependencies": {
2312
- "has-flag": "^4.0.0"
2313
- },
2314
- "engines": {
2315
- "node": ">=8"
2316
- }
2317
- },
2318
1702
  "node_modules/tinyglobby": {
2319
1703
  "version": "0.2.17",
2320
1704
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
@@ -2332,16 +1716,6 @@
2332
1716
  "url": "https://github.com/sponsors/SuperchupuDev"
2333
1717
  }
2334
1718
  },
2335
- "node_modules/tmp": {
2336
- "version": "0.2.7",
2337
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz",
2338
- "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==",
2339
- "dev": true,
2340
- "license": "MIT",
2341
- "engines": {
2342
- "node": ">=14.14"
2343
- }
2344
- },
2345
1719
  "node_modules/to-regex-range": {
2346
1720
  "version": "5.0.1",
2347
1721
  "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -2371,16 +1745,6 @@
2371
1745
  "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
2372
1746
  "license": "MIT"
2373
1747
  },
2374
- "node_modules/universalify": {
2375
- "version": "2.0.1",
2376
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
2377
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
2378
- "dev": true,
2379
- "license": "MIT",
2380
- "engines": {
2381
- "node": ">= 10.0.0"
2382
- }
2383
- },
2384
1748
  "node_modules/unpipe": {
2385
1749
  "version": "1.0.0",
2386
1750
  "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -2398,24 +1762,10 @@
2398
1762
  "dev": true,
2399
1763
  "license": "MIT"
2400
1764
  },
2401
- "node_modules/which": {
2402
- "version": "2.0.2",
2403
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2404
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2405
- "dev": true,
2406
- "license": "ISC",
2407
- "dependencies": {
2408
- "isexe": "^2.0.0"
2409
- },
2410
- "bin": {
2411
- "node-which": "bin/node-which"
2412
- },
2413
- "engines": {
2414
- "node": ">= 8"
2415
- }
2416
- },
2417
1765
  "node_modules/ws": {
2418
- "version": "8.20.1",
1766
+ "version": "8.21.2",
1767
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.2.tgz",
1768
+ "integrity": "sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==",
2419
1769
  "dev": true,
2420
1770
  "license": "MIT",
2421
1771
  "engines": {
@@ -2433,22 +1783,6 @@
2433
1783
  "optional": true
2434
1784
  }
2435
1785
  }
2436
- },
2437
- "node_modules/yaml": {
2438
- "version": "2.9.0",
2439
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
2440
- "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
2441
- "dev": true,
2442
- "license": "ISC",
2443
- "bin": {
2444
- "yaml": "bin.mjs"
2445
- },
2446
- "engines": {
2447
- "node": ">= 14.6"
2448
- },
2449
- "funding": {
2450
- "url": "https://github.com/sponsors/eemeli"
2451
- }
2452
1786
  }
2453
1787
  }
2454
1788
  }
package.json CHANGED
@@ -3,8 +3,9 @@
3
3
  "type": "module",
4
4
  "scripts": {
5
5
  "dev": "eleventy --serve",
6
+ "build": "node --max-old-space-size=8192 ./node_modules/.bin/eleventy",
6
- "build": "eleventy",
7
+ "tf:plan": "terraform -chdir=infra plan",
7
- "postinstall": "patch-package"
8
+ "tf:apply": "terraform -chdir=infra apply"
8
9
  },
9
10
  "dependencies": {
10
11
  "diff2html": "^3.4.52",
@@ -16,7 +17,6 @@
16
17
  "@11ty/eleventy": "^3.0.0",
17
18
  "@11ty/eleventy-plugin-rss": "^2.0.0",
18
19
  "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0",
19
- "@iconify-json/vscode-icons": "^1.2.68",
20
+ "@iconify-json/vscode-icons": "^1.2.68"
20
- "patch-package": "^8.0.1"
21
21
  }
22
22
  }
src/_data/repoCommits.js CHANGED
@@ -5,10 +5,22 @@ import { mapPool } from "../_helpers/pool.js";
5
5
 
6
6
  const CONCURRENCY = 8;
7
7
 
8
+ // Some repos have vendored/generated/binary-as-text blobs committed at some
9
+ // point in their history (a minified bundle, a compiled binary git doesn't
10
+ // detect as binary, ...) — `git show -p` dumps the whole file as a diff on
11
+ // every commit that touches it, and diff2html's per-line markup multiplies
12
+ // that further. Left unguarded, that's easily 100s of MB of HTML per repo,
13
+ // held for every commit at once across every repo — well past Node's default
14
+ // heap. Cap it the way GitHub's own diff viewer does: skip rendering past a
15
+ // size threshold rather than trying to syntax-highlight a multi-MB blob.
16
+ const MAX_DIFF_SIZE = 300 * 1024;
17
+ const DIFF_TOO_LARGE_HTML = '<p class="diff-too-large">This diff is too large to display.</p>';
18
+
8
19
  const toDiffHtml = (diffText) => {
9
20
  const idx = diffText.indexOf("diff --git");
10
21
  const patch = idx >= 0 ? diffText.slice(idx) : "";
11
22
  if (!patch.trim()) return "";
23
+ if (patch.length > MAX_DIFF_SIZE) return DIFF_TOO_LARGE_HTML;
12
24
  try {
13
25
  const json = parseDiff(patch);
14
26
  return renderDiffHtml(json, { drawFileList: true, matching: "lines" });
@@ -39,7 +51,15 @@ export default async () => {
39
51
  if (sha) writeCache(cacheKey, sha, entries);
40
52
  }
41
53
 
54
+ // Only `id`/`data` ever get read off `item.repo` in commit.njk — not the
55
+ // full `repo` object's `files`/`tree`/`commits`/`readme`. Eleventy's
56
+ // paginator deep-clones each page's data slice for isolation, so
57
+ // embedding the whole repo (every commit's metadata, every file, the
58
+ // tree, the README) here means that whole structure gets cloned once
59
+ // per commit page — the actual multiplier behind the OOM, not just the
60
+ // diff HTML size.
61
+ const slimRepo = { id: repo.id, data: repo.data };
42
- for (const entry of entries) pages.push({ repoId: repo.id, repo, ...entry });
62
+ for (const entry of entries) pages.push({ repoId: repo.id, repo: slimRepo, ...entry });
43
63
  }
44
64
  return pages;
45
65
  };
src/_data/repoFiles.js CHANGED
@@ -51,7 +51,13 @@ export default async () => {
51
51
  if (cacheable) writeCache(cacheKey, sha, entries);
52
52
  }
53
53
 
54
+ // file.njk/file-history.njk/file-blame.njk only ever read `id`/`data`/
55
+ // `tree` off `item.repo` — not `files`/`commits`/`readme`. See the same
56
+ // note in repoCommits.js: Eleventy clones each page's data slice, so
57
+ // keeping this slim avoids cloning the repo's full commit/file lists on
58
+ // every single file page.
59
+ const slimRepo = { id: repo.id, data: repo.data, tree: repo.tree };
54
- for (const entry of entries) pages.push({ repoId: repo.id, repo, ...entry });
60
+ for (const entry of entries) pages.push({ repoId: repo.id, repo: slimRepo, ...entry });
55
61
  }
56
62
  return pages;
57
63
  };