Compare commits

..

No commits in common. "75c75e6eb002cc76279ef0f525f1f27be65b27c8" and "bd40930dd10e1d82635d97edd2849cb122c98b83" have entirely different histories.

4 changed files with 266 additions and 1001 deletions

View file

@ -56,7 +56,7 @@
"github-slugger": "^2.0.0",
"mdast-util-to-string": "^3.2.0",
"mdsvex": "^0.10.6",
"netlify-cli": "^16.3.1",
"netlify-cli": "^16.0.2",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.23",
"postcss-lightningcss": "^0.7.0",

View file

@ -99,8 +99,8 @@ devDependencies:
specifier: ^0.10.6
version: 0.10.6(svelte@3.59.1)
netlify-cli:
specifier: ^16.3.1
version: 16.3.1(@types/node@20.2.5)
specifier: ^16.0.2
version: 16.0.2(@types/node@20.2.5)
npm-run-all:
specifier: ^4.1.5
version: 4.1.5
@ -1526,15 +1526,6 @@ packages:
dev: true
optional: true
/@esbuild/android-arm64@0.19.2:
resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-arm@0.17.19:
resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==}
engines: {node: '>=12'}
@ -1544,15 +1535,6 @@ packages:
dev: true
optional: true
/@esbuild/android-arm@0.19.2:
resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-x64@0.17.19:
resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==}
engines: {node: '>=12'}
@ -1562,15 +1544,6 @@ packages:
dev: true
optional: true
/@esbuild/android-x64@0.19.2:
resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/darwin-arm64@0.17.19:
resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==}
engines: {node: '>=12'}
@ -1580,15 +1553,6 @@ packages:
dev: true
optional: true
/@esbuild/darwin-arm64@0.19.2:
resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@esbuild/darwin-x64@0.17.19:
resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==}
engines: {node: '>=12'}
@ -1598,15 +1562,6 @@ packages:
dev: true
optional: true
/@esbuild/darwin-x64@0.19.2:
resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@esbuild/freebsd-arm64@0.17.19:
resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==}
engines: {node: '>=12'}
@ -1616,15 +1571,6 @@ packages:
dev: true
optional: true
/@esbuild/freebsd-arm64@0.19.2:
resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/freebsd-x64@0.17.19:
resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==}
engines: {node: '>=12'}
@ -1634,15 +1580,6 @@ packages:
dev: true
optional: true
/@esbuild/freebsd-x64@0.19.2:
resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-arm64@0.17.19:
resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==}
engines: {node: '>=12'}
@ -1652,15 +1589,6 @@ packages:
dev: true
optional: true
/@esbuild/linux-arm64@0.19.2:
resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-arm@0.17.19:
resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
engines: {node: '>=12'}
@ -1670,15 +1598,6 @@ packages:
dev: true
optional: true
/@esbuild/linux-arm@0.19.2:
resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-ia32@0.17.19:
resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
engines: {node: '>=12'}
@ -1688,15 +1607,6 @@ packages:
dev: true
optional: true
/@esbuild/linux-ia32@0.19.2:
resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-loong64@0.17.19:
resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
engines: {node: '>=12'}
@ -1706,15 +1616,6 @@ packages:
dev: true
optional: true
/@esbuild/linux-loong64@0.19.2:
resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-mips64el@0.17.19:
resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==}
engines: {node: '>=12'}
@ -1724,15 +1625,6 @@ packages:
dev: true
optional: true
/@esbuild/linux-mips64el@0.19.2:
resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-ppc64@0.17.19:
resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==}
engines: {node: '>=12'}
@ -1742,15 +1634,6 @@ packages:
dev: true
optional: true
/@esbuild/linux-ppc64@0.19.2:
resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-riscv64@0.17.19:
resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==}
engines: {node: '>=12'}
@ -1760,15 +1643,6 @@ packages:
dev: true
optional: true
/@esbuild/linux-riscv64@0.19.2:
resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-s390x@0.17.19:
resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==}
engines: {node: '>=12'}
@ -1778,15 +1652,6 @@ packages:
dev: true
optional: true
/@esbuild/linux-s390x@0.19.2:
resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-x64@0.17.19:
resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==}
engines: {node: '>=12'}
@ -1796,15 +1661,6 @@ packages:
dev: true
optional: true
/@esbuild/linux-x64@0.19.2:
resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/netbsd-x64@0.17.19:
resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==}
engines: {node: '>=12'}
@ -1814,15 +1670,6 @@ packages:
dev: true
optional: true
/@esbuild/netbsd-x64@0.19.2:
resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/openbsd-x64@0.17.19:
resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==}
engines: {node: '>=12'}
@ -1832,15 +1679,6 @@ packages:
dev: true
optional: true
/@esbuild/openbsd-x64@0.19.2:
resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/sunos-x64@0.17.19:
resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==}
engines: {node: '>=12'}
@ -1850,15 +1688,6 @@ packages:
dev: true
optional: true
/@esbuild/sunos-x64@0.19.2:
resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-arm64@0.17.19:
resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==}
engines: {node: '>=12'}
@ -1868,15 +1697,6 @@ packages:
dev: true
optional: true
/@esbuild/win32-arm64@0.19.2:
resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-ia32@0.17.19:
resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==}
engines: {node: '>=12'}
@ -1886,15 +1706,6 @@ packages:
dev: true
optional: true
/@esbuild/win32-ia32@0.19.2:
resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-x64@0.17.19:
resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==}
engines: {node: '>=12'}
@ -1904,15 +1715,6 @@ packages:
dev: true
optional: true
/@esbuild/win32-x64@0.19.2:
resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@eslint-community/eslint-utils@4.4.0(eslint@8.41.0):
resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -2228,8 +2030,8 @@ packages:
resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==}
dev: true
/@netlify/build-info@7.8.0:
resolution: {integrity: sha512-4UnAaQUXoxMfs6KAMKPx8Pa5WwdGDcgIliyQpKhc4Xq3A2dgH+Uam9kS4aq5+4ZeHS9/eT1BKLKZPUOOF5ZQZg==}
/@netlify/build-info@7.7.3:
resolution: {integrity: sha512-/X07WiTl8RMA148QkEqVOvWyntiew0dCGeMZLmciUkgsL7r3oncPcuzKbwt+XIEktsf2gJlcOhtuNsrd/tTc4Q==}
engines: {node: ^14.16.0 || >=16.0.0}
hasBin: true
dependencies:
@ -2244,22 +2046,22 @@ packages:
yargs: 17.7.2
dev: true
/@netlify/build@29.20.13(@types/node@20.2.5)(debug@4.3.4):
resolution: {integrity: sha512-FcRPb56MWG+H3eI0kcb0H8vlz2N89sl22OmVW5kZifzXalc76kSDMmqOzwHBSe2ChBUZApmYwqY3QVB/h5sL1g==}
/@netlify/build@29.20.2(@types/node@20.2.5)(debug@4.3.4):
resolution: {integrity: sha512-ivkeheWbTtyloHS7IQQk0UsyH4Ozp6zUg6v6NcLobAmuT6hwgpXzBnwaAMq1GaJSTpUBbNyTx2Oga6wuuu/Nig==}
engines: {node: ^14.16.0 || >=16.0.0}
hasBin: true
dependencies:
'@bugsnag/js': 7.20.2
'@honeycombio/opentelemetry-node': 0.4.0(debug@4.3.4)(supports-color@9.3.1)
'@netlify/cache-utils': 5.1.5
'@netlify/config': 20.8.1
'@netlify/edge-bundler': 8.19.0
'@netlify/config': 20.8.0
'@netlify/edge-bundler': 8.17.1
'@netlify/framework-info': 9.8.10
'@netlify/functions-utils': 5.2.28(supports-color@9.3.1)
'@netlify/functions-utils': 5.2.22(supports-color@9.3.1)
'@netlify/git-utils': 5.1.1
'@netlify/plugins-list': 6.71.0
'@netlify/run-utils': 5.1.1
'@netlify/zip-it-and-ship-it': 9.17.3(supports-color@9.3.1)
'@netlify/zip-it-and-ship-it': 9.15.1(supports-color@9.3.1)
'@opentelemetry/api': 1.4.1
'@sindresorhus/slugify': 2.2.1
ansi-escapes: 6.2.0
@ -2327,8 +2129,8 @@ packages:
readdirp: 3.6.0
dev: true
/@netlify/config@20.8.1:
resolution: {integrity: sha512-GpkR8Z8UHCftATIILGoCXPW1nPzrSK85O85d29pQXqv5KO2sAx5glgZQtEgKJnE7JWzMy+h6qjRD9hi0Mvw3Nw==}
/@netlify/config@20.8.0:
resolution: {integrity: sha512-jzklg2Kj9D/2h+QO2MNbbc7oz9Wo56Zp1ob/kaG9P7DJLZSgc0h6G2GQSybqKqvApLju+8iqPB2rMAp02QSjpA==}
engines: {node: ^14.16.0 || >=16.0.0}
hasBin: true
dependencies:
@ -2358,8 +2160,8 @@ packages:
yargs: 17.7.2
dev: true
/@netlify/edge-bundler@8.19.0:
resolution: {integrity: sha512-blIZHLXlEXcjpAhd2TJ+Rw7H+WhNXSBfmFfRHn2pyzNiAbQa71eU0eNUE2+Nw58DGfvUC0unerbTlN2gd3iVdA==}
/@netlify/edge-bundler@8.17.1:
resolution: {integrity: sha512-46FvSx/Bguy12IGj2g2W9J/1P7btfSOp/+mpde3VBCLX/sOmd5nYC2i0v3UTbz0yH02qpxTZaEdepPnDLIueCw==}
engines: {node: ^14.16.0 || >=16.0.0}
dependencies:
'@import-maps/resolve': 1.0.1
@ -2371,6 +2173,7 @@ packages:
execa: 6.1.0
find-up: 6.3.0
get-port: 6.1.2
glob-to-regexp: 0.4.1
is-path-inside: 4.0.0
jsonc-parser: 3.2.0
node-fetch: 3.3.1
@ -2385,31 +2188,212 @@ packages:
uuid: 9.0.0
dev: true
/@netlify/edge-bundler@8.19.1:
resolution: {integrity: sha512-Erj0+dfRFMQjV3R+FX9NtCV35t6qU91rWKtsuawLzS6tAHLvrR8sOmyFxt5Neg4VPjAstYg1ik16lDak2LhQww==}
engines: {node: ^14.16.0 || >=16.0.0}
dependencies:
'@import-maps/resolve': 1.0.1
ajv: 8.12.0
ajv-errors: 3.0.0(ajv@8.12.0)
better-ajv-errors: 1.2.0(ajv@8.12.0)
common-path-prefix: 3.0.0
env-paths: 3.0.0
execa: 6.1.0
find-up: 6.3.0
get-port: 6.1.2
is-path-inside: 4.0.0
jsonc-parser: 3.2.0
node-fetch: 3.3.1
node-stream-zip: 1.15.0
p-retry: 5.1.2
p-wait-for: 4.1.0
path-key: 4.0.0
regexp-tree: 0.1.27
semver: 7.5.4
tmp-promise: 3.0.3
urlpattern-polyfill: 8.0.2
uuid: 9.0.0
/@netlify/esbuild-android-64@0.14.39-1:
resolution: {integrity: sha512-/rZn0xVfTLVjx0SLvToydTTpvNwrlFqxW++Lqen7CXubTJNFnZQH0hP/qMCILac41zvSipxyU5/Di9mWHoLv9Q==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-android-arm64@0.14.39-1:
resolution: {integrity: sha512-Wnjsv5djKQ2NwKaDj2P5DpvNAFhQIQBer2IqVCQ8u0ykdyr+y+u5CmM1ZnrzBnDUULk5TYwPlUNt3p2NctSnLQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-darwin-64@0.14.39-1:
resolution: {integrity: sha512-rHQmZcS+1qC9bL1EwFQ8SGqiKrIUQLam9ty2bcsEH78525NoAW8f/ENollQlso1K8lSkcn+KzX7i09FdRL0TLQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-darwin-arm64@0.14.39-1:
resolution: {integrity: sha512-Ytz9SY7BjtBnrZL4qCsKJ/xyjJyH2LFLV3kv3DhY5X+eUUBsjdCAq2VVY9zLnvkNf5Sef/U35Jie2O0sl+3E1g==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-freebsd-64@0.14.39-1:
resolution: {integrity: sha512-TsOZCldbxEOB4Rv5tudYCkPkfHklmOWQgRPoz3wsmJDUpLwljOQFru4J0uCRqKKGLALo1qBBQvzofQi+5dvTzQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-freebsd-arm64@0.14.39-1:
resolution: {integrity: sha512-wJbKm1eijTiots/RgDOZjbqcZaCVElPjegRit0LkbAQnqfBc2B8F6j7CkUgbWg1hU2+YJFiMGhaRMljN9jpCVQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-linux-32@0.14.39-1:
resolution: {integrity: sha512-rSCpXot5p3zUpwnC9ttKtP+vWf3gT1CkzJwEBHqqIr0GmgTLoADMaZ1AZqq125DyCvPf2s9f98XtSWaHmIqN8w==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-linux-64@0.14.39-1:
resolution: {integrity: sha512-lx+tQR7OW9Sq8WrP+zJ20lpJFHe4jvO56czUjJe7iSYtu0mpbApnJc2p4KqakU4xdjMdlqsUDG6L7GqE4+dNxQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-linux-arm64@0.14.39-1:
resolution: {integrity: sha512-e1gEB3+1WWsvBNDrPIq43hkUmWx9CkN5DVfcHa9Ar55DY8G9DRl5MyCFVpYVPctoWLRMlt1VRwPuc5YfSTXZbw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-linux-arm@0.14.39-1:
resolution: {integrity: sha512-O2w4oRYNoavKyednlkCnxr7VnfizpWurCxKraRyKQ4XIQbv3bqtgK/VSt1cJMwm+7+BdGNsqux4wAKmwsdW+Zw==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-linux-mips64le@0.14.39-1:
resolution: {integrity: sha512-SKDBxNiJmTD1HYlmq6GWbz7dBtz1lYg28Y8RLo2Yj/jZtkVzZbMS0sVhB05FAzQhGT+m1bFLSrbLJkfmbzoQXg==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-linux-ppc64le@0.14.39-1:
resolution: {integrity: sha512-cKIoVrHn6qJf1cTKCaOQvXKpcpSwCShzNkEQNtWCEFvlHJ817lsVaWqQm01qDQ9pGrDbhZRsUAIOkwsjLrKDmA==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-linux-riscv64@0.14.39-1:
resolution: {integrity: sha512-W6gQyJc52lFoPj0w6AoQCfa8/fmwsC6CrT80JKe+fF4mYwBUnySbRVldMDb/cb6qCqHt5m3X+w7HFS5soPGT5Q==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-linux-s390x@0.14.39-1:
resolution: {integrity: sha512-IN4agxUutc0BbcAMDDVuz60bDKFEGlq+vZlPzeLnketkVs/5BZj1vfoS8hJJelvR/mB99G9YjyOm08EthqoyHw==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-netbsd-64@0.14.39-1:
resolution: {integrity: sha512-cnvcQ6u7QtjnxFcMYtEUqOYg8wTfLOSoc6nFPhjIE4074Tw/H48LFqFq0v2Gtgvc5neUZtxBF2+6QMX4Q91vwQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-openbsd-64@0.14.39-1:
resolution: {integrity: sha512-14fDX08hM0rWzUO7uf7Wxg9uL5SK5AqSDe+vXviIL+gWGN2vHoakRbzZoLVHFwoTLT5/1oIUYDJfcmcrFm1rjw==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-sunos-64@0.14.39-1:
resolution: {integrity: sha512-TDUJGI077mAM3qotUfN/DcKaBq3nLeAdNwjsWulKgdC3UwC/iqyrYrnmZipEbiHO2jt4+wRFUz/s/x+HeDiblg==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-windows-32@0.14.39-1:
resolution: {integrity: sha512-Jyf5OUm+Guo7+SoIURTfmzqri10xj18qdgxwy3NNsQG/Eg1XLETDORWH0cKy6YTiRDuqeCsZeXDoAQABOs30gQ==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-windows-64@0.14.39-1:
resolution: {integrity: sha512-D41xhwJN90qeLebZrb853zhGJahIlCf+HPKwxVZx+Nk8BNV09jQyJ2GYqmmwRxNOrbzqD80+pgvoYkq4a4OV0g==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild-windows-arm64@0.14.39-1:
resolution: {integrity: sha512-EGzYwc+MoKhWnz+6iUbXQKcQKV8FbPovDJkmY9YWGkgSwZALPo4DpjSaMLW6hv42YRyoBRM1NP/v/qmVtgeJjQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@netlify/esbuild@0.14.39-1:
resolution: {integrity: sha512-FkS9R3aeD1JvPhEZh9r4GfXGLHoqzAsS3haqIeFfQ907irkGzCg1w5r5OWuSqPtLNyaGklVWz/HU0IsM8thyZw==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@netlify/esbuild-android-64': 0.14.39-1
'@netlify/esbuild-android-arm64': 0.14.39-1
'@netlify/esbuild-darwin-64': 0.14.39-1
'@netlify/esbuild-darwin-arm64': 0.14.39-1
'@netlify/esbuild-freebsd-64': 0.14.39-1
'@netlify/esbuild-freebsd-arm64': 0.14.39-1
'@netlify/esbuild-linux-32': 0.14.39-1
'@netlify/esbuild-linux-64': 0.14.39-1
'@netlify/esbuild-linux-arm': 0.14.39-1
'@netlify/esbuild-linux-arm64': 0.14.39-1
'@netlify/esbuild-linux-mips64le': 0.14.39-1
'@netlify/esbuild-linux-ppc64le': 0.14.39-1
'@netlify/esbuild-linux-riscv64': 0.14.39-1
'@netlify/esbuild-linux-s390x': 0.14.39-1
'@netlify/esbuild-netbsd-64': 0.14.39-1
'@netlify/esbuild-openbsd-64': 0.14.39-1
'@netlify/esbuild-sunos-64': 0.14.39-1
'@netlify/esbuild-windows-32': 0.14.39-1
'@netlify/esbuild-windows-64': 0.14.39-1
'@netlify/esbuild-windows-arm64': 0.14.39-1
dev: true
/@netlify/framework-info@9.8.10:
@ -2428,11 +2412,11 @@ packages:
semver: 7.5.4
dev: true
/@netlify/functions-utils@5.2.28(supports-color@9.3.1):
resolution: {integrity: sha512-1WDgXo71kNNxRTbCaZWo5aqNy0lnZWi9FGXr44539IG9nDuxQy7bOIksSHDryWqFVXIqBjJG18+VR4dTPuN7KA==}
/@netlify/functions-utils@5.2.22(supports-color@9.3.1):
resolution: {integrity: sha512-XflsfLLTqPILpurLuQ7vXPoB2OYOZP14kn9fpUZLcLfsOMa85+dPpLX3ADAspnHVCCrnNfvbvW0z0nXod+aO/g==}
engines: {node: ^14.16.0 || >=16.0.0}
dependencies:
'@netlify/zip-it-and-ship-it': 9.18.0(supports-color@9.3.1)
'@netlify/zip-it-and-ship-it': 9.15.1(supports-color@9.3.1)
cpy: 9.0.1
path-exists: 5.0.0
transitivePeerDependencies:
@ -2576,11 +2560,6 @@ packages:
'@netlify/local-functions-proxy-win32-x64': 1.1.1
dev: true
/@netlify/node-cookies@0.1.0:
resolution: {integrity: sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==}
engines: {node: ^14.16.0 || >=16.0.0}
dev: true
/@netlify/open-api@2.19.1:
resolution: {integrity: sha512-RkucRf8o0vYhCDXCRHWU/EdhkVE3JhkqKmZFvMW6qCPD206GV2Cfo9JGSKb0NdN+nmHSNaYmd+9dvT6I9MP4pw==}
dev: true
@ -2597,28 +2576,30 @@ packages:
execa: 6.1.0
dev: true
/@netlify/serverless-functions-api@1.7.3:
resolution: {integrity: sha512-n6/7cJlSWvvbBlUOEAbkGyEld80S6KbG/ldQI9OhLfe1lTatgKmrTNIgqVNpaWpUdTgP2OHWFjmFBzkxxBWs5w==}
/@netlify/serverless-functions-api@1.5.2:
resolution: {integrity: sha512-E9ZqnuWwGftXgO0JhGOl6h05bpnrH5EswQOuHIdTXBmhi4LedXjTNZ6xoSMgnhsE+x13WWq2P0yhaAl8Ly9lKw==}
engines: {node: ^14.18.0 || >=16.0.0}
dependencies:
'@netlify/node-cookies': 0.1.0
urlpattern-polyfill: 8.0.2
dev: true
/@netlify/zip-it-and-ship-it@9.17.3(supports-color@9.3.1):
resolution: {integrity: sha512-QjWygS6dR5WKLFoo+k9YeX9CbkBNHfjHyt3u86wB+n0pvzpSudMbH6SLCXsoSmBIFpdAIWZ5aWZ3S0Fvy8bEvg==}
/@netlify/serverless-functions-api@1.6.0:
resolution: {integrity: sha512-Lr5mxLAvSZyJhigSc0zhvAuusNR6VdJNvOmsDkxIN6f9xzmRpWyAEecCGtBc+hoSZlIeLzI7oFcKhaTzXcO2JA==}
engines: {node: ^14.18.0 || >=16.0.0}
dev: true
/@netlify/zip-it-and-ship-it@9.15.1(supports-color@9.3.1):
resolution: {integrity: sha512-gYEZ8Rrl9dtME3syR3Uj+JabEWvEiFUKO0/84joriVIfWGrYPzu9WKBqOjy+huWIAYEWPbEJRmxFEJrYOmhDgw==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
dependencies:
'@babel/parser': 7.22.10
'@netlify/binary-info': 1.0.0
'@netlify/serverless-functions-api': 1.7.3
'@netlify/esbuild': 0.14.39-1
'@netlify/serverless-functions-api': 1.6.0
'@vercel/nft': 0.23.1(supports-color@9.3.1)
archiver: 5.3.1
common-path-prefix: 3.0.0
cp-file: 10.0.0
es-module-lexer: 1.2.1
esbuild: 0.19.2
execa: 6.1.0
filter-obj: 5.1.0
find-up: 6.3.0
@ -2640,49 +2621,6 @@ packages:
tmp-promise: 3.0.3
toml: 3.0.0
unixify: 1.0.0
urlpattern-polyfill: 8.0.2
yargs: 17.7.2
transitivePeerDependencies:
- encoding
- supports-color
dev: true
/@netlify/zip-it-and-ship-it@9.18.0(supports-color@9.3.1):
resolution: {integrity: sha512-HzQSyeVanytksO9n84uimm9D7nJa0PMuX0O9S7bI3VX16JxqwMiCx6yW9EDrIuDD5Invs07+irq54nzYDCwgeg==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
dependencies:
'@babel/parser': 7.22.10
'@netlify/binary-info': 1.0.0
'@netlify/serverless-functions-api': 1.7.3
'@vercel/nft': 0.23.1(supports-color@9.3.1)
archiver: 6.0.1
common-path-prefix: 3.0.0
cp-file: 10.0.0
es-module-lexer: 1.2.1
esbuild: 0.19.2
execa: 6.1.0
filter-obj: 5.1.0
find-up: 6.3.0
get-tsconfig: 4.7.0
glob: 8.1.0
is-builtin-module: 3.2.1
is-path-inside: 4.0.0
junk: 4.0.1
locate-path: 7.2.0
merge-options: 3.0.4
minimatch: 9.0.1
normalize-path: 3.0.0
p-map: 5.5.0
path-exists: 5.0.0
precinct: 11.0.5(supports-color@9.3.1)
require-package-name: 2.0.1
resolve: 2.0.0-next.4
semver: 7.5.4
tmp-promise: 3.0.3
toml: 3.0.0
unixify: 1.0.0
urlpattern-polyfill: 8.0.2
yargs: 17.7.2
transitivePeerDependencies:
- encoding
@ -4377,18 +4315,6 @@ packages:
readable-stream: 2.3.8
dev: true
/archiver-utils@4.0.1:
resolution: {integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==}
engines: {node: '>= 12.0.0'}
dependencies:
glob: 8.1.0
graceful-fs: 4.2.11
lazystream: 1.0.1
lodash: 4.17.21
normalize-path: 3.0.0
readable-stream: 3.6.2
dev: true
/archiver@5.3.1:
resolution: {integrity: sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==}
engines: {node: '>= 10'}
@ -4402,19 +4328,6 @@ packages:
zip-stream: 4.1.0
dev: true
/archiver@6.0.1:
resolution: {integrity: sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==}
engines: {node: '>= 12.0.0'}
dependencies:
archiver-utils: 4.0.1
async: 3.2.4
buffer-crc32: 0.2.13
readable-stream: 3.6.2
readdir-glob: 1.1.3
tar-stream: 3.1.6
zip-stream: 5.0.1
dev: true
/archy@1.0.0:
resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==}
dev: true
@ -5232,16 +5145,6 @@ packages:
readable-stream: 3.6.2
dev: true
/compress-commons@5.0.1:
resolution: {integrity: sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==}
engines: {node: '>= 12.0.0'}
dependencies:
crc-32: 1.2.2
crc32-stream: 5.0.0
normalize-path: 3.0.0
readable-stream: 3.6.2
dev: true
/concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: true
@ -5389,14 +5292,6 @@ packages:
readable-stream: 3.6.2
dev: true
/crc32-stream@5.0.0:
resolution: {integrity: sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==}
engines: {node: '>= 12.0.0'}
dependencies:
crc-32: 1.2.2
readable-stream: 3.6.2
dev: true
/create-require@1.1.1:
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
dev: true
@ -5990,36 +5885,6 @@ packages:
'@esbuild/win32-x64': 0.17.19
dev: true
/esbuild@0.19.2:
resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@esbuild/android-arm': 0.19.2
'@esbuild/android-arm64': 0.19.2
'@esbuild/android-x64': 0.19.2
'@esbuild/darwin-arm64': 0.19.2
'@esbuild/darwin-x64': 0.19.2
'@esbuild/freebsd-arm64': 0.19.2
'@esbuild/freebsd-x64': 0.19.2
'@esbuild/linux-arm': 0.19.2
'@esbuild/linux-arm64': 0.19.2
'@esbuild/linux-ia32': 0.19.2
'@esbuild/linux-loong64': 0.19.2
'@esbuild/linux-mips64el': 0.19.2
'@esbuild/linux-ppc64': 0.19.2
'@esbuild/linux-riscv64': 0.19.2
'@esbuild/linux-s390x': 0.19.2
'@esbuild/linux-x64': 0.19.2
'@esbuild/netbsd-x64': 0.19.2
'@esbuild/openbsd-x64': 0.19.2
'@esbuild/sunos-x64': 0.19.2
'@esbuild/win32-arm64': 0.19.2
'@esbuild/win32-ia32': 0.19.2
'@esbuild/win32-x64': 0.19.2
dev: true
/escalade@3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
@ -6997,6 +6862,10 @@ packages:
is-glob: 4.0.3
dev: true
/glob-to-regexp@0.4.1:
resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
dev: true
/glob@7.1.6:
resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
dependencies:
@ -8158,9 +8027,9 @@ packages:
resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
dev: true
/lambda-local@2.1.2:
resolution: {integrity: sha512-nGTJn2JxZWcLGpNwXFmXC7UEXL7QCLieQWDiXs46vIv9y/gSPm/uHygEMCaym+HIziniAw0XIm+1VTrXCvG1Zw==}
engines: {node: '>=8'}
/lambda-local@2.1.1:
resolution: {integrity: sha512-/bjvifTDx8mOfKwe3pHrmfHyy695Gj2Z++WFL+Sk7/nXjUcDWP/26vIV8Q0LVpyfaGCC47oCK6Y6d/8PNUSNJw==}
engines: {node: '>=6'}
hasBin: true
dependencies:
commander: 10.0.1
@ -9189,21 +9058,21 @@ packages:
resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==}
dev: true
/netlify-cli@16.3.1(@types/node@20.2.5):
resolution: {integrity: sha512-CdnmOavZ2G5Z7blko/cdtdZQCQ8Swqz6YucqzztVi9sV9j6bGMneJ2sv83FiSBbdDnHReLm7A3Drns6zc9o2/w==}
/netlify-cli@16.0.2(@types/node@20.2.5):
resolution: {integrity: sha512-CA4upymzq315K//pkrjqvppaazB24zgt/TL9TAq/Et3oqRSnYA9dE2vNr1T/Lys/uyuZZaABdWEzR/+NZVXpFw==}
engines: {node: '>=16.16.0'}
hasBin: true
requiresBuild: true
dependencies:
'@bugsnag/js': 7.20.2
'@fastify/static': 6.10.2
'@netlify/build': 29.20.13(@types/node@20.2.5)(debug@4.3.4)
'@netlify/build-info': 7.8.0
'@netlify/config': 20.8.1
'@netlify/edge-bundler': 8.19.1
'@netlify/build': 29.20.2(@types/node@20.2.5)(debug@4.3.4)
'@netlify/build-info': 7.7.3
'@netlify/config': 20.8.0
'@netlify/edge-bundler': 8.17.1
'@netlify/local-functions-proxy': 1.1.1
'@netlify/serverless-functions-api': 1.7.3
'@netlify/zip-it-and-ship-it': 9.17.3(supports-color@9.3.1)
'@netlify/serverless-functions-api': 1.5.2
'@netlify/zip-it-and-ship-it': 9.15.1(supports-color@9.3.1)
'@octokit/rest': 19.0.13
ansi-escapes: 6.2.0
ansi-styles: 6.2.1
@ -9259,7 +9128,7 @@ packages:
isexe: 2.0.0
jsonwebtoken: 9.0.1
jwt-decode: 3.1.2
lambda-local: 2.1.2
lambda-local: 2.1.1
listr: 0.14.3
locate-path: 7.2.0
lodash: 4.17.21
@ -9269,7 +9138,7 @@ packages:
multiparty: 4.2.3
netlify: 13.1.10
netlify-headers-parser: 7.1.2
netlify-redirect-parser: 14.2.0
netlify-redirect-parser: 14.1.3
netlify-redirector: 0.4.0
node-fetch: 2.6.12
node-version-alias: 3.4.1
@ -9326,6 +9195,17 @@ packages:
toml: 3.0.0
dev: true
/netlify-redirect-parser@14.1.3:
resolution: {integrity: sha512-23svKHdO2QUEJHo3knQV1EpAh8UX/+8zQmwxVMSby4/NRj5vPS+u/yKesY/uHAgcw/28HwvEUGQdbXsPPe7J/Q==}
engines: {node: ^14.16.0 || >=16.0.0}
dependencies:
fast-safe-stringify: 2.1.1
filter-obj: 5.1.0
is-plain-obj: 4.1.0
path-exists: 5.0.0
toml: 3.0.0
dev: true
/netlify-redirect-parser@14.2.0:
resolution: {integrity: sha512-3Mi7sMH7XXZhjvXx/5RtJ/rU/E6zKkE4etcYQbEu8B3r872D0opoYyGdPW/MvaYQyVdfg23XEFaEI4zzQTupaw==}
engines: {node: ^14.16.0 || >=16.0.0}
@ -9362,7 +9242,7 @@ packages:
resolution: {integrity: sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==}
engines: {node: '>=10'}
dependencies:
semver: 7.5.4
semver: 7.5.1
dev: true
/node-addon-api@5.1.0:
@ -11063,7 +10943,7 @@ packages:
detect-libc: 2.0.1
node-addon-api: 5.1.0
prebuild-install: 7.1.1
semver: 7.5.4
semver: 7.5.1
simple-get: 4.0.1
tar-fs: 2.1.1
tunnel-agent: 0.6.0
@ -13092,15 +12972,6 @@ packages:
readable-stream: 3.6.2
dev: true
/zip-stream@5.0.1:
resolution: {integrity: sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==}
engines: {node: '>= 12.0.0'}
dependencies:
archiver-utils: 4.0.1
compress-commons: 5.0.1
readable-stream: 3.6.2
dev: true
/zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
dev: true

View file

@ -1,321 +0,0 @@
---
title: Python 初学笔记
created: 2023-09-04
summary: Note of 《Python As Fast as Possible - Learn Python in ~75 Minutes》
tags:
- 笔记
- Python
---
教程:[Python As Fast as Possible - Learn Python in ~75 Minutes](https://www.youtube.com/watch?v=VchuKL44s6E)
- [GitHub - kyclark/tiny\_python\_projects: Code for Tiny Python Projects (Manning, 2020, ISBN 1617297518). Learning Python through test-driven development of games and puzzles.](https://github.com/kyclark/tiny_python_projects)
## 交互式
输入
```bash
python3
```
看到prompt提示符`>>>` 就进入交互模式了
-  `<Control>`-`P `(previous)
- `<Control>`-`N` (next). 
- `<Control>`-`D` exits a session
- 工具:
- [Project Jupyter | Home](https://jupyter.org)
- 教程:
- [practical python](https://dabeaz-course.github.io/practical-python/)
- [PEP 20 The Zen of Python | peps.python.org](https://peps.python.org/pep-0020/)
- 书籍
- [[流畅的Python]]
## 数据类型
- Int
- Float
- String
- Bool
## Arithmetic Operator
- will always reture a float number
- `int(x/y)` => int
- 幂运算: `x ** y` => `2**3 = 8`
- 开跟号:`x //y` => `10 // 3 ` => 3 因为返回的是int会自动取整
- 求余 `x % y`
## String Method
- `.upper()`
- `.lower()`
- `.capitalize()`
- 首字大写
- `.count()`
- `'Hello'.count('ll) = 2`
- mutiply strings
- `'hello' * 3 = 'hellohellohello`
- `'hello' + 'yes' = 'helloyes`
- `.replace()`
- `.split()` 分割
- 和JS中[[split]]的区别:
- 当split里面没有任何参数的时候JS中会将字符串切割成单个字符
- 而Python会按照空格分割By default any whitespace is a separator[^1]
## Conditional Operators
return -> `True` / `False`
- ==
- !=
- `>=`
- `<=`
- `>`
- `<`
- 可以比较字符串通过比较ASCI码
- `.orc('a')` 求得某个字符串的ASCI值
- 如果有几个字符串的话,逐一比较
## Chained Conditionals
- and
- or
- not
- order
1. nor
2. and
3. or
## If/Else/Elif
```py
if x == 'Tim':
print('You are great')
elif x == 'joe':
print('Bye joe!')
else:
print('No')
```
js
```js
if(x === 'tim') {
console.log('You are great')
} else if (x === 'joe') {
console.log('Bye joe!')
} else {
console.log('No')
}
```
## List/Tuples
- List
- 类似JS中的 [[数组|array]]
- `.list()`
- `x = [4, True, 'hi']`
- `x[index]`
- `.len()`
- 返回长度
- string also works
- `.append()`
- 在末尾加值
- `.extend([])`
- 扩展数组,在末尾加值
- `.pop(index)`
- remove the last element and return it
- list is mutable
- deepcopy
- `y = x[:]
- tuples
- TS中的 tuple
- immutable
- `y = (1,2,3,5)`
- nesting
- `x=[[],(),[]]`
## for loops
```py
for i in range(10)
print(i)
x = [1,2,3,5,67]
for i in range(len(x))
print(x[i])
for i,element in enumerate(x):
print(i,element)
// 0 1
// 1 2
// 2 3
// 3 5
// 4 67
```
- `.range()`
- arguments:
- stop
- start, stop
- start, stop, end
- not includes start and stop
- `enumerate`
- enumerate()是Python中的一个内置函数,用于将一个可迭代对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中
## While
```bash
while True:
print('run')
i += 1
```
## Slice
切割数组
```py
x = [0,1,2,3,4,5,6,7,8]
slice = x[0,4,2]
// slice = [0,2]
```
- `slice = x[start:stop:step]`
- `x[:stop]`
- `x[start:]`
- `x[start:stop]`
- step默认为1
- reverse a list: `x[::-1]`
## Sets
unorder unique list
```py
x = set()
s = { 2,3,4,5 } //set
s2 = { 6 }
s = { } // dict
print( 4 in s) => boolean
print(s.union(s2)) // => {2,3,4,5,6}
```
- `.add()`
- `.remove()`
- `.union`合并set
- `.difference`:比较差异
- `.intersection` 交集
## Dicts
```py
x = {'key': 4}
x['key2'] = 5
print( 'key' in x) // => True
//删除
del x['key']
```
- `.value()`
- 获取所有values
- `.update()`[^2]
- update() 方法用于将一个字典的键值对更新到另一个字典中。
- Update the dictionary with the key/value pairs from other, overwriting existing keys. Return None.
- update() accepts either another dictionary object or an iterable of key/value pairs (as tuples or other iterables of length two). If keyword arguments are specified, the dictionary is then updated with those key/value pairs: d.update(red=1, blue=2).
## Comprehensions
```py
x = [ x for x in range(5)]
x =[[0 for x in range(100)] for x in range(5)]
x = { i for i in range(100) if i % 5 == 0 }
```
## Function
```py
def func(x,y,z=None):
print('Run',x,y,z)
return x * y , x /y
r1, r2 = func(10,5)
func()
```
## Unpack Operator /* Args and ** Kwargs
- `*x`
- 类似于JS中的`...`
- 用于list
```py
def fun(x,y):
print(x,y)
pairs = [(1,2),(3,4)]
for pair in pairs
fun(*pair)
```
- `**x`
- key word argumens
- 用于dict
```py
def fun(x,y):
print(x,y)
for(**{'x':2, 'y': 5})
// 顺序不一也可以
```
## Scope & Globals
- 函数内有局部作用域
- 用`globel` 可以将局部变量变成全局变量
```py
def func():
global x
return x
```
## Exceptions
- 意外事件相当于JS中的`throw new Error('')`
- 会打断程序的正常执行流程
```py
raise Exception('Bad')
raise FileExistsError('')
```
常见的异常类型有:
- StopIteration - 迭代器没有更多的值
- ImportError - 导入模块失败
- IndexError - 序列中找不到给定的索引
- KeyError - 映射中找不到给定的键
- ValueError - 传入无效的参数
- TypeError - 对类型无效的操作
- FileNotFoundError - 未找到文件
- KeyboardInterrupt - 用户中断执行
## Handling Exceptions
```py
try:
x = 7 /0
expect Exception as e
print(e)
finally:
print('finally')
```
## Lambda
lambda是Python中的匿名函数。它可以有多个参数,但只能有一个表达式。
```py
x = lambda x: x + 5
```
## Map and Filter
- Map: 跟JS的[[map()]] 差不多
- 返回map object
```py
x = [0,1,2,3,4,5,6,7,8]
mp = map(lambda i : i +2 , x)
// js : const mp = x.map((i)=> i+1)
print(list(mp))
mpf = filter(lambda i : i === 2 , x)
```
## F Strings
- 类似于JS中的 [[template literal]]
```py
tim = 89
x = f'hello {6+8}'
// js
// x = `hello ${6+8}`
```
## Buildin Functions
- [[vars()]]
[^1]: [Python String split() Method](https://www.w3schools.com/python/ref_string_split.asp)
[^2]: [Built-in Types — Python 3.11.4 documentation](https://docs.python.org/3/library/stdtypes.html?highlight=update#dict.update)

View file

@ -1,285 +0,0 @@
---
title: Akkoma / Pleroma 的媒体相关配置
created: 2023-09-10
summary: 配置 Cloudflare R2、Media Proxy、Varnish Cache、Media Cache 的简明流程
---
## 前言
刚开始装的时候,我试过用 Contabo Object Storage但是当时没有配置成功后面发现 Cloudflare R2 还蛮适合的,而且**免费套餐对小型站点已经完全够用了**,所以将本地的文件上传到了 Cloudflare R2 中并且后续文件都迁移到了这边。
下面我先讲一下这么配置,再说怎么迁移,再说 Media Proxy 的配置 和 Varnish 的配置,可以根据个人需要选用配置。因为时间过去太久了了,可能会有一些多余了我也不知道的配置,也可能会有 Bug可以对照官方文档仔细检查一下。
下文比较长,我写得比较详细,但是配置起来并不是特别难,需要一点点耐心。
相关信息:
- [Pricing · Cloudflare R2 docs](https://developers.cloudflare.com/r2/pricing/)
- [Configuration Cheat Sheet - Akkoma Documentation](https://docs.akkoma.dev/stable/configuration/cheatsheet/#pleromauploaderss3)
- [Public buckets · Cloudflare R2 docs](https://developers.cloudflare.com/r2/buckets/public-buckets/#managed-public-buckets-through-r2dev)
## Part1配置上传文件到 Cloudflare R2
### 0. 准备工作
- Cloudflare 账号或者其他 S3 API 的对象存储服务的账号
- 一个用来放媒体文件的域名,这个域名必须和所使用的 Cloudflare 账号绑定并且通过 Cloudflare 来做 DNS但如果没有这样的域名也可以但是会被限速并且一些 Cloudflare 的功能特点会无法使用,比如没有缓存功能,详情参考:[Public buckets · Cloudflare R2 docs](https://developers.cloudflare.com/r2/buckets/public-buckets/#managed-public-buckets-through-r2dev)
### 1. 创建 Bucket
进入到 Cloudflare 后台 R2 的部分,点击 `Create bucket` 创建新的 Bucket存储桶
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/e378bc6011c93a9160c84c332d1420a8.png)
然后选择位置,我这里选择的是 Automatic也可以根据自己的需要修改位置确认好位置后点击右下角的 `Create Bucket` 创建 Bucket
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/d6bb1efe702170114637e0d233bcfa06.png)
创建好之后就可以在 **Overview** 那边就可以看到创建好的 Bucket 了,点击 Bucket 名进入详情页。
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/7c7c6c01a122c2b42eacf29958b97fb6.png)
### 2. 开启 Public Access
进入到详情页之后点击 **Settings** 标签页
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/92b400d0522ba0a21876aa4dfbab30c0.png)
下拉到 **Public access** 一栏绑定域名,先输入域名,然后点击`Continue` ,然后点击`Connect domain`,接着 Cloudflare 会自动处理 DNS 的事情。
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/10490e75547604ad3f3ca73387388703.png)
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/c897bd3125d7083ca948129b42115ad7.png)
这样就是绑定好了:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/9f99a3e4dc294f8c23533079362b3f73.png)
如果域名不满足条件就会报错:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/b9ecd8f105c3f7767a7fe9fe62454919.png)
但这种情况也可以通过使用 **R2.dev subdomain** 来开启 Public Access点击右边的`Allow Access`就可以开启了:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/a19927fbcc14abff2eab87ea8279dda5.png)
### 3. 设置 CORS
为什么需要设置 CORS
> Cross-origin resource sharing (CORS) is a mechanism that allows restricted resources (e.g. fonts) on a web page to be requested from another domain outside the domain from which the first resource was served. A web page may freely embed cross-origin images, stylesheets, scripts, iframes, and videos. Certain "cross-domain" requests, notably Ajax requests, are forbidden by default by the
>
> 跨源资源共享 (CORS) 是一种机制允许从提供第一个资源的域之外的另一个域请求网页上的受限资源例如字体。网页可以自由嵌入跨源图像、样式表、脚本、iframe 和视频。某些“跨域”请求,特别是 Ajax 请求,默认情况下被同源安全策略禁止。[^1]
当我们使用主域名(比如`seviche.cc`来访问子域名`m.seviche.cc` 上面的内容时,就会产生跨域问题,可以通过 CORS 来解决这个问题,在这里可以很方便地设置,滑动到下方 **CORS Policy** 的部分,点击右边按钮 `Add CROS policy` 添加:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/8b753bed24fb1c0026b875e9b2097fc7.png)
设置里默认添加了一个`http://localhost:3000`的 URL可以删掉然后在`AllowedOrigins` 下面添加 Akkoma 的链接,比如`https://example.com`,以及在`AllowedMethods` 里加上 `POST`、`PUT`、`DELETE`, 如果下方没有任何报错就可以点右下角的 `Save` 保存,这部分就配置好了,但先不要关闭 Cloudflare 的页面。
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/9fdab9e3ec71523fd56565a3d0c0b301.png)
### 4. 修改 Admin-Fe 中的设置
打开 Admin-Fe打开很下面的 **Upload** 标签页,然后修改 Uploader 为 S3Filter 选择可以参考文档中的 Cheat Sheet[Configuration Cheat Sheet - Akkoma Documentation](https://docs.akkoma.dev/stable/configuration/cheatsheet/#upload-filters)
我的设置:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/52f3d77ef6fea8006cffabe951e53a2a.png)
**Base URL** 的部分,如果刚才没有绑定自定义域名,那么这里可以使用 **Public R2.dev Bucket URL**,可以在 Bucket -> Setting -> R2.dev subdomain 部分找到。
### 5. 配置 S3 Keys
我们先回到 Cloudflare 创建 API Token进入 **R2 Overview 页**面,点击右边的 `Manage R2 API Tokens`:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/b5ae05b4fd8ea560b6bbb69719a1916e.png)
然后点击`Create API Token`
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/6b3e57bf9b18173f26dacfd1b77f4901.png)
权限选择第三个 **Object Read & Write**,并在 **Specify bucket(s)** 里选择对应的 Bucket
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/47129708b27fa9d2fd5b88f28dfdbf84.png)
下面的 TTL 设置可以随你喜欢。
在最下方的 **Client IP Address Filtering** 中 还可以设置阻止或者允许某些 IP我在 Include 里添加了 Akkoma 实例所在服务器的 IP
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/3e031c60c835e0f9954a29a04136393d.png)
确认好各项配置后,点击右下角的 `Create API Token`,接着滚动到 Token 结果页面,复制下方的 Access Key ID 和 Secret Access Key粘贴到刚才打开的 Admin-Fe 的相应位置:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/854eac991e5ad3a500147d2d65196391.png)
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/0b102949d640e727d44743b9c601298a.png)
Host 部分可以在 Bucket 内的 Setting -> Bucket Detail 中找到,后面的 `/pleroma` 和前面的`https://` 都不需要:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/738df42e84fcba827fc0f475fbc0b446.png)
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/a06e14924e31335cb64c84905f0a88e4.png)
Region 写 auto如果之前创建 Region 的时候有设置特殊 Region 的话这里是不能指明的,参考文档:[S3 API compatibility · Cloudflare R2 docs](https://developers.cloudflare.com/r2/api/s3/api/#bucket-region)
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/f4977da84c017e8c32af7c8cc575105c.png)
### 6. 设置目标 Bucket
**Pleroma.Uploaders.S3** 部分填入 Cloudflare R2 的 Bucket 名字,比如我们之前设置的是 Pleroma
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/1ef59a26f9c80754cd30a3b9cde3f68c.png)
我的其他设置(什么也没设置):
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/579dde690557d4a8505866a3add190d6.png)
最后保存设置,重启 Pleroma。
### 7. 迁移本地 uploads 文件夹到 Bucket 中
我当时是使用 rclone 来复制迁移的。经过网友 Diara 的提醒,才发现有一个内置的 CLI 命令,可以很方便的迁移:[Managing uploads - Akkoma Documentation](https://docs.akkoma.dev/stable/administration/CLI_tasks/uploads/),但是我没试过,具体命令:
```bash
su akkoma -s $SHELL -lc "./bin/pleroma_ctl uploads migrate_local S3"
```
也可以迁移后删除本地文件:
```bash
su akkoma -s $SHELL -lc "./bin/pleroma_ctl uploads migrate_local S3 --delete"
```
## Part2. 配置 Media Proxy
这一部分和前面的部分可以说是完全不相干这部分我是复制网友面条的设置原帖文已经找不到了Sorry
Media Proxy 的功能是给外站的媒体文件通过 Cloudflare 代理中转一下,这样访问一些外站媒体会更流畅一点。
### 1. 创建 Worker
首先在 Cloudflare 里的 **Worker & Pages** 部分点击 `Create Application` 创建 Worker
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/69462063976a31e2f06fbe30fc235d1b.png)
再点`Create Worker`:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/89ec8e417b167ad4c16654b8aa90d968.png)
填入喜欢的名字,然后点击右下角 `Deploy`:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/9d6e8881fdcc80420a1323e872331b39.png)
### 2. 修改 Worker 配置
点击 `Configure Worker` 配置 Worker
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/bf0d456e9e8a84411842782c08ce16fe.png)
接着点击右边`Quick Edit` 进入编辑页面:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/d0ae67264160a6cb9a0a864e772b44cf.png)
删掉默认代码,填入下面的代码(由网友面条提供):
```js
function decodeBase64 (str) {
try {
return atob(str)
} catch (e) {
console.log(e)
return null
}
}
export default {
async fetch(request, env) {
const url = new URL(request.url)
const pathList = url.pathname.split('/') || []
const mediaUrl = decodeBase64(pathList[3] || '')
if (!mediaUrl) {
return new Response('')
}
console.log(mediaUrl)
return fetch(mediaUrl, {
headers: request.headers
})
}
}
```
点击右上角 `Save and Deploy` 保存:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/32b0abf44e84855a5bd819cb19a5c7b3.png)
### 3. 使用自定义域名
当然不使用也可以,不使用自定义域名的话可以直接使用 Worker's hostname也就是这个部分
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/3733606c5f925e58a4d87313b2557145.png)
在 worker 页面,打开 **Triggers** 标签页,然后点下面的 `Add Custom Domain` :
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/946376091f527edd8e56809c3a128182.png)
然后填入自定义域名,比如:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/8784ae5253424f786983ef07436b27a2.png)
点击`Add Custom Domain` 就加好了
### 4. 配置 Admin-Fe
打开 Admin-Fe 的 **Media Proxy** 页面,修改 **Base URL** 为上一步中修改的 Custom Domain
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/f20d44a7a7085f214974e0606b570e7e.png)
如果没有设置 Custom Domain 的话可以用 Custom Domain 部分提供的`production.proxy.<ID>.workers.dev` URL
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/633623be7cca6937239862d8867113da.png)
然后就设置好了,下面的其他部分我没有特殊设置,这里就不讲了。但我没开 Media preview proxy之前开了会看不到图片可能需要再做一些特殊设置但感觉也没什么开的必要
## Part3. 配置 Varnish Cache
参考文档:[Using a Varnish Cache - Akkoma Documentation](https://docs.akkoma.dev/stable/configuration/optimisation/varnish_cache/)
### 1. 安装 Varish
参考:[Installing Varnish on Ubuntu - Varnish Developer Portal](https://www.varnish-software.com/developers/tutorials/installing-varnish-ubuntu/)
### 2. 配置 Varnish
进入 Akkoma 目录,比如在`/opt/akkoma` 下,复制 Akkoma 预置的 Varnish 配置文件到 Varnish 目录下:
```bash
cp /opt/akkoma/installation/akkoma.vcl /etc/varnish/akkoma.vcl
```
进入 Varnish 配置目录中,删除已有的`default.vcl` 配置:
```bash
cd /etc/varnish
sudo rm -rf default.vcl
```
- 启动 Varnish`sudo systemctl start varnish`
- 检查 Varnish 情况:`sudo systemctl status varnish`
- 停止 Varnish `sudo systemctl stop varnish`
- 设置开机启动:`sudo systemctl enable varnish`
启动后可以通过`curl -D- localhost:6081` 检查运行情况,像这样就是正常运行了:
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/08b5f75652ba273857bed45f543b4348.png)
### 3. 修改 Nginx 配置,可以修改下面的 upstream 端口为 6081
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/0281c202faf7be0dcd5168ec03a9c345.png)
## Part4. Storing Remote Media
建议参考文档:[Storing Remote Media - Akkoma Documentation](https://docs.akkoma.dev/stable/configuration/storing_remote_media/)
这部分我的配置不保证不产生任何副作用,因为我配置之后有些路由会 503不确定是上面和这个环节那里出了错下面我的配置仅供参考
```conf
proxy_cache_path /tmp/akkoma-media-cache levels=1:2 keys_zone=pleroma_media_cache:10m max_size=10g
inactive=720m use_temp_path=off;
```
```conf
location /media {
proxy_cache akkoma_media_cache;
slice 1m;
proxy_cache_key $host$uri$is_args$args$slice_range;
proxy_set_header Range $slice_range;
proxy_cache_valid 200 206 301 304 1h;
proxy_cache_lock on;
proxy_ignore_client_abort on;
proxy_buffering on;
chunked_transfer_encoding on;
proxy_pass http://phoenix;
}
location /proxy {
proxy_cache akkoma_media_cache;
proxy_cache_lock on;
proxy_pass http://phoenix;
}
```
然后打开 Admin-Fe 中的 **MRF** 页面,在 Policies 的部分加上`MediaProxyWarmingPolicy`
![image.png](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2023/09/2cd95b84644fbccfa5fe9ddd47d3f440.png)
大功告成。
## 后言
朋友 loikein 说像这种可能会重复说的话就可以整理成博客了,我觉得它说得很对,我以后会多整理一下这些回答过很多朋友的内容,之后或许:我离不开 Obsidian 的几个理由,还有很多想写的,但先不吹牛了。
[^1]: [Cross-Origin Resource Sharing (CORS) - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)