Compare commits
2223 Commits
2023.11.0-
...
multi-serv
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f9e2cd4088 | ||
![]() |
0929410d36 | ||
![]() |
35a3acab42 | ||
![]() |
96866d37cd | ||
![]() |
35b66276ff | ||
![]() |
daa16d184f | ||
![]() |
833a232262 | ||
![]() |
bcb891e4fd | ||
![]() |
152660fcf2 | ||
![]() |
a1204f5e3e | ||
![]() |
7acd3d1a88 | ||
![]() |
8c9ec5827f | ||
![]() |
44073736de | ||
![]() |
0126dba475 | ||
![]() |
3280a3d661 | ||
![]() |
bdf80c49d8 | ||
![]() |
59169a6450 | ||
![]() |
5d228fb0f3 | ||
![]() |
10b67e1b3a | ||
![]() |
3ced310f77 | ||
![]() |
010ec113c2 | ||
![]() |
30005ba959 | ||
![]() |
6b69588c03 | ||
![]() |
8593aa1418 | ||
![]() |
9876ff9a7a | ||
![]() |
ce6eba77d9 | ||
![]() |
9b2af53025 | ||
![]() |
7b6ff19ea3 | ||
![]() |
c9fa95429a | ||
![]() |
e5d117dc98 | ||
![]() |
4a73feb041 | ||
![]() |
a06b9eefaa | ||
![]() |
3129fcf164 | ||
![]() |
35a4544477 | ||
![]() |
aa1cc2f817 | ||
![]() |
15685be4cc | ||
![]() |
8508c4dadc | ||
![]() |
e594fb0037 | ||
![]() |
a369721791 | ||
![]() |
f8e244f48d | ||
![]() |
8410611512 | ||
![]() |
caab1ec7c3 | ||
![]() |
ffade9740e | ||
![]() |
b03bcf26cd | ||
![]() |
ddbc83b2e4 | ||
![]() |
d185785f20 | ||
![]() |
02d7fbefc4 | ||
![]() |
f7ea92c68c | ||
![]() |
e891d5c5d3 | ||
![]() |
57a6b630b7 | ||
![]() |
eda768a08c | ||
![]() |
1f345eb839 | ||
![]() |
1f2801af02 | ||
![]() |
a4ba096e2a | ||
![]() |
6841cdfa76 | ||
![]() |
794f360bc2 | ||
![]() |
f797765b1d | ||
![]() |
9dce512fbb | ||
![]() |
9e91f85370 | ||
![]() |
9998cb84e8 | ||
![]() |
5ed1101bbd | ||
![]() |
6c9153300d | ||
![]() |
7957ee5191 | ||
![]() |
b200743845 | ||
![]() |
08f7e7d9b3 | ||
![]() |
16ad6b3f6c | ||
![]() |
4df9083bf0 | ||
![]() |
6419af2179 | ||
![]() |
d9858b03c9 | ||
![]() |
88efc0a3be | ||
![]() |
ac21fa7194 | ||
![]() |
c76afce9a7 | ||
![]() |
8e3304344f | ||
![]() |
db5c127cdd | ||
![]() |
0402866b43 | ||
![]() |
6cefabc6b6 | ||
![]() |
c9c04d8391 | ||
![]() |
27e8805dcb | ||
![]() |
933abedc90 | ||
![]() |
69eee9f050 | ||
![]() |
2918fb2609 | ||
![]() |
fcd7fa62ba | ||
![]() |
be7e3b9a0c | ||
![]() |
06e7272ca1 | ||
![]() |
f35eb0f6d9 | ||
![]() |
bdb74539d4 | ||
![]() |
abc1e9168d | ||
![]() |
d30ddd4c2e | ||
![]() |
05cdc095c0 | ||
![]() |
7c1dc3d632 | ||
![]() |
c53349c3b4 | ||
![]() |
a710af54ed | ||
![]() |
ac07bb8d92 | ||
![]() |
698505030e | ||
![]() |
e16a14dcef | ||
![]() |
6d93725084 | ||
![]() |
cb9981d4eb | ||
![]() |
bee4db82bb | ||
![]() |
d7706ef1b5 | ||
![]() |
baf3f4a1d1 | ||
![]() |
c7a56c2c2b | ||
![]() |
8dfff79ca2 | ||
![]() |
83c3bb839f | ||
![]() |
a9fe7eff0a | ||
![]() |
d49ecab792 | ||
![]() |
56459bbe68 | ||
![]() |
6c150ef1fb | ||
![]() |
c78f45ea20 | ||
![]() |
82481c01e0 | ||
![]() |
741cbc34e6 | ||
![]() |
5e86550de3 | ||
![]() |
92aef300ee | ||
![]() |
9ce1b68fd7 | ||
![]() |
5be5c8bec4 | ||
![]() |
0214a0001f | ||
![]() |
46067f6e17 | ||
![]() |
2b71bdf114 | ||
![]() |
9d6b521351 | ||
![]() |
ad708d896b | ||
![]() |
22228b6756 | ||
![]() |
f7ea0c6991 | ||
![]() |
60a3513cfc | ||
![]() |
377f002d68 | ||
![]() |
896bde1005 | ||
![]() |
6d0242277d | ||
![]() |
60f90ca649 | ||
![]() |
f3be426383 | ||
![]() |
e8a6629cb5 | ||
![]() |
44658ae981 | ||
![]() |
19384efbc5 | ||
![]() |
adf22143aa | ||
![]() |
a17acf647b | ||
![]() |
01a3eabc4e | ||
![]() |
59567a7ccc | ||
![]() |
7fb8fccd57 | ||
![]() |
a4711ab4c1 | ||
![]() |
bbe404a0b2 | ||
![]() |
0610bd657f | ||
![]() |
77667cf80d | ||
![]() |
801a2ec1db | ||
![]() |
2a96e39bb3 | ||
![]() |
616cccf251 | ||
![]() |
7114523d84 | ||
![]() |
5d683728f3 | ||
![]() |
b8632f389d | ||
![]() |
830da5e9f1 | ||
![]() |
e2eddd5b1a | ||
![]() |
d4f9bf1f11 | ||
![]() |
734c78ddd1 | ||
![]() |
c63c3462dd | ||
![]() |
a3bba23b7d | ||
![]() |
94a3e37ba8 | ||
![]() |
cc09de7b27 | ||
![]() |
da66079c29 | ||
![]() |
ec83815227 | ||
![]() |
6199139307 | ||
![]() |
15b0345335 | ||
![]() |
28b40691d5 | ||
![]() |
a778a63a12 | ||
![]() |
96fc7e307a | ||
![]() |
bd13fb626c | ||
![]() |
d87488a5f0 | ||
![]() |
495db27433 | ||
![]() |
39c487e1d1 | ||
![]() |
b5799351d0 | ||
![]() |
7f31fd24b1 | ||
![]() |
389ec6350b | ||
![]() |
2b6638e160 | ||
![]() |
20cc6d3049 | ||
![]() |
1b44954dcb | ||
![]() |
5dc99e6f89 | ||
![]() |
d1504a5a83 | ||
![]() |
5a97f040c7 | ||
![]() |
0456c0f3c2 | ||
![]() |
524adda2a6 | ||
![]() |
426940bea7 | ||
![]() |
9a619c621d | ||
![]() |
25052164c0 | ||
![]() |
7c87dec6ee | ||
![]() |
34f8345bc8 | ||
![]() |
93e7aad44e | ||
![]() |
9ffe504c7f | ||
![]() |
b965240da4 | ||
![]() |
bacc212f81 | ||
![]() |
5991282e23 | ||
![]() |
f3a4434830 | ||
![]() |
e2a55e2a31 | ||
![]() |
05d41f2a7a | ||
![]() |
994f8b556d | ||
![]() |
88900492a4 | ||
![]() |
9611bfbbf7 | ||
![]() |
1c48d50bf2 | ||
![]() |
ab9b807cd2 | ||
![]() |
c9ab7eab92 | ||
![]() |
019f04292c | ||
![]() |
8dc01e9421 | ||
![]() |
280f465769 | ||
![]() |
57e86fe609 | ||
![]() |
d8c4908aa5 | ||
![]() |
208b201776 | ||
![]() |
4de33aca8c | ||
![]() |
49d7bc5faf | ||
![]() |
6bb4669242 | ||
![]() |
5d82e1b2d0 | ||
![]() |
ffd8cf07e6 | ||
![]() |
1e88aa9d81 | ||
![]() |
d893fbc5af | ||
![]() |
4d562e7439 | ||
![]() |
30df768d26 | ||
![]() |
ebd06becbf | ||
![]() |
cf35208777 | ||
![]() |
d1eddf0d88 | ||
![]() |
d5ad953c9e | ||
![]() |
e339293673 | ||
![]() |
a1ca68aadd | ||
![]() |
420365c17f | ||
![]() |
dc608aada0 | ||
![]() |
231c2c2e54 | ||
![]() |
2f8d02024a | ||
![]() |
4b98b446be | ||
![]() |
026ec40b3b | ||
![]() |
54fc232a23 | ||
![]() |
a3cc865e11 | ||
![]() |
d7b443d1f0 | ||
![]() |
607bf60007 | ||
![]() |
d008394eb7 | ||
![]() |
47a76bbc4c | ||
![]() |
cfb61289a9 | ||
![]() |
c548ec9906 | ||
![]() |
c634ae37e5 | ||
![]() |
b7c3630da9 | ||
![]() |
0f0e88e4c7 | ||
![]() |
fd880660a3 | ||
![]() |
2f4e2a7cca | ||
![]() |
23fc79bf06 | ||
![]() |
fbc6d0de54 | ||
![]() |
904da7bad6 | ||
![]() |
82d4109339 | ||
![]() |
0c634c9675 | ||
![]() |
5840c7a945 | ||
![]() |
cb48853334 | ||
![]() |
495d72ed2a | ||
![]() |
19857632d0 | ||
![]() |
9c70a4e631 | ||
![]() |
a1be39d94f | ||
![]() |
9230ee52a0 | ||
![]() |
06f113b226 | ||
![]() |
d4226c6adf | ||
![]() |
850d1d0005 | ||
![]() |
28490f3a58 | ||
![]() |
ae65aecc0c | ||
![]() |
89b461a5da | ||
![]() |
40bfb1be09 | ||
![]() |
ba9f295ef2 | ||
![]() |
77e421029c | ||
![]() |
f8f17a44d4 | ||
![]() |
87b9016dbe | ||
![]() |
2c3a41e4a0 | ||
![]() |
6250af2a2c | ||
![]() |
8232ea6956 | ||
![]() |
4f31dcfed3 | ||
![]() |
605756d425 | ||
![]() |
abb1e4bead | ||
![]() |
297186e492 | ||
![]() |
791b4500ec | ||
![]() |
ef29130057 | ||
![]() |
f4bca4708e | ||
![]() |
e94c697aae | ||
![]() |
8f37fb6713 | ||
![]() |
35104d87d5 | ||
![]() |
0a41e36b6d | ||
![]() |
1cd1264ec0 | ||
![]() |
26874df4b6 | ||
![]() |
31ccefa050 | ||
![]() |
97f0ea0c0a | ||
![]() |
e8b633efec | ||
![]() |
68175bc38d | ||
![]() |
d7fdcbc733 | ||
![]() |
9470641dcd | ||
![]() |
8d7b1f285f | ||
![]() |
f9ad127aaf | ||
![]() |
b41e78090d | ||
![]() |
bb51574762 | ||
![]() |
dc48c49f95 | ||
![]() |
078b7d6cc5 | ||
![]() |
fb2c10551d | ||
![]() |
1ef62e9e33 | ||
![]() |
b16f5a781e | ||
![]() |
f01fc5af5a | ||
![]() |
85be61d86e | ||
![]() |
a328d52008 | ||
![]() |
363bdac39b | ||
![]() |
6396243973 | ||
![]() |
66532333cd | ||
![]() |
002e939003 | ||
![]() |
9760f3d7c9 | ||
![]() |
87cdbaea4f | ||
![]() |
1b47e2d4f2 | ||
![]() |
d018fe58aa | ||
![]() |
f45fd01551 | ||
![]() |
145c6cf2b5 | ||
![]() |
319f7e6a86 | ||
![]() |
ed43cd87c9 | ||
![]() |
40f8b5e7f5 | ||
![]() |
71cecdbcf2 | ||
![]() |
6a0a810243 | ||
![]() |
b65b70d489 | ||
![]() |
da9e05582d | ||
![]() |
9ddf7751db | ||
![]() |
d2e22f9050 | ||
![]() |
5445b023e5 | ||
![]() |
64501c69a1 | ||
![]() |
7fbfc2e046 | ||
![]() |
dd6743dda4 | ||
![]() |
d082a1dd34 | ||
![]() |
759b9f4cf1 | ||
![]() |
6820878676 | ||
![]() |
b161601863 | ||
![]() |
d86c77260e | ||
![]() |
d60c307c4e | ||
![]() |
c4192e81ed | ||
![]() |
13439e04c4 | ||
![]() |
bb4457266d | ||
![]() |
55713fcd65 | ||
![]() |
c49a13de65 | ||
![]() |
8652ce7cc0 | ||
![]() |
f6808711af | ||
![]() |
d7835313c3 | ||
![]() |
79b851fe56 | ||
![]() |
bbe80af1dd | ||
![]() |
f7da2bad6f | ||
![]() |
99ba7ebaa2 | ||
![]() |
8ad97e5ede | ||
![]() |
6c9eea2c0f | ||
![]() |
4120c9ab10 | ||
![]() |
1fbc129d7b | ||
![]() |
256560e8ba | ||
![]() |
faea401dcc | ||
![]() |
84bf90d1bd | ||
![]() |
574034a2dd | ||
![]() |
020882edcf | ||
![]() |
f4e025170e | ||
![]() |
79b3d2a711 | ||
![]() |
6649e58b56 | ||
![]() |
62299588d8 | ||
![]() |
3c81926f71 | ||
![]() |
f123be38b9 | ||
![]() |
0804092426 | ||
![]() |
3e0fcaeca8 | ||
![]() |
5a2b29a3b4 | ||
![]() |
234d91a884 | ||
![]() |
e8bf6285cb | ||
![]() |
074b7b0bee | ||
![]() |
020c191e2c | ||
![]() |
dac3b1f405 | ||
![]() |
fa271cf84e | ||
![]() |
8076f78d06 | ||
![]() |
dd56623cde | ||
![]() |
a0e91b5882 | ||
![]() |
eddf6a2319 | ||
![]() |
d176db517f | ||
![]() |
ae1d0b08eb | ||
![]() |
a77ad7a16b | ||
![]() |
00301ed04f | ||
![]() |
d91a1be562 | ||
![]() |
04b221409c | ||
![]() |
0e90589290 | ||
![]() |
872cefcfb8 | ||
![]() |
551040ed0f | ||
![]() |
71bfa85986 | ||
![]() |
f25fc5215b | ||
![]() |
1911972ae2 | ||
![]() |
752606fe88 | ||
![]() |
7f0ae038d4 | ||
![]() |
9871035597 | ||
![]() |
a21a2c52d7 | ||
![]() |
c1f19fad1e | ||
![]() |
3a6c2aa835 | ||
![]() |
53e827b18c | ||
![]() |
0f59adc436 | ||
![]() |
9fdabe3666 | ||
![]() |
090e9392cd | ||
![]() |
b9cb949eb1 | ||
![]() |
5f675201f2 | ||
![]() |
1c284c8154 | ||
![]() |
aa48a0e207 | ||
![]() |
f0c3a4cc0b | ||
![]() |
4603ab67bb | ||
![]() |
763c708253 | ||
![]() |
6c5d3113c6 | ||
![]() |
968f595606 | ||
![]() |
7b9c884a5d | ||
![]() |
c271534aba | ||
![]() |
e800c0f85a | ||
![]() |
81348f1277 | ||
![]() |
0df6c79172 | ||
![]() |
eed45c7915 | ||
![]() |
42f9586fc6 | ||
![]() |
032dfc782d | ||
![]() |
00b8d0c072 | ||
![]() |
9aebf0c168 | ||
![]() |
a730045bdd | ||
![]() |
9614f74bf8 | ||
![]() |
b3c2de2b26 | ||
![]() |
cf1b7c7064 | ||
![]() |
2e0f3936a8 | ||
![]() |
459449864c | ||
![]() |
eef0c895bc | ||
![]() |
d9d92bcfbf | ||
![]() |
ce1f84e5a3 | ||
![]() |
cf7df05023 | ||
![]() |
ee2c017f48 | ||
![]() |
d0cdc0b7a1 | ||
![]() |
ac3bf57644 | ||
![]() |
e850462b82 | ||
![]() |
c0d1682604 | ||
![]() |
e26e24b610 | ||
![]() |
7f8c8f62b1 | ||
![]() |
4d54101510 | ||
![]() |
2305788ed9 | ||
![]() |
a11b77a415 | ||
![]() |
1bc4f400c0 | ||
![]() |
458c72c153 | ||
![]() |
6bd3ed2074 | ||
![]() |
31e5f0bd09 | ||
![]() |
e0a83e9c9e | ||
![]() |
1496700b37 | ||
![]() |
00cbf9fe80 | ||
![]() |
cf09aa21f0 | ||
![]() |
9f7d41eb47 | ||
![]() |
4a62051ce7 | ||
![]() |
3a421837bf | ||
![]() |
a4c5ce1413 | ||
![]() |
e75b62f3f5 | ||
![]() |
5b60ae810b | ||
![]() |
98b4717c45 | ||
![]() |
8a4ce16e90 | ||
![]() |
794cb9ffe2 | ||
![]() |
0b976064ca | ||
![]() |
bca690f256 | ||
![]() |
f1eb17f66c | ||
![]() |
b1c82213a3 | ||
![]() |
a896c39dbf | ||
![]() |
6718a54f6f | ||
![]() |
d57b8bf2e2 | ||
![]() |
224bbd486f | ||
![]() |
724dea8136 | ||
![]() |
ceb60d61b0 | ||
![]() |
17d9aca5a7 | ||
![]() |
7fc8a2a7b0 | ||
![]() |
a96f09cee3 | ||
![]() |
f30d19051f | ||
![]() |
8eb7749e44 | ||
![]() |
0472d43ee9 | ||
![]() |
eb701f2ff4 | ||
![]() |
74847bce30 | ||
![]() |
eecfac1dd9 | ||
![]() |
e927507886 | ||
![]() |
b1073714ba | ||
![]() |
04b37a1315 | ||
![]() |
93a03e6b6d | ||
![]() |
ec4358d1e8 | ||
![]() |
a6a1e3d733 | ||
![]() |
ded6ef207b | ||
![]() |
db95b6b0d6 | ||
![]() |
eeea4ec00b | ||
![]() |
07b2c3e5b2 | ||
![]() |
076cc953e2 | ||
![]() |
15ae1605ec | ||
![]() |
48d1539f3b | ||
![]() |
8b6d321a76 | ||
![]() |
952fec5665 | ||
![]() |
70b2a8f72e | ||
![]() |
c4f1ca2fd9 | ||
![]() |
9d0f7eeb9c | ||
![]() |
bc1fce9af6 | ||
![]() |
5f12bc515d | ||
![]() |
2f9c04b23b | ||
![]() |
5c79d8db20 | ||
![]() |
bc0c53b92b | ||
![]() |
d6caa4d9c4 | ||
![]() |
041c9caf31 | ||
![]() |
1d106b3ae8 | ||
![]() |
58419e1621 | ||
![]() |
2250e521e4 | ||
![]() |
a3a99467f0 | ||
![]() |
b1aac6acc3 | ||
![]() |
d2e8dc4fe3 | ||
![]() |
b990ae6b23 | ||
![]() |
3cea890eba | ||
![]() |
21a2aa5243 | ||
![]() |
825d218692 | ||
![]() |
b5de525548 | ||
![]() |
5005cc8ae3 | ||
![]() |
f13c3909a0 | ||
![]() |
77ebabb3dc | ||
![]() |
7fd8ef344b | ||
![]() |
b0a251d231 | ||
![]() |
04e74aa28c | ||
![]() |
140322b8e2 | ||
![]() |
3b361a9d0b | ||
![]() |
c46d6d8edd | ||
![]() |
64bbce4cf4 | ||
![]() |
ddca6bdc01 | ||
![]() |
8b7290d6b0 | ||
![]() |
521d92014d | ||
![]() |
2190092de6 | ||
![]() |
064d6ca56f | ||
![]() |
d0bb0b51f5 | ||
![]() |
088e05ea66 | ||
![]() |
fb23b24f5c | ||
![]() |
33b34ad7b8 | ||
![]() |
5229f5de4d | ||
![]() |
ff47fef572 | ||
![]() |
45d42b8641 | ||
![]() |
c4c69cd267 | ||
![]() |
ee08e9f51e | ||
![]() |
85bb1ff1db | ||
![]() |
824c51a19f | ||
![]() |
ef90f83917 | ||
![]() |
a87a18f40d | ||
![]() |
2f09d69773 | ||
![]() |
777804605e | ||
![]() |
af1cbc131f | ||
![]() |
c397b42242 | ||
![]() |
a2cd6a7709 | ||
![]() |
12bc671511 | ||
![]() |
d376aab45e | ||
![]() |
1ad3148533 | ||
![]() |
132c4ba6ce | ||
![]() |
67a5fccb3b | ||
![]() |
4c84842f3d | ||
![]() |
54849bde6c | ||
![]() |
b668d161a9 | ||
![]() |
21e51567e7 | ||
![]() |
ebae39cba5 | ||
![]() |
433732bcfc | ||
![]() |
a624546812 | ||
![]() |
4a356f1ba7 | ||
![]() |
0ad31bd5d4 | ||
![]() |
6de7c27522 | ||
![]() |
a304185eb8 | ||
![]() |
c13545f965 | ||
![]() |
0da6f14b3b | ||
![]() |
dd39c5e059 | ||
![]() |
1c99785e7e | ||
![]() |
d0213962bf | ||
![]() |
9858e12078 | ||
![]() |
c14eba3e6d | ||
![]() |
993d3fbe55 | ||
![]() |
3a11d5ede6 | ||
![]() |
ed89b4bd94 | ||
![]() |
03fb688073 | ||
![]() |
8b2780c730 | ||
![]() |
d2f1d45ea3 | ||
![]() |
a594d9f26b | ||
![]() |
26afe1cc96 | ||
![]() |
7933b6662e | ||
![]() |
ddf8e2a3dc | ||
![]() |
ddc799fe3d | ||
![]() |
057a6d731d | ||
![]() |
254c063455 | ||
![]() |
9d026975bc | ||
![]() |
d8cb7305ef | ||
![]() |
043fef9fdf | ||
![]() |
0d7d1091c8 | ||
![]() |
d8bf1ff7e9 | ||
![]() |
88698462a9 | ||
![]() |
ae3c155490 | ||
![]() |
fa06c59eae | ||
![]() |
b36d13d90c | ||
![]() |
3d637af65b | ||
![]() |
2340de035b | ||
![]() |
d8f30fb793 | ||
![]() |
708ffaef5c | ||
![]() |
2639e92e18 | ||
![]() |
ea2675eaab | ||
![]() |
3b0b4f83dd | ||
![]() |
975c2e7bc5 | ||
![]() |
e344650278 | ||
![]() |
1aee260398 | ||
![]() |
2fa805b8f7 | ||
![]() |
ed71b0b7d4 | ||
![]() |
864327b4a7 | ||
![]() |
c1597be458 | ||
![]() |
a08a38c29a | ||
![]() |
650e22c90d | ||
![]() |
fa2558fce8 | ||
![]() |
7bdc4e8509 | ||
![]() |
d266c3cdf4 | ||
![]() |
d2175a9b9f | ||
![]() |
2a4ab0e187 | ||
![]() |
2c1a7470d3 | ||
![]() |
75ea964312 | ||
![]() |
a09b03ed3a | ||
![]() |
a722ea8ccd | ||
![]() |
1e9813e19e | ||
![]() |
e97b7fe2a1 | ||
![]() |
87617dca39 | ||
![]() |
9dc058189e | ||
![]() |
83db116c46 | ||
![]() |
d3e2b59f53 | ||
![]() |
1074d625ed | ||
![]() |
6dde457452 | ||
![]() |
a25d83f249 | ||
![]() |
6fd4de246c | ||
![]() |
e9519b02fb | ||
![]() |
b6578861ac | ||
![]() |
ca8cc015b0 | ||
![]() |
4f34a4e4d8 | ||
![]() |
5fc8b3bc50 | ||
![]() |
781e64aa7f | ||
![]() |
d6e1f022d4 | ||
![]() |
2ea49703f6 | ||
![]() |
1184436461 | ||
![]() |
0871156780 | ||
![]() |
088707c114 | ||
![]() |
15f2e1425c | ||
![]() |
57effa9ef0 | ||
![]() |
f0d0cd2e50 | ||
![]() |
c3b0e1a2bd | ||
![]() |
afbba1ff1c | ||
![]() |
6964b919f8 | ||
![]() |
e5856c6b3b | ||
![]() |
3f3c59e1ae | ||
![]() |
f49d7927aa | ||
![]() |
9e9198086d | ||
![]() |
ca022b9349 | ||
![]() |
25670b5f16 | ||
![]() |
6fdb2b13f4 | ||
![]() |
28e9d4e483 | ||
![]() |
e4d4cc5277 | ||
![]() |
27a256b502 | ||
![]() |
b83a2f33ff | ||
![]() |
d8a2eeb7ed | ||
![]() |
89841e4c9a | ||
![]() |
31988db547 | ||
![]() |
7134d24c1f | ||
![]() |
4c76ea1fa6 | ||
![]() |
d8dd1683c9 | ||
![]() |
fde94f638b | ||
![]() |
aee984813d | ||
![]() |
f2385a8ffc | ||
![]() |
0f8b15f0fe | ||
![]() |
8c3be57ab3 | ||
![]() |
5c62cbcca8 | ||
![]() |
5c94b4cb49 | ||
![]() |
244bcafc5d | ||
![]() |
8890a7a0b7 | ||
![]() |
4b3ecd49de | ||
![]() |
dd124a8aed | ||
![]() |
53682f5cc6 | ||
![]() |
c88957c037 | ||
![]() |
9d3a331286 | ||
![]() |
1679a40c76 | ||
![]() |
c9819babfe | ||
![]() |
7045547e46 | ||
![]() |
6a1a2bef43 | ||
![]() |
1d8bfe4f1c | ||
![]() |
ca967e83bd | ||
![]() |
423bfc8798 | ||
![]() |
6ee55e1ab3 | ||
![]() |
9612195fc3 | ||
![]() |
4be307f223 | ||
![]() |
1b2b95e199 | ||
![]() |
aef15069a2 | ||
![]() |
3674e9b1cb | ||
![]() |
98de7ca526 | ||
![]() |
23a07c2706 | ||
![]() |
689848943b | ||
![]() |
a37df2cd8e | ||
![]() |
6378dfbffc | ||
![]() |
cd247b99ee | ||
![]() |
0c6d1ec524 | ||
![]() |
e673c143a9 | ||
![]() |
7f7445ad7a | ||
![]() |
733fd56058 | ||
![]() |
3f0aaaa41e | ||
![]() |
2aebdb8cc5 | ||
![]() |
cd52dc73bb | ||
![]() |
1ba09e1eee | ||
![]() |
2c615357f2 | ||
![]() |
76b9bc478a | ||
![]() |
f93a575c3a | ||
![]() |
e6e4182b53 | ||
![]() |
736d8283c1 | ||
![]() |
0041ad3e69 | ||
![]() |
973d8366c3 | ||
![]() |
2762e29f7f | ||
![]() |
0bbeb40c0a | ||
![]() |
e87cbd2a36 | ||
![]() |
1d5a3023f4 | ||
![]() |
bd5f25c678 | ||
![]() |
6ba97a7763 | ||
![]() |
d435d04eaf | ||
![]() |
01ec708020 | ||
![]() |
0e92cbf905 | ||
![]() |
8ad9f7209b | ||
![]() |
3df1bb2d71 | ||
![]() |
891bbcf475 | ||
![]() |
023fa30280 | ||
![]() |
3ad5c753fa | ||
![]() |
76408667f3 | ||
![]() |
9ac4d3da0a | ||
![]() |
67a5119072 | ||
![]() |
00ccc2251a | ||
![]() |
3d92ef193e | ||
![]() |
e9085e455f | ||
![]() |
85f46f88c6 | ||
![]() |
9cd784cdee | ||
![]() |
d4d15f338e | ||
![]() |
d3f1b0f090 | ||
![]() |
2ee19ee22e | ||
![]() |
a18a6ac264 | ||
![]() |
7e9d54fa3a | ||
![]() |
f0834ca14c | ||
![]() |
0b062f1407 | ||
![]() |
f585f70dcb | ||
![]() |
8d23122fd6 | ||
![]() |
2d0e9e0544 | ||
![]() |
f5563c8304 | ||
![]() |
4ac8aad50a | ||
![]() |
ceb4640669 | ||
![]() |
3bf63dd9c5 | ||
![]() |
ce95323e49 | ||
![]() |
daf9ae5d4a | ||
![]() |
a5e61b8c19 | ||
![]() |
cacdf9d939 | ||
![]() |
0134e6e420 | ||
![]() |
6bd6af440f | ||
![]() |
7d7a12d7d6 | ||
![]() |
887c709647 | ||
![]() |
0e4b6d1dad | ||
![]() |
07f26bc8dd | ||
![]() |
366b79e459 | ||
![]() |
6b2072f4b1 | ||
![]() |
1544ba9153 | ||
![]() |
be0906a6c7 | ||
![]() |
e0f54d6a68 | ||
![]() |
837a8e15d8 | ||
![]() |
0c2cfe31a3 | ||
![]() |
05c944c2cc | ||
![]() |
f393b6b898 | ||
![]() |
672779a15f | ||
![]() |
2cbe1d1210 | ||
![]() |
0d0cd738f8 | ||
![]() |
567acea2a3 | ||
![]() |
8d19bdbb65 | ||
![]() |
cdb0566c5b | ||
![]() |
f7398faeac | ||
![]() |
c8f49b6ae7 | ||
![]() |
74c93fcebe | ||
![]() |
8be624aa44 | ||
![]() |
3fe7e37f10 | ||
![]() |
7fe3035059 | ||
![]() |
06855f769f | ||
![]() |
3e85052754 | ||
![]() |
b6fdd71957 | ||
![]() |
36dff66883 | ||
![]() |
255c8bd1b9 | ||
![]() |
44f62160cb | ||
![]() |
8032a4e12a | ||
![]() |
2f009f7d49 | ||
![]() |
f85aa7b641 | ||
![]() |
1008fa32a0 | ||
![]() |
043ab1f69b | ||
![]() |
21a3095eb0 | ||
![]() |
1b5f0571f7 | ||
![]() |
59e83605ac | ||
![]() |
130ff361c3 | ||
![]() |
e78110a5cd | ||
![]() |
6c5593d456 | ||
![]() |
882c8b93c1 | ||
![]() |
621626aad3 | ||
![]() |
f4f55ef012 | ||
![]() |
2e8a1029a4 | ||
![]() |
b53ee54e4f | ||
![]() |
b708b27bc8 | ||
![]() |
9ce44b24b8 | ||
![]() |
3cd5f86510 | ||
![]() |
9b78ce8047 | ||
![]() |
1629c0e50d | ||
![]() |
427f4a2cda | ||
![]() |
ba9c5c37b8 | ||
![]() |
e790aa0548 | ||
![]() |
bf8c42eecd | ||
![]() |
129af06198 | ||
![]() |
83c04c55ad | ||
![]() |
0b98554319 | ||
![]() |
4e0d57000c | ||
![]() |
c0de57c08d | ||
![]() |
75b0315ace | ||
![]() |
6cdecd72ee | ||
![]() |
9fbc1b7f7b | ||
![]() |
fd744f44c1 | ||
![]() |
383c41bdb6 | ||
![]() |
68ec7450af | ||
![]() |
06684fe49b | ||
![]() |
059eb6d379 | ||
![]() |
61cc3b5642 | ||
![]() |
2ab5ee81b1 | ||
![]() |
ef950a345b | ||
![]() |
bfaf938609 | ||
![]() |
d3cdc08802 | ||
![]() |
571566d476 | ||
![]() |
748a7e8f6a | ||
![]() |
6db3c50e32 | ||
![]() |
26322048db | ||
![]() |
a8810af8d9 | ||
![]() |
45d88574c3 | ||
![]() |
b68b2ee8c6 | ||
![]() |
86dd4abadc | ||
![]() |
cd210001e6 | ||
![]() |
41936c16c4 | ||
![]() |
4d757865f4 | ||
![]() |
2a2bbcd1bc | ||
![]() |
94b8c00c66 | ||
![]() |
ab7bbd4e57 | ||
![]() |
93fc06d18b | ||
![]() |
0aaf74ee22 | ||
![]() |
046f2435b2 | ||
![]() |
37c9d91ba0 | ||
![]() |
93c569c2cd | ||
![]() |
cb10156f01 | ||
![]() |
1532d5f390 | ||
![]() |
7e3dedb045 | ||
![]() |
01a815f8a7 | ||
![]() |
f50941389d | ||
![]() |
0d508db8a7 | ||
![]() |
f244d42500 | ||
![]() |
820becb4e4 | ||
![]() |
6e3e7d7df1 | ||
![]() |
008a66d73f | ||
![]() |
e98f66db51 | ||
![]() |
59e2e43a68 | ||
![]() |
1a521a44c0 | ||
![]() |
d6ba12e24c | ||
![]() |
4b04b2989b | ||
![]() |
d63b854f96 | ||
![]() |
9dacc20d67 | ||
![]() |
3137c104f2 | ||
![]() |
63f9c271ca | ||
![]() |
400ae6ef01 | ||
![]() |
8b163cd3fb | ||
![]() |
676c599e48 | ||
![]() |
fccc5b6d62 | ||
![]() |
0bb5ac0fca | ||
![]() |
c7354c5e30 | ||
![]() |
5c42a0e439 | ||
![]() |
8f40f932e4 | ||
![]() |
86b4f49880 | ||
![]() |
916ed49441 | ||
![]() |
d0b7c74fd1 | ||
![]() |
2307849c9a | ||
![]() |
8bae2ecabd | ||
![]() |
3411b9c16c | ||
![]() |
674a424db3 | ||
![]() |
d1eb10af24 | ||
![]() |
9181eb277e | ||
![]() |
3548ffba26 | ||
![]() |
f965f65dcd | ||
![]() |
cb3106cdc6 | ||
![]() |
39498ddbf1 | ||
![]() |
f0ec68c3cf | ||
![]() |
b359e3c95b | ||
![]() |
6bd46e790b | ||
![]() |
7135da7887 | ||
![]() |
bff813042e | ||
![]() |
7e9c38d6fb | ||
![]() |
5eea41b089 | ||
![]() |
866abff54d | ||
![]() |
45f909ef33 | ||
![]() |
738b3ea43b | ||
![]() |
de3ddb5b44 | ||
![]() |
b44313fe3c | ||
![]() |
1a79f0dc2a | ||
![]() |
c3437b1908 | ||
![]() |
1991a02aa9 | ||
![]() |
72bc789746 | ||
![]() |
0f0660d49e | ||
![]() |
865b3039cc | ||
![]() |
efa80f9ad4 | ||
![]() |
61f4a03e6c | ||
![]() |
085b3abf26 | ||
![]() |
5df85b8be1 | ||
![]() |
02ecd1b371 | ||
![]() |
22c4e9d7ec | ||
![]() |
46d96c7412 | ||
![]() |
0d76842abe | ||
![]() |
908d3ecb5c | ||
![]() |
8959ff89d0 | ||
![]() |
ee2f0f3a21 | ||
![]() |
ed6dc84c5f | ||
![]() |
7c67d3a5aa | ||
![]() |
3d8eda14a2 | ||
![]() |
befa8e4a7f | ||
![]() |
fc71bcc98e | ||
![]() |
aa3ea2b57a | ||
![]() |
32651aba67 | ||
![]() |
337b42bcb1 | ||
![]() |
efb04293bb | ||
![]() |
56a43dc01d | ||
![]() |
6920f0fa7e | ||
![]() |
1f24a8cb5a | ||
![]() |
54d0a46378 | ||
![]() |
615e60f25c | ||
![]() |
10ce7bf3c4 | ||
![]() |
ec1c392f1e | ||
![]() |
4f85b6aa91 | ||
![]() |
ee3b132f05 | ||
![]() |
cd95a6e9c9 | ||
![]() |
e716c201c6 | ||
![]() |
de166a8ed4 | ||
![]() |
c3a6da19d7 | ||
![]() |
73a42ea2ee | ||
![]() |
cfdad45092 | ||
![]() |
dd4cb5f44a | ||
![]() |
a54d043923 | ||
![]() |
ec91e18899 | ||
![]() |
25b65925f7 | ||
![]() |
5f88d56d96 | ||
![]() |
3331f3972a | ||
![]() |
6942a920c8 | ||
![]() |
68bcd91d57 | ||
![]() |
8b4933cc48 | ||
![]() |
bda1de8a67 | ||
![]() |
f0d738d8bf | ||
![]() |
070f0e723d | ||
![]() |
8ebc3b51f7 | ||
![]() |
3b075c9c44 | ||
![]() |
1001277d43 | ||
![]() |
ce39c3a2fb | ||
![]() |
1b84760c19 | ||
![]() |
16795f18a7 | ||
![]() |
f0b9d70720 | ||
![]() |
aa0632727f | ||
![]() |
d47fd4ffe1 | ||
![]() |
4b9c60ad21 | ||
![]() |
c5607d8633 | ||
![]() |
722acf5986 | ||
![]() |
09d30fef5b | ||
![]() |
b9f3fccfac | ||
![]() |
76181385d2 | ||
![]() |
3c032dd5b9 | ||
![]() |
6dd6fcf88f | ||
![]() |
31e82fc29a | ||
![]() |
7afa593d11 | ||
![]() |
58c596cacf | ||
![]() |
b5fd6183d2 | ||
![]() |
c83c831c53 | ||
![]() |
9fcae7d9b2 | ||
![]() |
bcc92d546f | ||
![]() |
1b175ea759 | ||
![]() |
91de35ecdf | ||
![]() |
6cd15275bb | ||
![]() |
76b1c74a37 | ||
![]() |
385969e9f5 | ||
![]() |
121af778a0 | ||
![]() |
6b876da44a | ||
![]() |
f8ac3fe343 | ||
![]() |
679318541a | ||
![]() |
52d8a54fc7 | ||
![]() |
02e0a86b12 | ||
![]() |
600f16d625 | ||
![]() |
a5407131d4 | ||
![]() |
b61f270eae | ||
![]() |
55c990e0d9 | ||
![]() |
9ef6c4716c | ||
![]() |
f119f8c2cc | ||
![]() |
984d582796 | ||
![]() |
fe852920c3 | ||
![]() |
0ea88c07b4 | ||
![]() |
8e1d94c6c7 | ||
![]() |
b9ed3b2427 | ||
![]() |
6dd2e9fc0b | ||
![]() |
fab7d5e484 | ||
![]() |
5d03efa1bb | ||
![]() |
de1fe7cc5a | ||
![]() |
eafae79869 | ||
![]() |
427648c4b8 | ||
![]() |
f1b1e2a7cc | ||
![]() |
a6edd50a5d | ||
![]() |
4096dabe1e | ||
![]() |
0e512d4ff6 | ||
![]() |
77012f2f29 | ||
![]() |
1c5d0cf536 | ||
![]() |
634764e1a6 | ||
![]() |
b95a0457a9 | ||
![]() |
b269c43168 | ||
![]() |
2acbec6891 | ||
![]() |
961cb6c5ee | ||
![]() |
00b213373b | ||
![]() |
b8b4dc5038 | ||
![]() |
9368eb3038 | ||
![]() |
7c22a64b8c | ||
![]() |
bf403aa656 | ||
![]() |
faeab96e01 | ||
![]() |
b50eb511b0 | ||
![]() |
ac12ab8629 | ||
![]() |
ef205fb60e | ||
![]() |
3254f7c5cd | ||
![]() |
7e21497edc | ||
![]() |
1e78ef1cb8 | ||
![]() |
8a9de081f1 | ||
![]() |
4d2eddec2e | ||
![]() |
a9012d3d0c | ||
![]() |
2c84d06a66 | ||
![]() |
e88f08ad7d | ||
![]() |
1d6ccd9781 | ||
![]() |
811ffbf3a4 | ||
![]() |
bf33382082 | ||
![]() |
1df90cef4c | ||
![]() |
b683d79f8b | ||
![]() |
77ae69355c | ||
![]() |
f37d684fab | ||
![]() |
a88579ca98 | ||
![]() |
d0ee0203e1 | ||
![]() |
379ce0145b | ||
![]() |
34458d767b | ||
![]() |
96fcb9f54c | ||
![]() |
d4e2be68ee | ||
![]() |
1a82a41f92 | ||
![]() |
9bddb81efc | ||
![]() |
220e112c83 | ||
![]() |
c51347d78b | ||
![]() |
dc3629e732 | ||
![]() |
c73d739bd6 | ||
![]() |
1616cb533e | ||
![]() |
92367cf700 | ||
![]() |
ff3a38a7f5 | ||
![]() |
9849aab402 | ||
![]() |
61fae45390 | ||
![]() |
e0cf5b2402 | ||
![]() |
8592716139 | ||
![]() |
00157864e9 | ||
![]() |
8f833d742f | ||
![]() |
d55e638a23 | ||
![]() |
a697a7f97b | ||
![]() |
ab69e113f4 | ||
![]() |
65d19279a2 | ||
![]() |
dbf9e1194b | ||
![]() |
d4a8c63264 | ||
![]() |
43cccaaee9 | ||
![]() |
27ac3d795e | ||
![]() |
fce66b85b6 | ||
![]() |
2b8056a852 | ||
![]() |
ecf7945fe8 | ||
![]() |
cc1ee0106f | ||
![]() |
6078081c33 | ||
![]() |
a59aa20be8 | ||
![]() |
61eec93f4e | ||
![]() |
27d1b7e615 | ||
![]() |
316d192bc0 | ||
![]() |
2eaa3e256f | ||
![]() |
46164f879b | ||
![]() |
374c8791d7 | ||
![]() |
e8f523f00a | ||
![]() |
030082f756 | ||
![]() |
dc55adbaf7 | ||
![]() |
90ba1ca1f9 | ||
![]() |
514a65e453 | ||
![]() |
a3468fd05b | ||
![]() |
97be1a53ad | ||
![]() |
1e007b63aa | ||
![]() |
a0c596b030 | ||
![]() |
eaa85f5aa3 | ||
![]() |
dfeaa1145b | ||
![]() |
0082747237 | ||
![]() |
5b8f8e7087 | ||
![]() |
be11fd7508 | ||
![]() |
ac4a001e9f | ||
![]() |
24d4124ffc | ||
![]() |
eaadd643eb | ||
![]() |
cf670e8a3d | ||
![]() |
e57ce4fa0f | ||
![]() |
44cafbb9f2 | ||
![]() |
f75e46752e | ||
![]() |
244adef70e | ||
![]() |
e2eb7e8ca9 | ||
![]() |
80f3cb96b0 | ||
![]() |
89b27d8587 | ||
![]() |
1bb1a32986 | ||
![]() |
de9e391e34 | ||
![]() |
934f9f80bd | ||
![]() |
4704dfe061 | ||
![]() |
d3b969306c | ||
![]() |
4579be0f54 | ||
![]() |
d7982e471c | ||
![]() |
a7a8dc4dbb | ||
![]() |
cf2256cf41 | ||
![]() |
28e0e20879 | ||
![]() |
e50107792c | ||
![]() |
579b88adc7 | ||
![]() |
140df4b5e0 | ||
![]() |
6af9492ea5 | ||
![]() |
d013e4516d | ||
![]() |
805a11aadb | ||
![]() |
1b81ca4563 | ||
![]() |
1df8ea824e | ||
![]() |
3ffbf6296f | ||
![]() |
e0b47999fa | ||
![]() |
83a9aa4533 | ||
![]() |
611e303bab | ||
![]() |
8489d39372 | ||
![]() |
4ee4456e87 | ||
![]() |
aafa669cf5 | ||
![]() |
ed432d06d7 | ||
![]() |
c69de6b48c | ||
![]() |
4a3c01d198 | ||
![]() |
20c0bd9ddb | ||
![]() |
6a637db36b | ||
![]() |
126383dca2 | ||
![]() |
3340631d43 | ||
![]() |
37f2952af9 | ||
![]() |
7bde630820 | ||
![]() |
3fba7686f8 | ||
![]() |
1d4e6393f3 | ||
![]() |
367bf0c8fc | ||
![]() |
5836bd85df | ||
![]() |
ed74f7b4a8 | ||
![]() |
f6df94070b | ||
![]() |
4d0db37d2e | ||
![]() |
acf84a2516 | ||
![]() |
ba62b7378b | ||
![]() |
def7b8c55e | ||
![]() |
9b0fc31751 | ||
![]() |
12ae9a2b23 | ||
![]() |
6046ba1841 | ||
![]() |
f6af6d9679 | ||
![]() |
b298897bde | ||
![]() |
6e6bb5606b | ||
![]() |
f5d57c02c7 | ||
![]() |
0fd06e3f0d | ||
![]() |
313515c681 | ||
![]() |
455543b36e | ||
![]() |
73a5b6cec9 | ||
![]() |
c639f30d39 | ||
![]() |
fc77ad9355 | ||
![]() |
2b21c19362 | ||
![]() |
eef7fcdd45 | ||
![]() |
053e7626e4 | ||
![]() |
c530a46e54 | ||
![]() |
9c057e6854 | ||
![]() |
d2a5bb39e3 | ||
![]() |
9f66f22953 | ||
![]() |
ef630df443 | ||
![]() |
8c5e564066 | ||
![]() |
2017f9114f | ||
![]() |
2ff90a80d4 | ||
![]() |
e2ff5f58b2 | ||
![]() |
c7d7da8fc5 | ||
![]() |
8e8ee2ac73 | ||
![]() |
fe1172fbb6 | ||
![]() |
20eb4bc296 | ||
![]() |
78e61c65be | ||
![]() |
7ce6a9bbaf | ||
![]() |
cb5d8bdcdd | ||
![]() |
0a31e132c7 | ||
![]() |
f53e22d72c | ||
![]() |
6abb8c4994 | ||
![]() |
85339ca751 | ||
![]() |
553ba84792 | ||
![]() |
f9aed8f2bf | ||
![]() |
cd7f7271ca | ||
![]() |
ea9aa6fdb4 | ||
![]() |
e423b8ce4b | ||
![]() |
977e2d2c09 | ||
![]() |
6f489b58a1 | ||
![]() |
e9e877f64e | ||
![]() |
ca0d148a78 | ||
![]() |
c687b4eaa5 | ||
![]() |
b4faa7c4ec | ||
![]() |
bba3097765 | ||
![]() |
8c5d9a6295 | ||
![]() |
7cf0c18f83 | ||
![]() |
48a7679b8a | ||
![]() |
5c7c44c9eb | ||
![]() |
f5100cc81f | ||
![]() |
eb1ef1484a | ||
![]() |
7586ef7ba8 | ||
![]() |
b322f55c87 | ||
![]() |
960c4df48e | ||
![]() |
959cc8ff37 | ||
![]() |
2f8fb105a5 | ||
![]() |
efa42a1624 | ||
![]() |
c4fc582469 | ||
![]() |
b4b47d85cf | ||
![]() |
61978cb4ca | ||
![]() |
efafa02f68 | ||
![]() |
0f2e651331 | ||
![]() |
d4ca973e34 | ||
![]() |
b96d9c6973 | ||
![]() |
50da7d2a27 | ||
![]() |
2a851437ff | ||
![]() |
b35ae97ba7 | ||
![]() |
f3500ffda9 | ||
![]() |
f90be427f5 | ||
![]() |
8f415d69cd | ||
![]() |
a1bc8fa77b | ||
![]() |
539718f6a8 | ||
![]() |
3db26f2b94 | ||
![]() |
6bd78770de | ||
![]() |
c9c6424205 | ||
![]() |
40bb6069ec | ||
![]() |
831c74a25b | ||
![]() |
f4838e50b4 | ||
![]() |
7795045b23 | ||
![]() |
ca2df14a8f | ||
![]() |
d7bb6c88d3 | ||
![]() |
115d91812e | ||
![]() |
5f6863b77e | ||
![]() |
0226a670dd | ||
![]() |
067cdf3ce4 | ||
![]() |
a38646bd0f | ||
![]() |
b65203c9f8 | ||
![]() |
dcfab918e9 | ||
![]() |
282cfae1b2 | ||
![]() |
7e63ab0f56 | ||
![]() |
4b1ca9ef61 | ||
![]() |
71d0538647 | ||
![]() |
8604bd9807 | ||
![]() |
75fa43bc59 | ||
![]() |
88d47ab024 | ||
![]() |
29f6ba6310 | ||
![]() |
5c1d86b796 | ||
![]() |
6d9c234cb6 | ||
![]() |
b280faa8e7 | ||
![]() |
e23e2f4ae9 | ||
![]() |
6b676a928d | ||
![]() |
e4eaf1220e | ||
![]() |
dbc4fd3e93 | ||
![]() |
db29680e74 | ||
![]() |
45d1af23bb | ||
![]() |
1b064d7e30 | ||
![]() |
27f823e882 | ||
![]() |
f4a5740412 | ||
![]() |
c680e35aa0 | ||
![]() |
412e9f284d | ||
![]() |
7ead98cbe5 | ||
![]() |
62922352b3 | ||
![]() |
00c1e4eb55 | ||
![]() |
4457b02db2 | ||
![]() |
08d618bb8b | ||
![]() |
45672a70f9 | ||
![]() |
83a5bc0ecd | ||
![]() |
13f5fafdbc | ||
![]() |
96ab1af03b | ||
![]() |
9542cb8d62 | ||
![]() |
983480131b | ||
![]() |
38837bd388 | ||
![]() |
efda2e9baa | ||
![]() |
78ff90f2cc | ||
![]() |
3afdafed61 | ||
![]() |
2744cbd310 | ||
![]() |
b83cbc6d4d | ||
![]() |
21e3a91393 | ||
![]() |
ecc5decaa5 | ||
![]() |
32690f576f | ||
![]() |
114d3319e8 | ||
![]() |
f704891932 | ||
![]() |
7e706ea669 | ||
![]() |
fe5efd926e | ||
![]() |
ba9d47fb69 | ||
![]() |
eb60460d28 | ||
![]() |
d1bf432e14 | ||
![]() |
4c6fc15858 | ||
![]() |
6158ef138e | ||
![]() |
5904d98208 | ||
![]() |
ca6399437c | ||
![]() |
5befd66e21 | ||
![]() |
16440d6be2 | ||
![]() |
2f31606eff | ||
![]() |
14a3af679d | ||
![]() |
033d71ee28 | ||
![]() |
b55b77c8ae | ||
![]() |
59f80c08ea | ||
![]() |
a74406677c | ||
![]() |
593358ed3f | ||
![]() |
bc30dc6bff | ||
![]() |
01f55a9d59 | ||
![]() |
26d4c5fd94 | ||
![]() |
b9bcceddfc | ||
![]() |
7565f7bec6 | ||
![]() |
6365805687 | ||
![]() |
1205d30657 | ||
![]() |
16f16e6b08 | ||
![]() |
39d6af135f | ||
![]() |
ec18991328 | ||
![]() |
9d0fc96d1a | ||
![]() |
98934b6738 | ||
![]() |
920c3be750 | ||
![]() |
797bb493ab | ||
![]() |
5f43c2faa2 | ||
![]() |
29350c9f33 | ||
![]() |
664aeb3ced | ||
![]() |
b7d9d16201 | ||
![]() |
0d47877db1 | ||
![]() |
f906ad6ca7 | ||
![]() |
0fb7b98f96 | ||
![]() |
0a0af6887a | ||
![]() |
dd48366ed8 | ||
![]() |
2c6f25b710 | ||
![]() |
792168fdfa | ||
![]() |
41747b6ee2 | ||
![]() |
e3dd3f6b63 | ||
![]() |
c0156b740b | ||
![]() |
d834232232 | ||
![]() |
600d91beda | ||
![]() |
a861f913a7 | ||
![]() |
b8d8b359bc | ||
![]() |
a85fccaeea | ||
![]() |
30fe072606 | ||
![]() |
64953fadc9 | ||
![]() |
080a3c20bd | ||
![]() |
d20542c495 | ||
![]() |
bf5952fd63 | ||
![]() |
4d6fab06de | ||
![]() |
2bd9f05a92 | ||
![]() |
26c8b53f70 | ||
![]() |
b36e6b1a77 | ||
![]() |
e10ce7204c | ||
![]() |
fb0eb5a31f | ||
![]() |
ae27085f69 | ||
![]() |
750d262604 | ||
![]() |
bbbb16795d | ||
![]() |
f18a31c628 | ||
![]() |
39c4e3a4f5 | ||
![]() |
ddd7b26f1c | ||
![]() |
9be3890827 | ||
![]() |
034f47205e | ||
![]() |
1b1046bcdb | ||
![]() |
0b636d1bf9 | ||
![]() |
96c7c85ad0 | ||
![]() |
b0030d148d | ||
![]() |
b3aa793f42 | ||
![]() |
d4a5e31c8d | ||
![]() |
01de1519dd | ||
![]() |
875069c6b0 | ||
![]() |
0b5d3315bc | ||
![]() |
b6ae12b622 | ||
![]() |
d961ed830f | ||
![]() |
acba96c1d3 | ||
![]() |
fa243276c5 | ||
![]() |
9a70ce8f5e | ||
![]() |
8c1a582348 | ||
![]() |
7a35f13381 | ||
![]() |
37959bab1d | ||
![]() |
5e317eac8c | ||
![]() |
a49e8a1a3c | ||
![]() |
40c201407d | ||
![]() |
f41c78a6e3 | ||
![]() |
5779f439ad | ||
![]() |
062ba50037 | ||
![]() |
7fdf5ffea2 | ||
![]() |
e3a5a998d4 | ||
![]() |
0ab4b8a294 | ||
![]() |
860e8bb5d8 | ||
![]() |
bb83ee844e | ||
![]() |
b7a12fbc2b | ||
![]() |
f5459a25df | ||
![]() |
efc67f7ab5 | ||
![]() |
29d5135302 | ||
![]() |
f8ac072bc3 | ||
![]() |
7cfe7da73d | ||
![]() |
f55e1ee138 | ||
![]() |
cfa573a3a1 | ||
![]() |
40bbae3d6c | ||
![]() |
147e8f1e3e | ||
![]() |
0c10d2aa64 | ||
![]() |
536105a1b7 | ||
![]() |
b8800b8b95 | ||
![]() |
19e3753202 | ||
![]() |
b82821074b | ||
![]() |
c1514ce91d | ||
![]() |
311c2172d7 | ||
![]() |
309a943528 | ||
![]() |
50817df59c | ||
![]() |
32c5c43b6d | ||
![]() |
e12369ac13 | ||
![]() |
4f80b6fa5d | ||
![]() |
63c4396987 | ||
![]() |
b95e25004f | ||
![]() |
a1e12c0ec3 | ||
![]() |
9b5aeb76d8 | ||
![]() |
6afd2dc632 | ||
![]() |
3dc095d1c9 | ||
![]() |
4bdaf26133 | ||
![]() |
25383de9e6 | ||
![]() |
674fd0bdd0 | ||
![]() |
0736eea3fd | ||
![]() |
207e4f3b92 | ||
![]() |
7a8cf274ca | ||
![]() |
639f14f713 | ||
![]() |
7fc1d77893 | ||
![]() |
b5b31bfd5b | ||
![]() |
37d83df075 | ||
![]() |
c23c97d303 | ||
![]() |
614c9a0fc6 | ||
![]() |
c0cb76f0ec | ||
![]() |
d40612ac52 | ||
![]() |
0f7918c51b | ||
![]() |
90b633b5a6 | ||
![]() |
5299d17060 | ||
![]() |
82c34f7f45 | ||
![]() |
52bf808d89 | ||
![]() |
155896a851 | ||
![]() |
313ce82192 | ||
![]() |
56d7f58626 | ||
![]() |
e89d760240 | ||
![]() |
c81b61eb2e | ||
![]() |
500ea793b3 | ||
![]() |
93e711d8a9 | ||
![]() |
653ca7e708 | ||
![]() |
d6cb68b091 | ||
![]() |
6829ecb509 | ||
![]() |
4bf3974abd | ||
![]() |
74245df382 | ||
![]() |
edb39a089d | ||
![]() |
16eccad492 | ||
![]() |
2f54a53062 | ||
![]() |
0df069494e | ||
![]() |
ddfc3b8a6a | ||
![]() |
c5ac2ae163 | ||
![]() |
03351cec0c | ||
![]() |
dabf1867fd | ||
![]() |
bafef1f8b4 | ||
![]() |
2c4ba4723f | ||
![]() |
66714d94fc | ||
![]() |
580cec33a9 | ||
![]() |
6c67b2e40e | ||
![]() |
430290c084 | ||
![]() |
c38f5ee528 | ||
![]() |
9e1145df81 | ||
![]() |
e5876440cb | ||
![]() |
d8bdbd53ed | ||
![]() |
3499814498 | ||
![]() |
85809a240e | ||
![]() |
07dc99d197 | ||
![]() |
30b48df9d9 | ||
![]() |
b0a38c0cae | ||
![]() |
ada2c69c7d | ||
![]() |
6915fde1cf | ||
![]() |
0641454c23 | ||
![]() |
5079a4b7dd | ||
![]() |
d5860d0685 | ||
![]() |
2db5b61616 | ||
![]() |
8aea3603a6 | ||
![]() |
eb078d67ab | ||
![]() |
eef46ed3c9 | ||
![]() |
e90dea4be9 | ||
![]() |
6a41afaaee | ||
![]() |
a6a91fec3a | ||
![]() |
9ac2c36d76 | ||
![]() |
e21cecefa1 | ||
![]() |
4535f9b41b | ||
![]() |
b62d9f3920 | ||
![]() |
fe7036a1a8 | ||
![]() |
cdac3988b5 | ||
![]() |
9753cce4aa | ||
![]() |
30f4023c36 | ||
![]() |
15727088be | ||
![]() |
b7270c6238 | ||
![]() |
bb330533c1 | ||
![]() |
5342692b1e | ||
![]() |
ef8eaf8e89 | ||
![]() |
4553d6426b | ||
![]() |
b33cfc2876 | ||
![]() |
4de14fb5cf | ||
![]() |
60156a40b2 | ||
![]() |
5719a929ad | ||
![]() |
2b6bf074c6 | ||
![]() |
37d87854c2 | ||
![]() |
d27b3525cd | ||
![]() |
7beb4ed131 | ||
![]() |
177c35e321 | ||
![]() |
ca9be872a8 | ||
![]() |
a97d4fa4ef | ||
![]() |
908e0f3b8b | ||
![]() |
b68446b289 | ||
![]() |
608e7c1546 | ||
![]() |
a3ba315dc6 | ||
![]() |
df5f14ca7a | ||
![]() |
d060bb44e1 | ||
![]() |
645f5e8633 | ||
![]() |
547be1973d | ||
![]() |
65557d5f27 | ||
![]() |
cc420c245f | ||
![]() |
443d1b2f5c | ||
![]() |
1f8d275094 | ||
![]() |
2efcb27043 | ||
![]() |
298bc34eaf | ||
![]() |
62f6f6af02 | ||
![]() |
e8ba0b3f54 | ||
![]() |
f48f7149f8 | ||
![]() |
d2ccce6366 | ||
![]() |
af2d81a990 | ||
![]() |
58ac8bc8e9 | ||
![]() |
2ee5507d06 | ||
![]() |
31a39776f5 | ||
![]() |
5e307e472d | ||
![]() |
e0ad066382 | ||
![]() |
99fe03bd4d | ||
![]() |
850d38414e | ||
![]() |
d380ed36de | ||
![]() |
5c8888d6a8 | ||
![]() |
4af3640bd3 | ||
![]() |
94e282b612 | ||
![]() |
259992c65f | ||
![]() |
67f6157d42 | ||
![]() |
0cfeb42786 | ||
![]() |
a431dde537 | ||
![]() |
4f95b8d9d2 | ||
![]() |
9eb0468cd2 | ||
![]() |
1a01a85182 | ||
![]() |
3ff229af6f | ||
![]() |
3784b39a5f | ||
![]() |
676ee87963 | ||
![]() |
b52fe6cc86 | ||
![]() |
f4657eb16f | ||
![]() |
90e0a6e2c3 | ||
![]() |
0580ba1fb5 | ||
![]() |
fb309f3d4f | ||
![]() |
4c87e98e12 | ||
![]() |
b3cc17ea0d | ||
![]() |
6039f27bd5 | ||
![]() |
4de77784c9 | ||
![]() |
a17251d913 | ||
![]() |
576484835e | ||
![]() |
fcd7ffe956 | ||
![]() |
7d57487026 | ||
![]() |
c48d9cca0f | ||
![]() |
3cb543f75d | ||
![]() |
c115b8e322 | ||
![]() |
f6b7754fb1 | ||
![]() |
3bf3ba450c | ||
![]() |
094c6e32ff | ||
![]() |
cb74b61755 | ||
![]() |
1de29e5566 | ||
![]() |
b9a81edae5 | ||
![]() |
f86d0186d2 | ||
![]() |
151e3bc940 | ||
![]() |
44b8ac135f | ||
![]() |
272590ef94 | ||
![]() |
79eac66d39 | ||
![]() |
e2985cf122 | ||
![]() |
bc7b2f1876 | ||
![]() |
91522381b6 | ||
![]() |
952386ba8f | ||
![]() |
7881f06be0 | ||
![]() |
a637b4e282 | ||
![]() |
678dba9245 | ||
![]() |
b17eb8e537 | ||
![]() |
8be977b32b | ||
![]() |
3ad2732375 | ||
![]() |
d85085d16f | ||
![]() |
43401210c3 | ||
![]() |
c1019a006b | ||
![]() |
67a41c09ae | ||
![]() |
fc7cd636a3 | ||
![]() |
1e237a7df5 | ||
![]() |
1dcf25c24f | ||
![]() |
9a40b366a3 | ||
![]() |
945d6a2b09 | ||
![]() |
0283142d0e | ||
![]() |
bcb4560f0d | ||
![]() |
8db800ed98 | ||
![]() |
acab9ccb81 | ||
![]() |
bc5aebe956 | ||
![]() |
c971edd2dd | ||
![]() |
8b0fdfcd69 | ||
![]() |
3d83c1aaba | ||
![]() |
d92aaf81c4 | ||
![]() |
0ea8e0c25c | ||
![]() |
ec4e57bb67 | ||
![]() |
12142a221a | ||
![]() |
79a9defa0c | ||
![]() |
fc4c868269 | ||
![]() |
27dc0d3530 | ||
![]() |
57017f2747 | ||
![]() |
bc8a741e14 | ||
![]() |
4846ab077b | ||
![]() |
920888ed2a | ||
![]() |
c26c01c7a0 | ||
![]() |
d792f4f348 | ||
![]() |
79370aaee2 | ||
![]() |
18a5e377f4 | ||
![]() |
19fe32bd7e | ||
![]() |
d246f6c360 | ||
![]() |
5503ad9d1a | ||
![]() |
7b0f5b50fc | ||
![]() |
6177fcb2f5 | ||
![]() |
c33f56e3ed | ||
![]() |
b13410df02 | ||
![]() |
87ffc672dd | ||
![]() |
5672ead957 | ||
![]() |
0aefebf02a | ||
![]() |
271407312e | ||
![]() |
c2a9a7b69e | ||
![]() |
b920435068 | ||
![]() |
1aeede97f5 | ||
![]() |
a5ea7c976b | ||
![]() |
d2063df78d | ||
![]() |
be57ff4985 | ||
![]() |
cf54c2ba47 | ||
![]() |
762fa6a8d8 | ||
![]() |
36fd7d17cf | ||
![]() |
5c786cace8 | ||
![]() |
c1c363bf08 | ||
![]() |
4bd9f664d7 | ||
![]() |
3d9e42efca | ||
![]() |
138a248a6c | ||
![]() |
6bae440f39 | ||
![]() |
f5b864df7b | ||
![]() |
7e52ea4818 | ||
![]() |
358dc6289b | ||
![]() |
1063d39de8 | ||
![]() |
14aedc17ae | ||
![]() |
0d7f9308cc | ||
![]() |
34088ecd27 | ||
![]() |
0f9e3bccef | ||
![]() |
64de87438e | ||
![]() |
5dcd8c827b | ||
![]() |
35ec41fc1e | ||
![]() |
618e2ba1d2 | ||
![]() |
04f9147db6 | ||
![]() |
0ed2a220f4 | ||
![]() |
e9c3fe1228 | ||
![]() |
0c2118e963 | ||
![]() |
145d28a8e4 | ||
![]() |
6a02dfdd3b | ||
![]() |
831131864f | ||
![]() |
1bd7693416 | ||
![]() |
5251cd3aad | ||
![]() |
0e536bdd86 | ||
![]() |
fd519f5def | ||
![]() |
0d830d720a | ||
![]() |
0d49e94982 | ||
![]() |
e6022c0d51 | ||
![]() |
5e71418d5c | ||
![]() |
c6a4caa8be | ||
![]() |
1d1780081e | ||
![]() |
622a09f8ed | ||
![]() |
00e195f50b | ||
![]() |
8bf6d31334 | ||
![]() |
2a9db983fc | ||
![]() |
4ea030d669 | ||
![]() |
f2dee7b25e | ||
![]() |
a0976772b3 | ||
![]() |
0815a5235d | ||
![]() |
9eae82de1d | ||
![]() |
746367004e | ||
![]() |
072f67d6e7 | ||
![]() |
b55a6a80e1 | ||
![]() |
24645e3d3d | ||
![]() |
d415fd29a3 | ||
![]() |
7768385be2 | ||
![]() |
2177792a3c | ||
![]() |
9e20065496 | ||
![]() |
2cd32b2248 | ||
![]() |
fa9c4a19b9 | ||
![]() |
ea41cc6ec0 | ||
![]() |
9716ea0324 | ||
![]() |
02978d0247 | ||
![]() |
6598d320d6 | ||
![]() |
f8d5a46dbf | ||
![]() |
da154c8209 | ||
![]() |
b46f431a2e | ||
![]() |
30c3f6a222 | ||
![]() |
30311aca18 | ||
![]() |
a9127e3ecd | ||
![]() |
58469c0a69 | ||
![]() |
9c5559a570 | ||
![]() |
3187c6b28d | ||
![]() |
09aba4cf16 | ||
![]() |
5498ec57d0 | ||
![]() |
4893cce43c | ||
![]() |
a40ededf6b | ||
![]() |
379079ee42 | ||
![]() |
1d5a0d0777 | ||
![]() |
2a33981811 | ||
![]() |
c0466d1585 | ||
![]() |
30594dde18 | ||
![]() |
7948018e6a | ||
![]() |
8fb8d7c10c | ||
![]() |
7ca0af9e7e | ||
![]() |
ac2bace764 | ||
![]() |
339acd2644 | ||
![]() |
d97924890d | ||
![]() |
6b4f57781a | ||
![]() |
c525394989 | ||
![]() |
8753f9ef06 | ||
![]() |
35fd0a7fc2 | ||
![]() |
53898c5006 | ||
![]() |
f8261a1957 | ||
![]() |
47558a6648 | ||
![]() |
2a5c9e6002 | ||
![]() |
9d5fc4ca17 | ||
![]() |
a598baaf01 | ||
![]() |
e0040f5da3 | ||
![]() |
cc659721fb | ||
![]() |
6439c7b64b | ||
![]() |
8904e0a12b | ||
![]() |
9410bc046b | ||
![]() |
ad346b6f36 | ||
![]() |
c96bc36fed | ||
![]() |
d87fecda7f | ||
![]() |
6855079811 | ||
![]() |
9022b05fea | ||
![]() |
75034d9240 | ||
![]() |
a9b42765f9 | ||
![]() |
eb23798c9f | ||
![]() |
4f247a0784 | ||
![]() |
95547da5a5 | ||
![]() |
b0799089cd | ||
![]() |
8ed7c7486c | ||
![]() |
fd040c50b1 | ||
![]() |
237fe242ad | ||
![]() |
0009aa332b | ||
![]() |
bf45c23098 | ||
![]() |
7167bb397e | ||
![]() |
0393d8f53c | ||
![]() |
cae40e68e4 | ||
![]() |
36701f8a7c | ||
![]() |
6fce36374d | ||
![]() |
316ffcea54 | ||
![]() |
0b5228f3cd | ||
![]() |
471c8ec050 | ||
![]() |
2f425aa03f | ||
![]() |
e852f4b60d | ||
![]() |
f43599552f | ||
![]() |
8caf2b0a4a | ||
![]() |
59b47b8623 | ||
![]() |
30cf5c3ab0 | ||
![]() |
1716c6562c | ||
![]() |
6e4894c165 | ||
![]() |
98734af9a7 | ||
![]() |
2c7d07bca6 | ||
![]() |
5b5a537f56 | ||
![]() |
b3c4f7eddc | ||
![]() |
6254954957 | ||
![]() |
9c04749359 | ||
![]() |
6b7a810b8e | ||
![]() |
5eb944ecde | ||
![]() |
3d4af18327 | ||
![]() |
179cb1d813 | ||
![]() |
6d4aa316ac | ||
![]() |
d68214bd46 | ||
![]() |
52b94dbc4a | ||
![]() |
433d46e57f | ||
![]() |
79ca93cefb | ||
![]() |
07d4632cd7 | ||
![]() |
f88ed4dd1a | ||
![]() |
f480287657 | ||
![]() |
ffa0470cf8 | ||
![]() |
c92508a575 | ||
![]() |
b2254a66d3 | ||
![]() |
757dee5664 | ||
![]() |
c307dd4fe8 | ||
![]() |
b3ab96b5ee | ||
![]() |
15b0d2aff2 | ||
![]() |
d14eb20122 | ||
![]() |
4175b7809b | ||
![]() |
10d4ae107b | ||
![]() |
21882b69ec | ||
![]() |
ea41df538e | ||
![]() |
eeedef59c4 | ||
![]() |
4e2d802967 | ||
![]() |
f6ff3b1f1a | ||
![]() |
38b82b8582 | ||
![]() |
6b39ba918f | ||
![]() |
13990279c3 | ||
![]() |
507d436699 | ||
![]() |
8a9f4ef441 | ||
![]() |
6672e9efdd | ||
![]() |
d995bf0326 | ||
![]() |
5150053275 | ||
![]() |
24261f6eb3 | ||
![]() |
67824cfc89 | ||
![]() |
776eea736a | ||
![]() |
c167f20643 | ||
![]() |
6df9c79bb7 | ||
![]() |
2ecc0299b4 | ||
![]() |
742da2f1e9 | ||
![]() |
8c218397bc | ||
![]() |
d7d9304a49 | ||
![]() |
fda5147d06 | ||
![]() |
17065418cf | ||
![]() |
b1a7dcb05b | ||
![]() |
390602837b | ||
![]() |
9f49b9f4d2 | ||
![]() |
3e256eee2c | ||
![]() |
1260e8b74b | ||
![]() |
617ff00a45 | ||
![]() |
b5c319b2c7 | ||
![]() |
272dc208b4 | ||
![]() |
c41924399b | ||
![]() |
eacc2040a1 | ||
![]() |
bd4d8694dd | ||
![]() |
5cc3d3c873 | ||
![]() |
417852779f | ||
![]() |
239507d7d6 | ||
![]() |
386fcedf35 | ||
![]() |
a2a6a94614 | ||
![]() |
76d1ed39a1 | ||
![]() |
d7766162d6 | ||
![]() |
f7eef546a6 | ||
![]() |
b9318d09ee | ||
![]() |
0c0b7d77b3 | ||
![]() |
8416329f40 | ||
![]() |
8ff87176f8 | ||
![]() |
a92795d90f | ||
![]() |
364efbe58b | ||
![]() |
aedc1d0ee9 | ||
![]() |
b33fe53047 | ||
![]() |
5cee481083 | ||
![]() |
2cfe64e9e6 | ||
![]() |
fbf1f74e12 | ||
![]() |
839b7483ac | ||
![]() |
eeed67ecac | ||
![]() |
37820ad572 | ||
![]() |
2b3a5f16d1 | ||
![]() |
17f894348f | ||
![]() |
71bb181472 | ||
![]() |
5472f4b934 | ||
![]() |
daea5a39ad | ||
![]() |
06ca63f9c2 | ||
![]() |
aad573a1d7 | ||
![]() |
7f85d7a1f9 | ||
![]() |
564a23c0b5 | ||
![]() |
b691126bff | ||
![]() |
ebdb443180 | ||
![]() |
2217d0c050 | ||
![]() |
4c135a5ca1 | ||
![]() |
025afe88b4 | ||
![]() |
b72f9186b5 | ||
![]() |
dd332b3515 | ||
![]() |
b7bdd45dba | ||
![]() |
319267e096 | ||
![]() |
fcf0f5f6b5 | ||
![]() |
6c1f839cbe | ||
![]() |
2c6fc0ba63 | ||
![]() |
d10048edac | ||
![]() |
ab5d2eca1f | ||
![]() |
c54d1cdde2 | ||
![]() |
712e5447b8 | ||
![]() |
b760db13bc | ||
![]() |
e38af60fd0 | ||
![]() |
ac4089f37d | ||
![]() |
f80ae7f686 | ||
![]() |
9059b837fa | ||
![]() |
b0039f0946 | ||
![]() |
e6d01e33e6 | ||
![]() |
bcf6b7f5ee | ||
![]() |
1d3ef7b42f | ||
![]() |
e926411812 | ||
![]() |
406b4bdbe7 | ||
![]() |
e42c91dee7 | ||
![]() |
00b11b1f75 | ||
![]() |
ad60e43ae4 | ||
![]() |
8866c530c4 | ||
![]() |
920e521176 | ||
![]() |
9c90ff7d06 | ||
![]() |
e90ad09551 | ||
![]() |
bb38e62ae6 | ||
![]() |
33034b0e02 | ||
![]() |
18109fcef7 | ||
![]() |
b2c4973cda | ||
![]() |
55c8ec80ed | ||
![]() |
5e1d872404 | ||
![]() |
af15f8d09d | ||
![]() |
34223f3da4 | ||
![]() |
e17d741f4b | ||
![]() |
b4a83a22a1 | ||
![]() |
5bf7813b2d | ||
![]() |
2eb86e0619 | ||
![]() |
c68d87538a | ||
![]() |
4de4a2e143 | ||
![]() |
5ccd61b1f8 | ||
![]() |
336416261a | ||
![]() |
92029ac325 | ||
![]() |
238e8ce939 | ||
![]() |
a631b976c9 | ||
![]() |
cf3d45e7c8 | ||
![]() |
8968bfd309 | ||
![]() |
c190b720d3 | ||
![]() |
b6b838416d | ||
![]() |
b37e8ffa69 | ||
![]() |
da0ecb650e | ||
![]() |
43c9ab2072 | ||
![]() |
a5f0b5ec74 | ||
![]() |
c927d6824c | ||
![]() |
5cd4c36cad | ||
![]() |
ca424df80e | ||
![]() |
e500fe2586 | ||
![]() |
b05d71fabf | ||
![]() |
22d6fa1fdf | ||
![]() |
4f6e098542 | ||
![]() |
47a10f6a6d | ||
![]() |
28cb0fc70b | ||
![]() |
98e1af28b8 | ||
![]() |
413f7bfb44 | ||
![]() |
37cff405ed | ||
![]() |
c41d03018c | ||
![]() |
ea1a2dc8db | ||
![]() |
d5deef5699 | ||
![]() |
4e882414b2 | ||
![]() |
3b3b908ccd | ||
![]() |
ec04c76ee5 | ||
![]() |
4e5b7768dc | ||
![]() |
d58ec4e65b | ||
![]() |
2d0253bc42 | ||
![]() |
51cf906b25 | ||
![]() |
2a451ebb57 | ||
![]() |
8f1da036f4 | ||
![]() |
6acaded898 | ||
![]() |
01d06e7121 | ||
![]() |
780b120c64 | ||
![]() |
d60f645d1d | ||
![]() |
c9503da8f8 | ||
![]() |
ccb951f11e | ||
![]() |
755ca97857 | ||
![]() |
5bdae9f6d0 | ||
![]() |
d32631d159 | ||
![]() |
2ee48ae04d | ||
![]() |
7a494b2aa7 | ||
![]() |
3e0231d995 | ||
![]() |
c8b85a98b8 | ||
![]() |
95095ee8d1 | ||
![]() |
ccdb8ce7fc | ||
![]() |
da3064343b | ||
![]() |
252efe8252 | ||
![]() |
9c84055f50 | ||
![]() |
536f08c401 | ||
![]() |
f7bdf5a2c0 | ||
![]() |
06ed64f26f | ||
![]() |
97c10ed1e5 | ||
![]() |
30b443de55 | ||
![]() |
521db37ca7 | ||
![]() |
bf2d2ff0ca | ||
![]() |
cba66c921e | ||
![]() |
44a378c46e | ||
![]() |
ed6f866a4f | ||
![]() |
4a2a44831b | ||
![]() |
864827f788 | ||
![]() |
ded328fb43 | ||
![]() |
b15f293b82 | ||
![]() |
c284d41b5b | ||
![]() |
a4f8863786 | ||
![]() |
c6ed06d783 | ||
![]() |
18bdec9641 | ||
![]() |
4b13179ff9 | ||
![]() |
481bca4cf2 | ||
![]() |
b3d1cc9525 | ||
![]() |
b5be0e5780 | ||
![]() |
77ac51a680 | ||
![]() |
8bd9077f77 | ||
![]() |
2ec3227012 | ||
![]() |
cd2131c4b5 | ||
![]() |
ed0cc443ea | ||
![]() |
e0de86359c | ||
![]() |
02b0adf31f | ||
![]() |
cbebe85ccf | ||
![]() |
b65fd34981 | ||
![]() |
2f7d10bf23 | ||
![]() |
2b6f789a5b | ||
![]() |
30dc6e691d | ||
![]() |
af668b15c4 | ||
![]() |
0a73973a7c | ||
![]() |
83ea0395f6 | ||
![]() |
9784d10c62 | ||
![]() |
f007890e84 | ||
![]() |
76ccae8a2f | ||
![]() |
04709cf256 | ||
![]() |
850b834758 | ||
![]() |
08b3662bb8 | ||
![]() |
4a7ccf6deb | ||
![]() |
4b3f9bd9a6 | ||
![]() |
5f5712a3ee | ||
![]() |
1518c5ddb0 | ||
![]() |
4f9922d46c | ||
![]() |
a9a743dab9 | ||
![]() |
4d1a2bad17 | ||
![]() |
cbab3affc9 | ||
![]() |
f89a827aa9 | ||
![]() |
43cb2d478c | ||
![]() |
b517d76084 | ||
![]() |
5ab7e03804 | ||
![]() |
89389ad744 | ||
![]() |
1eb769dbe8 | ||
![]() |
9d78a1a8b3 | ||
![]() |
838c70192e | ||
![]() |
38d6580a36 | ||
![]() |
ca81f0ddbb | ||
![]() |
be6778ac61 | ||
![]() |
7d24b29eb8 | ||
![]() |
44c0b5fd6f | ||
![]() |
0aa3201480 | ||
![]() |
96f1728573 | ||
![]() |
6cc0685f2a | ||
![]() |
04075ee0be | ||
![]() |
aa6d0d4359 | ||
![]() |
3939360e55 | ||
![]() |
d790d658ad | ||
![]() |
5cb24e8470 | ||
![]() |
d2906d4628 | ||
![]() |
dd533eb948 | ||
![]() |
dfe4992e35 | ||
![]() |
65c5626b65 | ||
![]() |
30bb24d18c | ||
![]() |
2d2eefe3d4 | ||
![]() |
a059dbe41b | ||
![]() |
1361bdfbf2 | ||
![]() |
31174d6b79 | ||
![]() |
c541ced3ab | ||
![]() |
e1cc95d308 | ||
![]() |
cec02966ad | ||
![]() |
0dd3cac8d9 | ||
![]() |
50430e310a | ||
![]() |
f635a48f64 | ||
![]() |
689b88b942 | ||
![]() |
253c0c42e2 | ||
![]() |
54870d067b | ||
![]() |
7701bf0642 | ||
![]() |
28e394eddc | ||
![]() |
e2cac3d949 | ||
![]() |
879f2d2b7e | ||
![]() |
b02f724475 | ||
![]() |
2834e54e78 | ||
![]() |
828749be64 | ||
![]() |
bfca457510 | ||
![]() |
0c2dd33593 | ||
![]() |
f72228f428 | ||
![]() |
bb76ee2c0e | ||
![]() |
2c836ba71f | ||
![]() |
8f49c5cd48 | ||
![]() |
66cecfaefd | ||
![]() |
2cce28533f | ||
![]() |
c2ddb649f8 | ||
![]() |
bdbb3266ae | ||
![]() |
56401ed91c | ||
![]() |
8372e547eb | ||
![]() |
94a20205eb | ||
![]() |
b7d3c5f4f0 | ||
![]() |
47851025a6 | ||
![]() |
fc0ea0ddac | ||
![]() |
3733cbf818 | ||
![]() |
1e737dbb94 | ||
![]() |
3642a2b625 | ||
![]() |
5e9f6a90df | ||
![]() |
ca1cda0db0 | ||
![]() |
e88a9702d0 | ||
![]() |
b92b704592 | ||
![]() |
39f7318048 | ||
![]() |
67414e0181 | ||
![]() |
ef8a65e6ff | ||
![]() |
a656447aa5 | ||
![]() |
a8e976d72f | ||
![]() |
e893494b48 | ||
![]() |
fe90888e95 | ||
![]() |
4226657aa2 | ||
![]() |
8366984b2b | ||
![]() |
8ddbe91462 | ||
![]() |
c31d2e2563 | ||
![]() |
470a1c30e8 | ||
![]() |
afd3b5d472 | ||
![]() |
57d72c0db5 | ||
![]() |
39a3f4ae98 | ||
![]() |
4631e6cd4a | ||
![]() |
ee191169f5 | ||
![]() |
24e629ca5c | ||
![]() |
025ae436b5 | ||
![]() |
1729307fcf | ||
![]() |
3e00b32fae | ||
![]() |
0efacdfcf0 | ||
![]() |
79346272f8 | ||
![]() |
82526ad4f3 | ||
![]() |
7f5ad5badb | ||
![]() |
5f888809e9 | ||
![]() |
f1903b26a5 | ||
![]() |
3739b87537 | ||
![]() |
d20f778bd0 | ||
![]() |
e333e7ced8 | ||
![]() |
ed699b4aed | ||
![]() |
d0d32e8846 | ||
![]() |
cd0b6c1729 | ||
![]() |
3b272b43ec | ||
![]() |
f62ad3ed3e | ||
![]() |
c7129d5190 | ||
![]() |
6a73f7c108 | ||
![]() |
c54baf873b | ||
![]() |
e88dbad3cf | ||
![]() |
5772de2a62 | ||
![]() |
821633f878 | ||
![]() |
9b073e5fe6 | ||
![]() |
77db652bff | ||
![]() |
e632a84431 | ||
![]() |
7ed2a5fc1b | ||
![]() |
5fb6847419 | ||
![]() |
e85b8217c0 | ||
![]() |
d6fe897923 | ||
![]() |
bf01c1ee64 | ||
![]() |
7d3721dded | ||
![]() |
735f22c1c5 | ||
![]() |
cf026e4c72 | ||
![]() |
e2f34e3db6 | ||
![]() |
7c692283ad | ||
![]() |
e6e5bf1da4 | ||
![]() |
a35fe29ef4 | ||
![]() |
56c5da97e6 | ||
![]() |
af779ebff9 | ||
![]() |
4eab3c07fd | ||
![]() |
359f3d5ef5 | ||
![]() |
d45b2dd3a7 | ||
![]() |
b4dd61a016 | ||
![]() |
4f180ad45c | ||
![]() |
52dbab56a4 | ||
![]() |
7015cc937b | ||
![]() |
50b16e36c7 | ||
![]() |
e512f8c56d | ||
![]() |
183e5cef8b | ||
![]() |
38c163d67c | ||
![]() |
20f70f1c39 | ||
![]() |
c239058624 | ||
![]() |
117db08880 | ||
![]() |
2de4d3329d | ||
![]() |
8f01757a7f | ||
![]() |
d9cfea8b10 | ||
![]() |
cb1449be09 | ||
![]() |
9ad48dae04 | ||
![]() |
59cc101752 | ||
![]() |
aefc941df3 | ||
![]() |
2da55f70a7 | ||
![]() |
0fc36d11d7 | ||
![]() |
7436e0da18 | ||
![]() |
a161a9c1e7 | ||
![]() |
1a8243f1ca | ||
![]() |
feedad7d8b | ||
![]() |
b627978d00 | ||
![]() |
2a61a0c026 | ||
![]() |
5887c5da6c | ||
![]() |
9ec667a87c | ||
![]() |
a91d2ba625 | ||
![]() |
e73e21851e | ||
![]() |
481db8aba4 | ||
![]() |
a8dc6d08b1 | ||
![]() |
12ab905440 | ||
![]() |
abe78a277a | ||
![]() |
aa31b6c65b | ||
![]() |
c37616de72 | ||
![]() |
e5ff8d8445 | ||
![]() |
8a2309ba7d | ||
![]() |
a8ee67cace | ||
![]() |
5e76675a0c | ||
![]() |
1d9b5ae1ba | ||
![]() |
dc0582739f | ||
![]() |
024546206d | ||
![]() |
4dd4a11cef | ||
![]() |
afb37f0b03 | ||
![]() |
0c730968a3 | ||
![]() |
7e15f71916 | ||
![]() |
b22066b9a2 | ||
![]() |
9caae8a10a | ||
![]() |
9d0648ed35 | ||
![]() |
9c79f0b45a | ||
![]() |
c59973d9c0 | ||
![]() |
4a832e87c0 | ||
![]() |
9dcccbc8e1 | ||
![]() |
e6c54de814 | ||
![]() |
5a39c1a8eb | ||
![]() |
c9ae5d0e51 | ||
![]() |
805a2c027e | ||
![]() |
fdeee5dd05 | ||
![]() |
796265fc50 | ||
![]() |
9221cbf42b | ||
![]() |
230b4318bd | ||
![]() |
5dc0463323 | ||
![]() |
8091e8b900 | ||
![]() |
1aeae6217e | ||
![]() |
5cd98804a2 | ||
![]() |
7e80b3d4d4 | ||
![]() |
18fb7a2080 | ||
![]() |
983b1e63df | ||
![]() |
ce09a35b03 | ||
![]() |
4eaa02d25f | ||
![]() |
4b295088fd | ||
![]() |
69795e74bf | ||
![]() |
72327716ca | ||
![]() |
fd8d253e1e | ||
![]() |
845713bdbf | ||
![]() |
3043b5256d | ||
![]() |
7e7138c0eb | ||
![]() |
f964ef163b | ||
![]() |
0e6cd577cc | ||
![]() |
7adc8fcaf5 | ||
![]() |
e57b536767 | ||
![]() |
f32915b515 | ||
![]() |
a8d45d4b0d | ||
![]() |
4e24aff408 | ||
![]() |
e64a81aa1d | ||
![]() |
7093662ce5 | ||
![]() |
32c741154d | ||
![]() |
407a965c1d | ||
![]() |
de6348e8a0 | ||
![]() |
9ad57324db | ||
![]() |
94690c835e | ||
![]() |
c5d2dba28d | ||
![]() |
272e0c874f | ||
![]() |
d429f810a9 | ||
![]() |
75b28d6782 | ||
![]() |
8b1362ab03 | ||
![]() |
a096f621cf | ||
![]() |
f54a9542bb | ||
![]() |
a52bbc7c8d | ||
![]() |
59768bdf3f | ||
![]() |
1e67e9c661 | ||
![]() |
ae517a99a7 | ||
![]() |
b23a9b1a88 | ||
![]() |
5bd68aa3e0 | ||
![]() |
647ce174b3 | ||
![]() |
02c8fd9de5 | ||
![]() |
1ba49b614d | ||
![]() |
40de14415c | ||
![]() |
7c9330a02f |
229
.config/cypress-devcontainer.yml
Normal file
229
.config/cypress-devcontainer.yml
Normal file
@@ -0,0 +1,229 @@
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# Misskey configuration
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
# ┌────────────────────────┐
|
||||
#───┘ Initial Setup Password └─────────────────────────────────────────────────────
|
||||
|
||||
# Password to initiate setting up admin account.
|
||||
# It will not be used after the initial setup is complete.
|
||||
#
|
||||
# Be sure to change this when you set up Misskey via the Internet.
|
||||
#
|
||||
# The provider of the service who sets up Misskey on behalf of the customer should
|
||||
# set this value to something unique when generating the Misskey config file,
|
||||
# and provide it to the customer.
|
||||
setupPassword: example_password_please_change_this_or_you_will_get_hacked
|
||||
|
||||
# ┌─────┐
|
||||
#───┘ URL └─────────────────────────────────────────────────────
|
||||
|
||||
# Final accessible URL seen by a user.
|
||||
url: 'http://misskey.local'
|
||||
|
||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||
# URL SETTINGS AFTER THAT!
|
||||
|
||||
# ┌───────────────────────┐
|
||||
#───┘ Port and TLS settings └───────────────────────────────────
|
||||
|
||||
#
|
||||
# Misskey requires a reverse proxy to support HTTPS connections.
|
||||
#
|
||||
# +----- https://example.tld/ ------------+
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# +---------------------------------------+
|
||||
#
|
||||
# You need to set up a reverse proxy. (e.g. nginx)
|
||||
# An encrypted connection with HTTPS is highly recommended
|
||||
# because tokens may be transferred in GET requests.
|
||||
|
||||
# The port that your Misskey server should listen on.
|
||||
port: 61812
|
||||
|
||||
# ┌──────────────────────────┐
|
||||
#───┘ PostgreSQL configuration └────────────────────────────────
|
||||
|
||||
db:
|
||||
host: db
|
||||
port: 5432
|
||||
|
||||
# Database name
|
||||
db: misskey
|
||||
|
||||
# Auth
|
||||
user: postgres
|
||||
pass: postgres
|
||||
|
||||
# Whether disable Caching queries
|
||||
#disableCache: true
|
||||
|
||||
# Extra Connection options
|
||||
#extra:
|
||||
# ssl: true
|
||||
|
||||
dbReplications: false
|
||||
|
||||
# You can configure any number of replicas here
|
||||
#dbSlaves:
|
||||
# -
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
# -
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Redis configuration └─────────────────────────────────────
|
||||
|
||||
redis:
|
||||
host: redis
|
||||
port: 6379
|
||||
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
#pass: example-pass
|
||||
#prefix: example-prefix
|
||||
#db: 1
|
||||
|
||||
#redisForPubsub:
|
||||
# host: redis
|
||||
# port: 6379
|
||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
# #pass: example-pass
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
|
||||
#redisForJobQueue:
|
||||
# host: redis
|
||||
# port: 6379
|
||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
# #pass: example-pass
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
|
||||
#redisForTimelines:
|
||||
# host: redis
|
||||
# port: 6379
|
||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
# #pass: example-pass
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
|
||||
#redisForReactions:
|
||||
# host: redis
|
||||
# port: 6379
|
||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
# #pass: example-pass
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
|
||||
# ┌───────────────────────────┐
|
||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
||||
|
||||
#meilisearch:
|
||||
# host: meilisearch
|
||||
# port: 7700
|
||||
# apiKey: ''
|
||||
# ssl: true
|
||||
# index: ''
|
||||
|
||||
# ┌───────────────┐
|
||||
#───┘ ID generation └───────────────────────────────────────────
|
||||
|
||||
# You can select the ID generation method.
|
||||
# You don't usually need to change this setting, but you can
|
||||
# change it according to your preferences.
|
||||
|
||||
# Available methods:
|
||||
# aid ... Short, Millisecond accuracy
|
||||
# aidx ... Millisecond accuracy
|
||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||
# ulid ... Millisecond accuracy
|
||||
# objectid ... This is left for backward compatibility
|
||||
|
||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||
# ID SETTINGS AFTER THAT!
|
||||
|
||||
id: 'aidx'
|
||||
|
||||
# ┌────────────────┐
|
||||
#───┘ Error tracking └──────────────────────────────────────────
|
||||
|
||||
# Sentry is available for error tracking.
|
||||
# See the Sentry documentation for more details on options.
|
||||
|
||||
#sentryForBackend:
|
||||
# enableNodeProfiling: true
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
#sentryForFrontend:
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
# Whether disable HSTS
|
||||
#disableHsts: true
|
||||
|
||||
# Number of worker processes
|
||||
#clusterLimit: 1
|
||||
|
||||
# Job concurrency per worker
|
||||
# deliverJobConcurrency: 128
|
||||
# inboxJobConcurrency: 16
|
||||
|
||||
# Job rate limiter
|
||||
# deliverJobPerSec: 128
|
||||
# inboxJobPerSec: 32
|
||||
|
||||
# Job attempts
|
||||
# deliverJobMaxAttempts: 12
|
||||
# inboxJobMaxAttempts: 8
|
||||
|
||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||
#outgoingAddressFamily: ipv4
|
||||
|
||||
# Proxy for HTTP/HTTPS
|
||||
#proxy: http://127.0.0.1:3128
|
||||
|
||||
proxyBypassHosts:
|
||||
- api.deepl.com
|
||||
- api-free.deepl.com
|
||||
- www.recaptcha.net
|
||||
- hcaptcha.com
|
||||
- challenges.cloudflare.com
|
||||
|
||||
# Proxy for SMTP/SMTPS
|
||||
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
||||
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
||||
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
||||
|
||||
# Media Proxy
|
||||
#mediaProxy: https://example.com/proxy
|
||||
|
||||
# Proxy remote files (default: true)
|
||||
proxyRemoteFiles: true
|
||||
|
||||
# Sign to ActivityPub GET request (default: true)
|
||||
signToActivityPubGet: true
|
||||
|
||||
allowedPrivateNetworks: [
|
||||
'127.0.0.1/32'
|
||||
]
|
||||
|
||||
# Disable automatic redirect for ActivityPub object lookup. (default: false)
|
||||
# This is a strong defense against potential impersonation attacks if the viewer instance has inadequate validation.
|
||||
# However it will make it impossible for other instances to lookup third-party user and notes through your URL.
|
||||
#disallowExternalApRedirect: true
|
||||
|
||||
# Upload or download file size limits (bytes)
|
||||
#maxFileSize: 262144000
|
@@ -1,4 +1,11 @@
|
||||
# misskey settings
|
||||
# MISSKEY_URL=https://example.tld/
|
||||
|
||||
# db settings
|
||||
POSTGRES_PASSWORD=example-misskey-pass
|
||||
# DATABASE_PASSWORD=${POSTGRES_PASSWORD}
|
||||
POSTGRES_USER=example-misskey-user
|
||||
# DATABASE_USER=${POSTGRES_USER}
|
||||
POSTGRES_DB=misskey
|
||||
# DATABASE_DB=${POSTGRES_DB}
|
||||
DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}"
|
||||
|
@@ -6,6 +6,7 @@
|
||||
#───┘ URL └─────────────────────────────────────────────────────
|
||||
|
||||
# Final accessible URL seen by a user.
|
||||
# You can set url from an environment variable instead.
|
||||
url: https://example.tld/
|
||||
|
||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||
@@ -38,9 +39,11 @@ db:
|
||||
port: 5432
|
||||
|
||||
# Database name
|
||||
# You can set db from an environment variable instead.
|
||||
db: misskey
|
||||
|
||||
# Auth
|
||||
# You can set user and pass from environment variables instead.
|
||||
user: example-misskey-user
|
||||
pass: example-misskey-pass
|
||||
|
||||
@@ -56,17 +59,17 @@ dbReplications: false
|
||||
# You can configure any number of replicas here
|
||||
#dbSlaves:
|
||||
# -
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
# -
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Redis configuration └─────────────────────────────────────
|
||||
@@ -103,8 +106,37 @@ redis:
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
|
||||
# ┌───────────────────────────┐
|
||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
||||
#redisForReactions:
|
||||
# host: redis
|
||||
# port: 6379
|
||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
# #pass: example-pass
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
|
||||
# ┌───────────────────────────────┐
|
||||
#───┘ Fulltext search configuration └─────────────────────────────
|
||||
|
||||
# These are the setting items for the full-text search provider.
|
||||
fulltextSearch:
|
||||
# You can select the ID generation method.
|
||||
# - sqlLike (default)
|
||||
# Use SQL-like search.
|
||||
# This is a standard feature of PostgreSQL, so no special extensions are required.
|
||||
# - sqlPgroonga
|
||||
# Use pgroonga.
|
||||
# You need to install pgroonga and configure it as a PostgreSQL extension.
|
||||
# In addition to the above, you need to create a pgroonga index on the text column of the note table.
|
||||
# see: https://pgroonga.github.io/tutorial/
|
||||
# - meilisearch
|
||||
# Use Meilisearch.
|
||||
# You need to install Meilisearch and configure.
|
||||
provider: sqlLike
|
||||
|
||||
# For Meilisearch settings.
|
||||
# If you select "meilisearch" for "fulltextSearch.provider", it must be set.
|
||||
# You can set scope to local (default value) or global
|
||||
# (include notes from remote).
|
||||
|
||||
#meilisearch:
|
||||
# host: meilisearch
|
||||
@@ -112,6 +144,7 @@ redis:
|
||||
# apiKey: ''
|
||||
# ssl: true
|
||||
# index: ''
|
||||
# scope: local
|
||||
|
||||
# ┌───────────────┐
|
||||
#───┘ ID generation └───────────────────────────────────────────
|
||||
@@ -132,6 +165,21 @@ redis:
|
||||
|
||||
id: 'aidx'
|
||||
|
||||
# ┌────────────────┐
|
||||
#───┘ Error tracking └──────────────────────────────────────────
|
||||
|
||||
# Sentry is available for error tracking.
|
||||
# See the Sentry documentation for more details on options.
|
||||
|
||||
#sentryForBackend:
|
||||
# enableNodeProfiling: true
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
#sentryForFrontend:
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
@@ -147,7 +195,7 @@ id: 'aidx'
|
||||
|
||||
# Job rate limiter
|
||||
# deliverJobPerSec: 128
|
||||
# inboxJobPerSec: 16
|
||||
# inboxJobPerSec: 32
|
||||
|
||||
# Job attempts
|
||||
# deliverJobMaxAttempts: 12
|
||||
@@ -180,9 +228,27 @@ proxyRemoteFiles: true
|
||||
# Sign to ActivityPub GET request (default: true)
|
||||
signToActivityPubGet: true
|
||||
|
||||
# For security reasons, uploading attachments from the intranet is prohibited,
|
||||
# but exceptions can be made from the following settings. Default value is "undefined".
|
||||
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
|
||||
#allowedPrivateNetworks: [
|
||||
# '127.0.0.1/32'
|
||||
#]
|
||||
|
||||
# Disable automatic redirect for ActivityPub object lookup. (default: false)
|
||||
# This is a strong defense against potential impersonation attacks if the viewer instance has inadequate validation.
|
||||
# However it will make it impossible for other instances to lookup third-party user and notes through your URL.
|
||||
#disallowExternalApRedirect: true
|
||||
|
||||
# Upload or download file size limits (bytes)
|
||||
#maxFileSize: 262144000
|
||||
|
||||
# Log settings
|
||||
# logging:
|
||||
# sql:
|
||||
# # Outputs query parameters during SQL execution to the log.
|
||||
# # default: false
|
||||
# enableQueryParamLogging: false
|
||||
# # Disable query truncation. If set to true, the full text of the query will be output to the log.
|
||||
# # default: false
|
||||
# disableQueryTruncation: false
|
||||
|
@@ -2,6 +2,77 @@
|
||||
# Misskey configuration
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
# ┌──────────────────────────────┐
|
||||
#───┘ a boring but important thing └────────────────────────────
|
||||
|
||||
#
|
||||
# First of all, let me tell you a story that may possibly be
|
||||
# boring to you and possibly important to you.
|
||||
#
|
||||
# Misskey is licensed under the AGPLv3 license. This license is
|
||||
# known to be often misunderstood. Please read the following
|
||||
# instructions carefully and select the appropriate option so
|
||||
# that you do not negligently cause a license violation.
|
||||
#
|
||||
|
||||
# --------
|
||||
# Option 1: If you host Misskey AS-IS (without any changes to
|
||||
# the source code. forks are not included).
|
||||
#
|
||||
# Step 1: Congratulations! You don't need to do anything.
|
||||
|
||||
# --------
|
||||
# Option 2: If you have made changes to the source code (forks
|
||||
# are included) and publish a Git repository of source
|
||||
# code. There should be no access restrictions on
|
||||
# this repository. Strictly speaking, it doesn't have
|
||||
# to be a Git repository, but you'll probably use Git!
|
||||
#
|
||||
# Step 1: Build and run the Misskey server first.
|
||||
# Step 2: Open <https://your.misskey.example/admin/settings> in
|
||||
# your browser with the administrator account.
|
||||
# Step 3: Enter the URL of your Git repository in the
|
||||
# "Repository URL" field.
|
||||
|
||||
# --------
|
||||
# Option 3: If neither of the above applies to you.
|
||||
# (In this case, the source code should be published
|
||||
# on the Misskey interface. IT IS NOT ENOUGH TO
|
||||
# DISCLOSE THE SOURCE CODE WHEN A USER REQUESTS IT BY
|
||||
# E-MAIL OR OTHER MEANS. If you are not satisfied
|
||||
# with this, it is recommended that you read the
|
||||
# license again carefully. Anyway, enabling this
|
||||
# option will automatically generate and publish a
|
||||
# tarball at build time, protecting you from
|
||||
# inadvertent license violations. (There is no legal
|
||||
# guarantee, of course.) The tarball will generated
|
||||
# from the root directory of your codebase. So it is
|
||||
# also recommended to check <built/tarball> directory
|
||||
# once after building and before activating the server
|
||||
# to avoid ACCIDENTAL LEAKING OF SENSITIVE INFORMATION.
|
||||
# To prevent certain files from being included in the
|
||||
# tarball, add a glob pattern after line 15 in
|
||||
# <scripts/tarball.mjs>. DO NOT FORGET TO BUILD AFTER
|
||||
# ENABLING THIS OPTION!)
|
||||
#
|
||||
# Step 1: Uncomment the following line.
|
||||
#
|
||||
# publishTarballInsteadOfProvideRepositoryUrl: true
|
||||
|
||||
# ┌────────────────────────┐
|
||||
#───┘ Initial Setup Password └─────────────────────────────────────────────────────
|
||||
|
||||
# Password to initiate setting up admin account.
|
||||
# It will not be used after the initial setup is complete.
|
||||
#
|
||||
# Be sure to change this when you set up Misskey via the Internet.
|
||||
#
|
||||
# The provider of the service who sets up Misskey on behalf of the customer should
|
||||
# set this value to something unique when generating the Misskey config file,
|
||||
# and provide it to the customer.
|
||||
#
|
||||
# setupPassword: example_password_please_change_this_or_you_will_get_hacked
|
||||
|
||||
# ┌─────┐
|
||||
#───┘ URL └─────────────────────────────────────────────────────
|
||||
|
||||
@@ -115,8 +186,39 @@ redis:
|
||||
# # You can specify more ioredis options...
|
||||
# #username: example-username
|
||||
|
||||
# ┌───────────────────────────┐
|
||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
||||
#redisForReactions:
|
||||
# host: localhost
|
||||
# port: 6379
|
||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
# #pass: example-pass
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
# # You can specify more ioredis options...
|
||||
# #username: example-username
|
||||
|
||||
# ┌───────────────────────────────┐
|
||||
#───┘ Fulltext search configuration └─────────────────────────────
|
||||
|
||||
# These are the setting items for the full-text search provider.
|
||||
fulltextSearch:
|
||||
# You can select the ID generation method.
|
||||
# - sqlLike (default)
|
||||
# Use SQL-like search.
|
||||
# This is a standard feature of PostgreSQL, so no special extensions are required.
|
||||
# - sqlPgroonga
|
||||
# Use pgroonga.
|
||||
# You need to install pgroonga and configure it as a PostgreSQL extension.
|
||||
# In addition to the above, you need to create a pgroonga index on the text column of the note table.
|
||||
# see: https://pgroonga.github.io/tutorial/
|
||||
# - meilisearch
|
||||
# Use Meilisearch.
|
||||
# You need to install Meilisearch and configure.
|
||||
provider: sqlLike
|
||||
|
||||
# For Meilisearch settings.
|
||||
# If you select "meilisearch" for "fulltextSearch.provider", it must be set.
|
||||
# You can set scope to local (default value) or global
|
||||
# (include notes from remote).
|
||||
|
||||
#meilisearch:
|
||||
# host: localhost
|
||||
@@ -145,6 +247,21 @@ redis:
|
||||
|
||||
id: 'aidx'
|
||||
|
||||
# ┌────────────────┐
|
||||
#───┘ Error tracking └──────────────────────────────────────────
|
||||
|
||||
# Sentry is available for error tracking.
|
||||
# See the Sentry documentation for more details on options.
|
||||
|
||||
#sentryForBackend:
|
||||
# enableNodeProfiling: true
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
#sentryForFrontend:
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
@@ -157,14 +274,14 @@ id: 'aidx'
|
||||
# Job concurrency per worker
|
||||
#deliverJobConcurrency: 128
|
||||
#inboxJobConcurrency: 16
|
||||
#relashionshipJobConcurrency: 16
|
||||
# What's relashionshipJob?:
|
||||
#relationshipJobConcurrency: 16
|
||||
# What's relationshipJob?:
|
||||
# Follow, unfollow, block and unblock(ings) while following-imports, etc. or account migrations.
|
||||
|
||||
# Job rate limiter
|
||||
#deliverJobPerSec: 128
|
||||
#inboxJobPerSec: 16
|
||||
#relashionshipJobPerSec: 64
|
||||
#inboxJobPerSec: 32
|
||||
#relationshipJobPerSec: 64
|
||||
|
||||
# Job attempts
|
||||
#deliverJobMaxAttempts: 12
|
||||
@@ -210,12 +327,30 @@ proxyRemoteFiles: true
|
||||
# Sign to ActivityPub GET request (default: true)
|
||||
signToActivityPubGet: true
|
||||
|
||||
# For security reasons, uploading attachments from the intranet is prohibited,
|
||||
# but exceptions can be made from the following settings. Default value is "undefined".
|
||||
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
|
||||
#allowedPrivateNetworks: [
|
||||
# '127.0.0.1/32'
|
||||
#]
|
||||
|
||||
# Disable automatic redirect for ActivityPub object lookup. (default: false)
|
||||
# This is a strong defense against potential impersonation attacks if the viewer instance has inadequate validation.
|
||||
# However it will make it impossible for other instances to lookup third-party user and notes through your URL.
|
||||
#disallowExternalApRedirect: true
|
||||
|
||||
# Upload or download file size limits (bytes)
|
||||
#maxFileSize: 262144000
|
||||
|
||||
# PID File of master process
|
||||
#pidFile: /tmp/misskey.pid
|
||||
|
||||
# Log settings
|
||||
# logging:
|
||||
# sql:
|
||||
# # Outputs query parameters during SQL execution to the log.
|
||||
# # default: false
|
||||
# enableQueryParamLogging: false
|
||||
# # Disable query truncation. If set to true, the full text of the query will be output to the log.
|
||||
# # default: false
|
||||
# disableQueryTruncation: false
|
||||
|
@@ -1,5 +1,3 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
@@ -8,6 +6,7 @@ services:
|
||||
|
||||
volumes:
|
||||
- ../:/workspace:cached
|
||||
- node_modules:/workspace/node_modules
|
||||
|
||||
command: sleep infinity
|
||||
|
||||
@@ -46,6 +45,7 @@ services:
|
||||
volumes:
|
||||
postgres-data:
|
||||
redis-data:
|
||||
node_modules:
|
||||
|
||||
networks:
|
||||
internal_network:
|
@@ -1,25 +1,24 @@
|
||||
{
|
||||
"name": "Misskey",
|
||||
"dockerComposeFile": "docker-compose.yml",
|
||||
"dockerComposeFile": "compose.yml",
|
||||
"service": "app",
|
||||
"workspaceFolder": "/workspace",
|
||||
"features": {
|
||||
"ghcr.io/devcontainers-contrib/features/pnpm:2": {
|
||||
"version": "8.9.2"
|
||||
},
|
||||
"ghcr.io/devcontainers/features/node:1": {
|
||||
"version": "20.5.1"
|
||||
"version": "22.11.0"
|
||||
},
|
||||
"ghcr.io/devcontainers-extra/features/pnpm:2": {
|
||||
"version": "10.6.1"
|
||||
}
|
||||
},
|
||||
"forwardPorts": [3000],
|
||||
"postCreateCommand": "sudo chmod 755 .devcontainer/init.sh && .devcontainer/init.sh",
|
||||
"postCreateCommand": "/bin/bash .devcontainer/init.sh",
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"editorconfig.editorconfig",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"Vue.volar",
|
||||
"Vue.vscode-typescript-vue-plugin",
|
||||
"Orta.vscode-jest",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"mrmlnc.vscode-json5"
|
||||
|
@@ -56,17 +56,17 @@ dbReplications: false
|
||||
# You can configure any number of replicas here
|
||||
#dbSlaves:
|
||||
# -
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
# -
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Redis configuration └─────────────────────────────────────
|
||||
@@ -103,6 +103,14 @@ redis:
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
|
||||
#redisForReactions:
|
||||
# host: redis
|
||||
# port: 6379
|
||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
# #pass: example-pass
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
|
||||
# ┌───────────────────────────┐
|
||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
||||
|
||||
@@ -132,6 +140,21 @@ redis:
|
||||
|
||||
id: 'aidx'
|
||||
|
||||
# ┌────────────────┐
|
||||
#───┘ Error tracking └──────────────────────────────────────────
|
||||
|
||||
# Sentry is available for error tracking.
|
||||
# See the Sentry documentation for more details on options.
|
||||
|
||||
#sentryForBackend:
|
||||
# enableNodeProfiling: true
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
#sentryForFrontend:
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
@@ -147,7 +170,7 @@ id: 'aidx'
|
||||
|
||||
# Job rate limiter
|
||||
# deliverJobPerSec: 128
|
||||
# inboxJobPerSec: 16
|
||||
# inboxJobPerSec: 32
|
||||
|
||||
# Job attempts
|
||||
# deliverJobMaxAttempts: 12
|
||||
|
@@ -2,10 +2,14 @@
|
||||
|
||||
set -xe
|
||||
|
||||
sudo chown -R node /workspace
|
||||
sudo chown node node_modules
|
||||
sudo apt-get update
|
||||
sudo apt-get -y install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libnss3 libxss1 libasound2 libxtst6 xauth xvfb
|
||||
git config --global --add safe.directory /workspace
|
||||
git submodule update --init
|
||||
pnpm config set store-dir /home/node/.local/share/pnpm/store
|
||||
pnpm install --frozen-lockfile
|
||||
cp .devcontainer/devcontainer.yml .config/default.yml
|
||||
pnpm build
|
||||
pnpm migrate
|
||||
pnpm exec cypress install
|
||||
|
@@ -7,12 +7,11 @@ Dockerfile
|
||||
build/
|
||||
built/
|
||||
db/
|
||||
docker-compose.yml
|
||||
.devcontainer/compose.yml
|
||||
node_modules/
|
||||
packages/*/node_modules
|
||||
redis/
|
||||
files/
|
||||
misskey-assets/
|
||||
fluent-emojis/
|
||||
.pnp.*
|
||||
|
||||
@@ -28,4 +27,4 @@ fluent-emojis/
|
||||
|
||||
.idea/
|
||||
packages/*/.vscode/
|
||||
packages/backend/test/docker-compose.yml
|
||||
packages/backend/test/compose.yml
|
||||
|
3
.github/FUNDING.yml
vendored
3
.github/FUNDING.yml
vendored
@@ -1,3 +0,0 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
patreon: syuilo
|
60
.github/ISSUE_TEMPLATE/01_bug-report.md
vendored
60
.github/ISSUE_TEMPLATE/01_bug-report.md
vendored
@@ -1,60 +0,0 @@
|
||||
---
|
||||
name: 🐛 Bug Report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ⚠️bug?
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
Thanks for reporting!
|
||||
First, in order to avoid duplicate Issues, please search to see if the problem you found has already been reported.
|
||||
Also, If you are NOT owner/admin of server, PLEASE DONT REPORT SERVER SPECIFIC ISSUES TO HERE! (e.g. feature XXX is not working in misskey.example) Please try with another misskey servers, and if your issue is only reproducible with specific server, contact your server's owner/admin first.
|
||||
-->
|
||||
|
||||
## 💡 Summary
|
||||
|
||||
<!-- Tell us what the bug is -->
|
||||
|
||||
## 🥰 Expected Behavior
|
||||
|
||||
<!--- Tell us what should happen -->
|
||||
|
||||
## 🤬 Actual Behavior
|
||||
|
||||
<!--
|
||||
Tell us what happens instead of the expected behavior.
|
||||
Please include errors from the developer console and/or server log files if you have access to them.
|
||||
-->
|
||||
|
||||
## 📝 Steps to Reproduce
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
## 📌 Environment
|
||||
|
||||
<!-- Tell us where on the platform it happens -->
|
||||
<!-- DO NOT WRITE "latest". Please provide the specific version. -->
|
||||
|
||||
### 💻 Frontend
|
||||
* Model and OS of the device(s):
|
||||
<!-- Example: MacBook Pro (14inch, 2021), macOS Ventura 13.4 -->
|
||||
* Browser:
|
||||
<!-- Example: Chrome 113.0.5672.126 -->
|
||||
* Server URL:
|
||||
<!-- Example: misskey.io -->
|
||||
* Misskey:
|
||||
13.x.x
|
||||
|
||||
### 🛰 Backend (for server admin)
|
||||
<!-- If you are using a managed service, put that after the version. -->
|
||||
|
||||
* Installation Method or Hosting Service: <!-- Example: docker compose, k8s/docker, systemd, "Misskey install shell script", development environment -->
|
||||
* Misskey: 13.x.x
|
||||
* Node: 20.x.x
|
||||
* PostgreSQL: 15.x.x
|
||||
* Redis: 7.x.x
|
||||
* OS and Architecture: <!-- Example: Ubuntu 22.04.2 LTS aarch64 -->
|
97
.github/ISSUE_TEMPLATE/01_bug-report.yml
vendored
Normal file
97
.github/ISSUE_TEMPLATE/01_bug-report.yml
vendored
Normal file
@@ -0,0 +1,97 @@
|
||||
name: 🐛 Bug Report
|
||||
description: Create a report to help us improve
|
||||
labels: ["⚠️bug?"]
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for reporting!
|
||||
First, in order to avoid duplicate Issues, please search to see if the problem you found has already been reported.
|
||||
Also, If you are NOT owner/admin of server, PLEASE DONT REPORT SERVER SPECIFIC ISSUES TO HERE! (e.g. feature XXX is not working in misskey.example) Please try with another misskey servers, and if your issue is only reproducible with specific server, contact your server's owner/admin first.
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 💡 Summary
|
||||
description: Tell us what the bug is
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 🥰 Expected Behavior
|
||||
description: Tell us what should happen
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 🤬 Actual Behavior
|
||||
description: |
|
||||
Tell us what happens instead of the expected behavior.
|
||||
Please include errors from the developer console and/or server log files if you have access to them.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 📝 Steps to Reproduce
|
||||
placeholder: |
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 💻 Frontend Environment
|
||||
description: |
|
||||
Tell us where on the platform it happens
|
||||
DO NOT WRITE "latest". Please provide the specific version.
|
||||
|
||||
Examples:
|
||||
* Model and OS of the device(s): MacBook Pro (14inch, 2021), macOS Ventura 13.4
|
||||
* Browser: Chrome 113.0.5672.126
|
||||
* Server URL: misskey.example.com
|
||||
* Misskey: 2025.x.x
|
||||
value: |
|
||||
* Model and OS of the device(s):
|
||||
* Browser:
|
||||
* Server URL:
|
||||
* Misskey:
|
||||
render: markdown
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 🛰 Backend Environment (for server admin)
|
||||
description: |
|
||||
Tell us where on the platform it happens
|
||||
DO NOT WRITE "latest". Please provide the specific version.
|
||||
If you are using a managed service, put that after the version.
|
||||
|
||||
Examples:
|
||||
* Installation Method or Hosting Service: docker compose, k8s/docker, systemd, "Misskey install shell script", development environment
|
||||
* Misskey: 2025.x.x
|
||||
* Node: 20.x.x
|
||||
* PostgreSQL: 15.x.x
|
||||
* Redis: 7.x.x
|
||||
* OS and Architecture: Ubuntu 24.04.2 LTS aarch64
|
||||
value: |
|
||||
* Installation Method or Hosting Service:
|
||||
* Misskey:
|
||||
* Node:
|
||||
* PostgreSQL:
|
||||
* Redis:
|
||||
* OS and Architecture:
|
||||
render: markdown
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Do you want to address this bug yourself?
|
||||
options:
|
||||
- label: Yes, I will patch the bug myself and send a pull request
|
12
.github/ISSUE_TEMPLATE/02_feature-request.md
vendored
12
.github/ISSUE_TEMPLATE/02_feature-request.md
vendored
@@ -1,12 +0,0 @@
|
||||
---
|
||||
name: ✨ Feature Request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ✨Feature
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
<!-- Tell us what the suggestion is -->
|
22
.github/ISSUE_TEMPLATE/02_feature-request.yml
vendored
Normal file
22
.github/ISSUE_TEMPLATE/02_feature-request.yml
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
name: ✨ Feature Request
|
||||
description: Suggest an idea for this project
|
||||
labels: ["✨Feature"]
|
||||
|
||||
body:
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Summary
|
||||
description: Tell us what the suggestion is
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Purpose
|
||||
description: Describe the specific problem or need you think this feature will solve, and who it will help.
|
||||
validations:
|
||||
required: true
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Do you want to implement this feature yourself?
|
||||
options:
|
||||
- label: Yes, I will implement this by myself and send a pull request
|
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -2,3 +2,7 @@ contact_links:
|
||||
- name: 💬 Misskey official Discord
|
||||
url: https://discord.gg/Wp8gVStHW3
|
||||
about: Chat freely about Misskey
|
||||
# 仮
|
||||
- name: 💬 Start discussion
|
||||
url: https://github.com/misskey-dev/misskey/discussions
|
||||
about: The official forum to join conversation and ask question
|
||||
|
30
.github/dependabot.yml
vendored
30
.github/dependabot.yml
vendored
@@ -9,7 +9,7 @@ updates:
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: daily
|
||||
open-pull-requests-limit: 100
|
||||
open-pull-requests-limit: 0
|
||||
|
||||
# Add only the root, not each workspace item
|
||||
# https://github.com/dependabot/dependabot-core/issues/4993#issuecomment-1289133027
|
||||
@@ -17,16 +17,32 @@ updates:
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: daily
|
||||
# PNPM has an issue with dependabot. See:
|
||||
# https://github.com/dependabot/dependabot-core/issues/7258
|
||||
# https://github.com/pnpm/pnpm/issues/6530
|
||||
# TODO: Restore this when the issue is solved
|
||||
open-pull-requests-limit: 0
|
||||
# List dependencies required to be updated together, sharing the same version numbers.
|
||||
# Those who simply have the common owner (e.g. @fastify) don't need to be listed.
|
||||
groups:
|
||||
swc:
|
||||
aws-sdk:
|
||||
patterns:
|
||||
- "@swc/*"
|
||||
- "@aws-sdk/*"
|
||||
bull-board:
|
||||
patterns:
|
||||
- "@bull-board/*"
|
||||
nestjs:
|
||||
patterns:
|
||||
- "@nestjs/*"
|
||||
slacc:
|
||||
patterns:
|
||||
- "slacc-*"
|
||||
storybook:
|
||||
patterns:
|
||||
- "storybook*"
|
||||
- "@storybook/*"
|
||||
swc-core:
|
||||
patterns:
|
||||
- "@swc/core*"
|
||||
typescript-eslint:
|
||||
patterns:
|
||||
- "@typescript-eslint/*"
|
||||
tensorflow:
|
||||
patterns:
|
||||
- "@tensorflow/*"
|
||||
|
29
.github/labeler.yml
vendored
29
.github/labeler.yml
vendored
@@ -1,21 +1,34 @@
|
||||
'packages/backend':
|
||||
- packages/backend/**/*
|
||||
- any:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ['packages/backend/**/*']
|
||||
|
||||
'packages/backend:test':
|
||||
- packages/backend/test/**/*
|
||||
- any:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ['packages/backend/test/**/*', 'packages/backend/test-federation/**/*']
|
||||
|
||||
'packages/frontend':
|
||||
- packages/frontend/**/*
|
||||
- any:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ['packages/frontend/**/*']
|
||||
|
||||
'packages/frontend:test':
|
||||
- cypress/**/*
|
||||
- any:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ['cypress/**/*']
|
||||
|
||||
'packages/sw':
|
||||
- packages/sw/**/*
|
||||
- any:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ['packages/sw/**/*']
|
||||
|
||||
'packages/misskey-js':
|
||||
- packages/misskey-js/**/*
|
||||
- any:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ['packages/misskey-js/**/*']
|
||||
|
||||
'packages/misskey-js:test':
|
||||
- packages/misskey-js/test/**/*
|
||||
- packages/misskey-js/test-d/**/*
|
||||
- any:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ['packages/misskey-js/test/**/*', 'packages/misskey-js/test-d/**/*']
|
||||
|
2
.github/misskey/test.yml
vendored
2
.github/misskey/test.yml
vendored
@@ -1,5 +1,7 @@
|
||||
url: 'http://misskey.local'
|
||||
|
||||
setupPassword: example_password_please_change_this_or_you_will_get_hacked
|
||||
|
||||
# ローカルでテストするときにポートを被らないようにするためデフォルトのものとは変える(以下同じ)
|
||||
port: 61812
|
||||
|
||||
|
18
.github/workflows/api-misskey-js.yml
vendored
18
.github/workflows/api-misskey-js.yml
vendored
@@ -1,7 +1,14 @@
|
||||
name: API report (misskey.js)
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/api-misskey-js.yml
|
||||
pull_request:
|
||||
paths:
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/api-misskey-js.yml
|
||||
jobs:
|
||||
report:
|
||||
|
||||
@@ -9,12 +16,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.1.1
|
||||
uses: actions/checkout@v4.2.2
|
||||
|
||||
- run: corepack enable
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3.8.1
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
43
.github/workflows/changelog-check.yml
vendored
Normal file
43
.github/workflows/changelog-check.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
name: Check the description in CHANGELOG.md
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
|
||||
jobs:
|
||||
check-changelog:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout head
|
||||
uses: actions/checkout@v4.2.2
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
|
||||
- name: Checkout base
|
||||
run: |
|
||||
mkdir _base
|
||||
cp -r .git _base/.git
|
||||
cd _base
|
||||
git fetch --depth 1 origin ${{ github.base_ref }}
|
||||
git checkout origin/${{ github.base_ref }} CHANGELOG.md
|
||||
|
||||
- name: Copy to Checker directory for CHANGELOG-base.md
|
||||
run: cp _base/CHANGELOG.md scripts/changelog-checker/CHANGELOG-base.md
|
||||
- name: Copy to Checker directory for CHANGELOG-head.md
|
||||
run: cp CHANGELOG.md scripts/changelog-checker/CHANGELOG-head.md
|
||||
- name: diff
|
||||
continue-on-error: true
|
||||
run: diff -u CHANGELOG-base.md CHANGELOG-head.md
|
||||
working-directory: scripts/changelog-checker
|
||||
|
||||
- name: Setup Checker
|
||||
run: npm install
|
||||
working-directory: scripts/changelog-checker
|
||||
- name: Run Checker
|
||||
run: npm run run
|
||||
working-directory: scripts/changelog-checker
|
139
.github/workflows/check-misskey-js-autogen.yml
vendored
Normal file
139
.github/workflows/check-misskey-js-autogen.yml
vendored
Normal file
@@ -0,0 +1,139 @@
|
||||
name: Check Misskey JS autogen
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
- improve-misskey-js-autogen-check
|
||||
paths:
|
||||
- packages/backend/**
|
||||
|
||||
jobs:
|
||||
# pull_request_target safety: permissions: read-all, and there are no secrets used in this job
|
||||
generate-misskey-js:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
submodules: true
|
||||
persist-credentials: false
|
||||
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: setup node
|
||||
id: setup-node
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: pnpm
|
||||
|
||||
- name: install dependencies
|
||||
run: pnpm i --frozen-lockfile
|
||||
|
||||
# generate api.json
|
||||
- name: Copy Config
|
||||
run: cp .config/example.yml .config/default.yml
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
- name: Generate API JSON
|
||||
run: pnpm --filter backend generate-api-json
|
||||
|
||||
# build misskey js
|
||||
- name: Build misskey-js
|
||||
run: |-
|
||||
cp packages/backend/built/api.json packages/misskey-js/generator/api.json
|
||||
pnpm run --filter misskey-js-type-generator generate
|
||||
|
||||
# packages/misskey-js/generator/built/autogen
|
||||
- name: Upload Generated
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: generated-misskey-js
|
||||
path: packages/misskey-js/generator/built/autogen
|
||||
|
||||
# pull_request_target safety: permissions: read-all, and no user codes are executed
|
||||
get-actual-misskey-js:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
submodules: true
|
||||
persist-credentials: false
|
||||
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||
|
||||
- name: Upload From Merged
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: actual-misskey-js
|
||||
path: packages/misskey-js/src/autogen
|
||||
|
||||
# pull_request_target safety: nothing is cloned from repository
|
||||
comment-misskey-js-autogen:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [generate-misskey-js, get-actual-misskey-js]
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: download generated-misskey-js
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: generated-misskey-js
|
||||
path: misskey-js-generated
|
||||
|
||||
- name: download actual-misskey-js
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: actual-misskey-js
|
||||
path: misskey-js-actual
|
||||
|
||||
- name: check misskey-js changes
|
||||
id: check-changes
|
||||
run: |
|
||||
diff -r -u --label=generated --label=on-tree ./misskey-js-generated ./misskey-js-actual > misskey-js.diff || true
|
||||
|
||||
if [ -s misskey-js.diff ]; then
|
||||
echo "changes=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "changes=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Print full diff
|
||||
run: cat ./misskey-js.diff
|
||||
|
||||
- name: send message
|
||||
if: steps.check-changes.outputs.changes == 'true'
|
||||
uses: thollander/actions-comment-pull-request@v2
|
||||
with:
|
||||
comment_tag: check-misskey-js-autogen
|
||||
message: |-
|
||||
Thank you for sending us a great Pull Request! 👍
|
||||
Please regenerate misskey-js type definitions! 🙏
|
||||
|
||||
example:
|
||||
```sh
|
||||
pnpm run build-misskey-js-with-types
|
||||
```
|
||||
|
||||
- name: send message
|
||||
if: steps.check-changes.outputs.changes == 'false'
|
||||
uses: thollander/actions-comment-pull-request@v2
|
||||
with:
|
||||
comment_tag: check-misskey-js-autogen
|
||||
mode: delete
|
||||
message: "Thank you!"
|
||||
create_if_not_exists: false
|
||||
|
||||
- name: Make failure if changes are detected
|
||||
if: steps.check-changes.outputs.changes == 'true'
|
||||
run: exit 1
|
29
.github/workflows/check-misskey-js-version.yml
vendored
Normal file
29
.github/workflows/check-misskey-js-version.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
name: Check Misskey JS version
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ develop ]
|
||||
paths:
|
||||
- packages/misskey-js/package.json
|
||||
- package.json
|
||||
- .github/workflows/check-misskey-js-version.yml
|
||||
pull_request:
|
||||
branches: [ develop ]
|
||||
paths:
|
||||
- packages/misskey-js/package.json
|
||||
- package.json
|
||||
- .github/workflows/check-misskey-js-version.yml
|
||||
jobs:
|
||||
check-version:
|
||||
# ルートの package.json と packages/misskey-js/package.json のバージョンが一致しているかを確認する
|
||||
name: Check version
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
- name: Check version
|
||||
run: |
|
||||
if [ "$(jq -r '.version' package.json)" != "$(jq -r '.version' packages/misskey-js/package.json)" ]; then
|
||||
echo "Version mismatch!"
|
||||
exit 1
|
||||
fi
|
79
.github/workflows/check-spdx-license-id.yml
vendored
Normal file
79
.github/workflows/check-spdx-license-id.yml
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
name: Check SPDX-License-Identifier
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
check-spdx-license-id:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
- name: Check
|
||||
run: |
|
||||
counter=0
|
||||
|
||||
search() {
|
||||
local directory="$1"
|
||||
find "$directory" -type f \
|
||||
'(' \
|
||||
-name "*.cjs" -and -not -name '*.config.cjs' -o \
|
||||
-name "*.html" -o \
|
||||
-name "*.js" -and -not -name '*.config.js' -o \
|
||||
-name "*.mjs" -and -not -name '*.config.mjs' -o \
|
||||
-name "*.scss" -o \
|
||||
-name "*.ts" -and -not -name '*.config.ts' -o \
|
||||
-name "*.vue" \
|
||||
')' -and \
|
||||
-not -name '*eslint*'
|
||||
}
|
||||
|
||||
check() {
|
||||
local file="$1"
|
||||
if ! (
|
||||
grep -q "SPDX-FileCopyrightText: syuilo and misskey-project" "$file" ||
|
||||
grep -q "SPDX-License-Identifier: AGPL-3.0-only" "$file"
|
||||
); then
|
||||
echo "Missing: $file"
|
||||
((counter++))
|
||||
fi
|
||||
}
|
||||
|
||||
directories=(
|
||||
"cypress/e2e"
|
||||
"packages/backend/migration"
|
||||
"packages/backend/src"
|
||||
"packages/backend/test"
|
||||
"packages/frontend-shared/@types"
|
||||
"packages/frontend-shared/js"
|
||||
"packages/frontend/.storybook"
|
||||
"packages/frontend/@types"
|
||||
"packages/frontend/lib"
|
||||
"packages/frontend/public"
|
||||
"packages/frontend/src"
|
||||
"packages/frontend/test"
|
||||
"packages/frontend-embed/@types"
|
||||
"packages/frontend-embed/src"
|
||||
"packages/misskey-bubble-game/src"
|
||||
"packages/misskey-reversi/src"
|
||||
"packages/sw/src"
|
||||
"scripts"
|
||||
)
|
||||
|
||||
for directory in "${directories[@]}"; do
|
||||
for file in $(search $directory); do
|
||||
check "$file"
|
||||
done
|
||||
done
|
||||
|
||||
if [ $counter -gt 0 ]; then
|
||||
echo "SPDX-License-Identifier is missing in $counter files."
|
||||
exit 1
|
||||
else
|
||||
echo "SPDX-License-Identifier is certainly described in all target files!"
|
||||
exit 0
|
||||
fi
|
2
.github/workflows/check_copyright_year.yml
vendored
2
.github/workflows/check_copyright_year.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
||||
check_copyright_year:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- run: |
|
||||
if [ "$(grep Copyright COPYING | sed -e 's/.*2014-\([0-9]*\) .*/\1/g')" -ne "$(date +%Y)" ]; then
|
||||
echo "Please change copyright year!"
|
||||
|
84
.github/workflows/deploy-test-environment.yml
vendored
Normal file
84
.github/workflows/deploy-test-environment.yml
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
name: deploy-test-environment
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
repository:
|
||||
description: 'Repository to deploy (optional, use the repository where this workflow is stored by default)'
|
||||
required: false
|
||||
default: ''
|
||||
branch_or_hash:
|
||||
description: 'Branch or Commit hash to deploy (optional, use the branch where this workflow is stored by default)'
|
||||
required: false
|
||||
default: ''
|
||||
wait_time:
|
||||
description: 'Time to wait in seconds (optional, 1800 seconds by default)'
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
jobs:
|
||||
get-pr-ref:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name == 'issue_comment' && github.event.issue.pull_request && startsWith(github.event.comment.body, '/preview')
|
||||
outputs:
|
||||
is-allowed-user: ${{ steps.check-allowed-users.outputs.is-allowed-user }}
|
||||
pr-ref: ${{ steps.get-ref.outputs.pr-ref }}
|
||||
wait_time: ${{ steps.get-wait-time.outputs.wait_time }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
|
||||
- name: Check allowed users
|
||||
id: check-allowed-users
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
ORG_ID: ${{ github.repository_owner_id }}
|
||||
COMMENT_AUTHOR: ${{ github.event.comment.user.login }}
|
||||
run: |
|
||||
MEMBERSHIP_STATUS=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \
|
||||
-H "Accept: application/vnd.github+json" \
|
||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||
"https://api.github.com/organizations/$ORG_ID/public_members/$COMMENT_AUTHOR" \
|
||||
-o /dev/null -w '%{http_code}\n' -s)
|
||||
if [ "$MEMBERSHIP_STATUS" -eq 204 ]; then
|
||||
echo "is-allowed-user=true" > $GITHUB_OUTPUT
|
||||
else
|
||||
echo "is-allowed-user=false" > $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Get PR ref
|
||||
id: get-ref
|
||||
run: |
|
||||
PR_REF="refs/pull/${{ github.event.issue.number }}/head"
|
||||
echo "pr-ref=$PR_REF" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Extract wait time
|
||||
id: get-wait-time
|
||||
env:
|
||||
COMMENT_BODY: ${{ github.event.comment.body }}
|
||||
run: |
|
||||
WAIT_TIME=$(echo "$COMMENT_BODY" | grep -oP '(?<=/preview\s)\d+' || echo "1800")
|
||||
echo "wait_time=$WAIT_TIME" > $GITHUB_OUTPUT
|
||||
|
||||
deploy-test-environment-pr-comment:
|
||||
needs: get-pr-ref
|
||||
if: needs.get-pr-ref.outputs.is-allowed-user == 'true'
|
||||
uses: joinmisskey/misskey-tga/.github/workflows/deploy-test-environment.yml@main
|
||||
with:
|
||||
repository: ${{ github.repository }}
|
||||
branch_or_hash: ${{ needs.get-pr-ref.outputs.pr-ref }}
|
||||
wait_time: ${{ needs.get-pr-ref.outputs.wait_time }}
|
||||
secrets:
|
||||
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
|
||||
|
||||
deploy-test-environment-wd:
|
||||
if: github.event_name == 'workflow_dispatch'
|
||||
uses: joinmisskey/misskey-tga/.github/workflows/deploy-test-environment.yml@main
|
||||
with:
|
||||
repository: ${{ inputs.repository || github.repository }}
|
||||
branch_or_hash: ${{ inputs.branch_or_hash || github.ref_name }}
|
||||
wait_time: ${{ inputs.wait_time || '1800' }}
|
||||
secrets:
|
||||
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
|
79
.github/workflows/docker-develop.yml
vendored
79
.github/workflows/docker-develop.yml
vendored
@@ -6,38 +6,83 @@ on:
|
||||
- develop
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
REGISTRY_IMAGE: misskey/misskey
|
||||
|
||||
jobs:
|
||||
push_to_registry:
|
||||
name: Push Docker image to Docker Hub
|
||||
# see https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform:
|
||||
- linux/amd64
|
||||
- linux/arm64
|
||||
if: github.repository == 'misskey-dev/misskey'
|
||||
steps:
|
||||
- name: Prepare
|
||||
run: |
|
||||
platform=${{ matrix.platform }}
|
||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@v4.1.1
|
||||
uses: actions/checkout@v4.2.2
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3.0.0
|
||||
with:
|
||||
platforms: linux/amd64,linux/arm64
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: misskey/misskey
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Log in to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
- name: Build and Push to Docker Hub
|
||||
uses: docker/build-push-action@v5
|
||||
- name: Build and push by digest
|
||||
id: build
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
builder: ${{ steps.buildx.outputs.name }}
|
||||
context: .
|
||||
push: true
|
||||
platforms: ${{ steps.buildx.outputs.platforms }}
|
||||
platforms: ${{ matrix.platform }}
|
||||
provenance: false
|
||||
tags: misskey/misskey:develop
|
||||
labels: develop
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
|
||||
- name: Export digest
|
||||
run: |
|
||||
mkdir -p /tmp/digests
|
||||
digest="${{ steps.build.outputs.digest }}"
|
||||
touch "/tmp/digests/${digest#sha256:}"
|
||||
- name: Upload digest
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: digests-${{ env.PLATFORM_PAIR }}
|
||||
path: /tmp/digests/*
|
||||
if-no-files-found: error
|
||||
retention-days: 1
|
||||
|
||||
merge:
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- build
|
||||
steps:
|
||||
- name: Download digests
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: /tmp/digests
|
||||
pattern: digests-*
|
||||
merge-multiple: true
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
- name: Create manifest list and push
|
||||
working-directory: /tmp/digests
|
||||
run: |
|
||||
docker buildx imagetools create --tag ${{ env.REGISTRY_IMAGE }}:develop \
|
||||
$(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
|
||||
- name: Inspect image
|
||||
run: |
|
||||
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:develop
|
||||
|
98
.github/workflows/docker.yml
vendored
98
.github/workflows/docker.yml
vendored
@@ -5,45 +5,101 @@ on:
|
||||
types: [published]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
push_to_registry:
|
||||
name: Push Docker image to Docker Hub
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
REGISTRY_IMAGE: misskey/misskey
|
||||
TAGS: |
|
||||
type=edge
|
||||
type=ref,event=pr
|
||||
type=ref,event=branch
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
|
||||
jobs:
|
||||
# see https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform:
|
||||
- linux/amd64
|
||||
- linux/arm64
|
||||
steps:
|
||||
- name: Prepare
|
||||
run: |
|
||||
platform=${{ matrix.platform }}
|
||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@v4.1.1
|
||||
uses: actions/checkout@v4.2.2
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3.0.0
|
||||
with:
|
||||
platforms: linux/amd64,linux/arm64
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: misskey/misskey
|
||||
tags: |
|
||||
type=edge
|
||||
type=ref,event=pr
|
||||
type=ref,event=branch
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
images: ${{ env.REGISTRY_IMAGE }}
|
||||
tags: ${{ env.TAGS }}
|
||||
- name: Log in to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
- name: Build and Push to Docker Hub
|
||||
uses: docker/build-push-action@v5
|
||||
id: build
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
builder: ${{ steps.buildx.outputs.name }}
|
||||
context: .
|
||||
push: true
|
||||
platforms: ${{ steps.buildx.outputs.platforms }}
|
||||
platforms: ${{ matrix.platform }}
|
||||
provenance: false
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
|
||||
- name: Export digest
|
||||
run: |
|
||||
mkdir -p /tmp/digests
|
||||
digest="${{ steps.build.outputs.digest }}"
|
||||
touch "/tmp/digests/${digest#sha256:}"
|
||||
- name: Upload digest
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: digests-${{ env.PLATFORM_PAIR }}
|
||||
path: /tmp/digests/*
|
||||
if-no-files-found: error
|
||||
retention-days: 1
|
||||
|
||||
merge:
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- build
|
||||
steps:
|
||||
- name: Download digests
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: /tmp/digests
|
||||
pattern: digests-*
|
||||
merge-multiple: true
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY_IMAGE }}
|
||||
tags: ${{ env.TAGS }}
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
- name: Create manifest list and push
|
||||
working-directory: /tmp/digests
|
||||
run: |
|
||||
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
|
||||
$(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
|
||||
- name: Inspect image
|
||||
run: |
|
||||
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
|
||||
|
10
.github/workflows/dockle.yml
vendored
10
.github/workflows/dockle.yml
vendored
@@ -13,14 +13,16 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
DOCKER_CONTENT_TRUST: 1
|
||||
DOCKLE_VERSION: 0.4.14
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- run: |
|
||||
curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v0.4.10/dockle_0.4.10_Linux-64bit.deb"
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- name: Download and install dockle v${{ env.DOCKLE_VERSION }}
|
||||
run: |
|
||||
curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v${DOCKLE_VERSION}/dockle_${DOCKLE_VERSION}_Linux-64bit.deb"
|
||||
sudo dpkg -i dockle.deb
|
||||
- run: |
|
||||
cp .config/docker_example.env .config/docker.env
|
||||
cp ./docker-compose.yml.example ./docker-compose.yml
|
||||
cp ./compose_example.yml ./compose.yml
|
||||
- run: |
|
||||
docker compose up -d web
|
||||
docker tag "$(docker compose images web | awk 'OFS=":" {print $4}' | tail -n +2)" misskey-web:latest
|
||||
|
223
.github/workflows/get-api-diff.yml
vendored
223
.github/workflows/get-api-diff.yml
vendored
@@ -1,53 +1,42 @@
|
||||
name: Report API Diff
|
||||
# this name is used in report-api-diff.yml so be careful when change name
|
||||
name: Get api.json from Misskey
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
|
||||
paths:
|
||||
- packages/backend/**
|
||||
- .github/workflows/get-api-diff.yml
|
||||
jobs:
|
||||
get-base:
|
||||
get-from-misskey:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.5.1]
|
||||
|
||||
services:
|
||||
db:
|
||||
image: postgres:13
|
||||
ports:
|
||||
- 5432:5432
|
||||
env:
|
||||
POSTGRES_DB: misskey
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
POSTGRES_USER: example-misskey-user
|
||||
POSTGRESS_PASS: example-misskey-pass
|
||||
redis:
|
||||
image: redis:7
|
||||
ports:
|
||||
- 6379:6379
|
||||
node-version: [22.11.0]
|
||||
api-json-name: [api-base.json, api-head.json]
|
||||
include:
|
||||
- api-json-name: api-base.json
|
||||
ref: ${{ github.base_ref }}
|
||||
- api-json-name: api-head.json
|
||||
ref: refs/pull/${{ github.event.number }}/merge
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
repository: ${{ github.event.pull_request.base.repo.full_name }}
|
||||
ref: ${{ github.base_ref }}
|
||||
ref: ${{ matrix.ref }}
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3.8.1
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'pnpm'
|
||||
- run: corepack enable
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
@@ -55,171 +44,25 @@ jobs:
|
||||
run: cp .config/example.yml .config/default.yml
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
- name : Migrate
|
||||
run: pnpm migrate
|
||||
- name: Launch misskey
|
||||
run: |
|
||||
screen -S misskey -dm pnpm run dev
|
||||
sleep 30s
|
||||
- name: Wait for Misskey to be ready
|
||||
run: |
|
||||
MAX_RETRIES=12
|
||||
RETRY_DELAY=5
|
||||
count=0
|
||||
until $(curl --output /dev/null --silent --head --fail http://localhost:3000) || [[ $count -eq $MAX_RETRIES ]]; do
|
||||
printf '.'
|
||||
sleep $RETRY_DELAY
|
||||
count=$((count + 1))
|
||||
done
|
||||
|
||||
if [[ $count -eq $MAX_RETRIES ]]; then
|
||||
echo "Failed to connect to Misskey after $MAX_RETRIES attempts."
|
||||
exit 1
|
||||
fi
|
||||
- id: fetch
|
||||
name: Get api.json from Misskey
|
||||
run: |
|
||||
RESULT=$(curl --retry 5 --retry-delay 5 --retry-max-time 60 http://localhost:3000/api.json)
|
||||
echo $RESULT > api-base.json
|
||||
- name: Generate API JSON
|
||||
run: pnpm --filter backend generate-api-json
|
||||
- name: Copy API.json
|
||||
run: cp packages/backend/built/api.json ${{ matrix.api-json-name }}
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: api-artifact
|
||||
path: api-base.json
|
||||
- name: Kill Misskey Job
|
||||
run: screen -S misskey -X quit
|
||||
name: api-artifact-${{ matrix.api-json-name }}
|
||||
path: ${{ matrix.api-json-name }}
|
||||
|
||||
get-head:
|
||||
save-pr-number:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.5.1]
|
||||
|
||||
services:
|
||||
db:
|
||||
image: postgres:13
|
||||
ports:
|
||||
- 5432:5432
|
||||
steps:
|
||||
- name: Save PR number
|
||||
env:
|
||||
POSTGRES_DB: misskey
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
POSTGRES_USER: example-misskey-user
|
||||
POSTGRESS_PASS: example-misskey-pass
|
||||
redis:
|
||||
image: redis:7
|
||||
ports:
|
||||
- 6379:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
with:
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
ref: ${{ github.head_ref }}
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3.8.1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'pnpm'
|
||||
- run: corepack enable
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Copy Configure
|
||||
run: cp .config/example.yml .config/default.yml
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
- name : Migrate
|
||||
run: pnpm migrate
|
||||
- name: Launch misskey
|
||||
run: |
|
||||
screen -S misskey -dm pnpm run dev
|
||||
sleep 30s
|
||||
- name: Wait for Misskey to be ready
|
||||
run: |
|
||||
MAX_RETRIES=12
|
||||
RETRY_DELAY=5
|
||||
count=0
|
||||
until $(curl --output /dev/null --silent --head --fail http://localhost:3000) || [[ $count -eq $MAX_RETRIES ]]; do
|
||||
printf '.'
|
||||
sleep $RETRY_DELAY
|
||||
count=$((count + 1))
|
||||
done
|
||||
|
||||
if [[ $count -eq $MAX_RETRIES ]]; then
|
||||
echo "Failed to connect to Misskey after $MAX_RETRIES attempts."
|
||||
exit 1
|
||||
fi
|
||||
- id: fetch
|
||||
name: Get api.json from Misskey
|
||||
run: |
|
||||
RESULT=$(curl --retry 5 --retry-delay 5 --retry-max-time 60 http://localhost:3000/api.json)
|
||||
echo $RESULT > api-head.json
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: api-artifact
|
||||
path: api-head.json
|
||||
- name: Kill Misskey Job
|
||||
run: screen -S misskey -X quit
|
||||
|
||||
compare-diff:
|
||||
runs-on: ubuntu-latest
|
||||
if: success()
|
||||
needs: [get-base, get-head]
|
||||
permissions:
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Download Artifact
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: api-artifact
|
||||
path: ./artifacts
|
||||
- name: Output base
|
||||
run: cat ./artifacts/api-base.json
|
||||
- name: Output head
|
||||
run: cat ./artifacts/api-head.json
|
||||
- name: Arrange json files
|
||||
PR_NUMBER: ${{ github.event.number }}
|
||||
run: |
|
||||
jq '.' ./artifacts/api-base.json > ./api-base.json
|
||||
jq '.' ./artifacts/api-head.json > ./api-head.json
|
||||
- name: Get diff of 2 files
|
||||
run: diff -u --label=base --label=head ./api-base.json ./api-head.json | cat > api.json.diff
|
||||
- name: Get full diff
|
||||
run: diff --label=base --label=head --new-line-format='+%L' --old-line-format='-%L' --unchanged-line-format=' %L' ./api-base.json ./api-head.json | cat > api-full.json.diff
|
||||
- name: Echo full diff
|
||||
run: cat ./api-full.json.diff
|
||||
- name: Upload full diff to Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
echo "$PR_NUMBER" > ./pr_number
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: api-artifact
|
||||
path: api-full.json.diff
|
||||
- id: out-diff
|
||||
name: Build diff Comment
|
||||
run: |
|
||||
cat <<- EOF > ./output.md
|
||||
このPRによるapi.jsonの差分
|
||||
<details>
|
||||
<summary>差分はこちら</summary>
|
||||
|
||||
\`\`\`diff
|
||||
$(cat ./api.json.diff)
|
||||
\`\`\`
|
||||
</details>
|
||||
|
||||
[Get diff files from Workflow Page](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})
|
||||
EOF
|
||||
- name: Write diff comment
|
||||
uses: thollander/actions-comment-pull-request@v2
|
||||
with:
|
||||
comment_tag: show_diff
|
||||
filePath: ./output.md
|
||||
name: api-artifact-pr-number
|
||||
path: pr_number
|
||||
|
2
.github/workflows/labeler.yml
vendored
2
.github/workflows/labeler.yml
vendored
@@ -11,6 +11,6 @@ jobs:
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/labeler@v4
|
||||
- uses: actions/labeler@v5
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
|
76
.github/workflows/lint.yml
vendored
76
.github/workflows/lint.yml
vendored
@@ -5,25 +5,43 @@ on:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
paths:
|
||||
- packages/backend/**
|
||||
- packages/frontend/**
|
||||
- packages/frontend-shared/**
|
||||
- packages/frontend-embed/**
|
||||
- packages/sw/**
|
||||
- packages/misskey-js/**
|
||||
- packages/misskey-bubble-game/**
|
||||
- packages/misskey-reversi/**
|
||||
- packages/shared/eslint.config.js
|
||||
- .github/workflows/lint.yml
|
||||
pull_request:
|
||||
|
||||
paths:
|
||||
- packages/backend/**
|
||||
- packages/frontend/**
|
||||
- packages/frontend-shared/**
|
||||
- packages/frontend-embed/**
|
||||
- packages/sw/**
|
||||
- packages/misskey-js/**
|
||||
- packages/misskey-bubble-game/**
|
||||
- packages/misskey-reversi/**
|
||||
- packages/shared/eslint.config.js
|
||||
- .github/workflows/lint.yml
|
||||
jobs:
|
||||
pnpm_install:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
- uses: actions/setup-node@v3.8.1
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: corepack enable
|
||||
- run: pnpm i --frozen-lockfile
|
||||
|
||||
lint:
|
||||
@@ -35,24 +53,34 @@ jobs:
|
||||
workspace:
|
||||
- backend
|
||||
- frontend
|
||||
- frontend-shared
|
||||
- frontend-embed
|
||||
- sw
|
||||
- misskey-js
|
||||
- misskey-bubble-game
|
||||
- misskey-reversi
|
||||
env:
|
||||
eslint-cache-version: v1
|
||||
eslint-cache-path: ${{ github.workspace }}/node_modules/.cache/eslint-${{ matrix.workspace }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 7
|
||||
run_install: false
|
||||
- uses: actions/setup-node@v3.8.1
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: corepack enable
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- run: pnpm --filter ${{ matrix.workspace }} run eslint
|
||||
- name: Restore eslint cache
|
||||
uses: actions/cache@v4.2.2
|
||||
with:
|
||||
path: ${{ env.eslint-cache-path }}
|
||||
key: eslint-${{ env.eslint-cache-version }}-${{ matrix.workspace }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ github.ref_name }}-${{ github.sha }}
|
||||
restore-keys: eslint-${{ env.eslint-cache-version }}-${{ matrix.workspace }}-${{ hashFiles('**/pnpm-lock.yaml') }}-
|
||||
- run: pnpm --filter ${{ matrix.workspace }} run eslint --cache --cache-location ${{ env.eslint-cache-path }} --cache-strategy content
|
||||
|
||||
typecheck:
|
||||
needs: [pnpm_install]
|
||||
@@ -62,20 +90,22 @@ jobs:
|
||||
matrix:
|
||||
workspace:
|
||||
- backend
|
||||
- sw
|
||||
- misskey-js
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 7
|
||||
run_install: false
|
||||
- uses: actions/setup-node@v3.8.1
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: corepack enable
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- run: pnpm --filter misskey-js run build
|
||||
if: ${{ matrix.workspace == 'backend' || matrix.workspace == 'sw' }}
|
||||
- run: pnpm --filter misskey-reversi run build
|
||||
if: ${{ matrix.workspace == 'backend' }}
|
||||
- run: pnpm --filter ${{ matrix.workspace }} run typecheck
|
||||
|
28
.github/workflows/locale.yml
vendored
Normal file
28
.github/workflows/locale.yml
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
name: Lint
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- locales/**
|
||||
- .github/workflows/locale.yml
|
||||
pull_request:
|
||||
paths:
|
||||
- locales/**
|
||||
- .github/workflows/locale.yml
|
||||
jobs:
|
||||
locale_verify:
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- run: cd locales && node verify.js
|
36
.github/workflows/ok-to-test.yml
vendored
36
.github/workflows/ok-to-test.yml
vendored
@@ -1,36 +0,0 @@
|
||||
# If someone with write access comments "/ok-to-test" on a pull request, emit a repository_dispatch event
|
||||
name: Ok To Test
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
|
||||
jobs:
|
||||
ok-to-test:
|
||||
runs-on: ubuntu-latest
|
||||
# Only run for PRs, not issue comments
|
||||
if: ${{ github.event.issue.pull_request }}
|
||||
steps:
|
||||
# Generate a GitHub App installation access token from an App ID and private key
|
||||
# To create a new GitHub App:
|
||||
# https://developer.github.com/apps/building-github-apps/creating-a-github-app/
|
||||
# See app.yml for an example app manifest
|
||||
- name: Generate token
|
||||
id: generate_token
|
||||
uses: tibdex/github-app-token@v2
|
||||
with:
|
||||
app_id: ${{ secrets.DEPLOYBOT_APP_ID }}
|
||||
private_key: ${{ secrets.DEPLOYBOT_PRIVATE_KEY }}
|
||||
|
||||
- name: Slash Command Dispatch
|
||||
uses: peter-evans/slash-command-dispatch@v3
|
||||
env:
|
||||
TOKEN: ${{ steps.generate_token.outputs.token }}
|
||||
with:
|
||||
token: ${{ env.TOKEN }} # GitHub App installation access token
|
||||
# token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} # PAT or OAuth token will also work
|
||||
reaction-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
issue-type: pull-request
|
||||
commands: deploy
|
||||
named-args: true
|
||||
permission: write
|
41
.github/workflows/on-release-created.yml
vendored
Normal file
41
.github/workflows/on-release-created.yml
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
name: On Release Created (Publish misskey-js)
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [created]
|
||||
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
publish-misskey-js:
|
||||
name: Publish misskey-js
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
id-token: write
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [22.11.0]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'pnpm'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
- name: Publish package
|
||||
run: |
|
||||
pnpm i --frozen-lockfile
|
||||
pnpm build
|
||||
pnpm --filter misskey-js publish --access public --no-git-checks --provenance
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
|
||||
NPM_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
|
92
.github/workflows/pr-preview-deploy.yml
vendored
92
.github/workflows/pr-preview-deploy.yml
vendored
@@ -1,92 +0,0 @@
|
||||
# Run secret-dependent integration tests only after /deploy approval
|
||||
on:
|
||||
repository_dispatch:
|
||||
types: [deploy-command]
|
||||
|
||||
name: Deploy preview environment
|
||||
|
||||
jobs:
|
||||
# Repo owner has commented /deploy on a (fork-based) pull request
|
||||
deploy-preview-environment:
|
||||
runs-on: ubuntu-latest
|
||||
if:
|
||||
github.event.client_payload.slash_command.sha != '' &&
|
||||
contains(github.event.client_payload.pull_request.head.sha, github.event.client_payload.slash_command.sha)
|
||||
steps:
|
||||
- uses: actions/github-script@v6.3.3
|
||||
id: check-id
|
||||
env:
|
||||
number: ${{ github.event.client_payload.pull_request.number }}
|
||||
job: ${{ github.job }}
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
result-encoding: string
|
||||
script: |
|
||||
const { data: pull } = await github.rest.pulls.get({
|
||||
...context.repo,
|
||||
pull_number: process.env.number
|
||||
});
|
||||
const ref = pull.head.sha;
|
||||
|
||||
const { data: checks } = await github.rest.checks.listForRef({
|
||||
...context.repo,
|
||||
ref
|
||||
});
|
||||
|
||||
const check = checks.check_runs.filter(c => c.name === process.env.job);
|
||||
|
||||
return check[0].id;
|
||||
|
||||
- uses: actions/github-script@v6.3.3
|
||||
env:
|
||||
check_id: ${{ steps.check-id.outputs.result }}
|
||||
details_url: ${{ github.server_url }}/${{ github.repository }}/runs/${{ github.run_id }}
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
await github.rest.checks.update({
|
||||
...context.repo,
|
||||
check_run_id: process.env.check_id,
|
||||
status: 'in_progress',
|
||||
details_url: process.env.details_url
|
||||
});
|
||||
|
||||
# Check out merge commit
|
||||
- name: Fork based /deploy checkout
|
||||
uses: actions/checkout@v4.1.1
|
||||
with:
|
||||
ref: 'refs/pull/${{ github.event.client_payload.pull_request.number }}/merge'
|
||||
|
||||
# <insert integration tests needing secrets>
|
||||
- name: Context
|
||||
uses: okteto/context@latest
|
||||
with:
|
||||
token: ${{ secrets.OKTETO_TOKEN }}
|
||||
|
||||
- name: Deploy preview environment
|
||||
uses: ikuradon/deploy-preview@latest
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
name: pr-${{ github.event.client_payload.pull_request.number }}-syuilo
|
||||
timeout: 15m
|
||||
|
||||
# Update check run called "integration-fork"
|
||||
- uses: actions/github-script@v6.3.3
|
||||
id: update-check-run
|
||||
if: ${{ always() }}
|
||||
env:
|
||||
# Conveniently, job.status maps to https://developer.github.com/v3/checks/runs/#update-a-check-run
|
||||
conclusion: ${{ job.status }}
|
||||
check_id: ${{ steps.check-id.outputs.result }}
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const { data: result } = await github.rest.checks.update({
|
||||
...context.repo,
|
||||
check_run_id: process.env.check_id,
|
||||
status: 'completed',
|
||||
conclusion: process.env.conclusion
|
||||
});
|
||||
|
||||
return result;
|
54
.github/workflows/pr-preview-destroy.yml
vendored
54
.github/workflows/pr-preview-destroy.yml
vendored
@@ -1,54 +0,0 @@
|
||||
# file: .github/workflows/preview-closed.yaml
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- closed
|
||||
|
||||
name: Destroy preview environment
|
||||
|
||||
jobs:
|
||||
destroy-preview-environment:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/github-script@v6.3.3
|
||||
id: check-conclusion
|
||||
env:
|
||||
number: ${{ github.event.number }}
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
result-encoding: string
|
||||
script: |
|
||||
const { data: pull } = await github.rest.pulls.get({
|
||||
...context.repo,
|
||||
pull_number: process.env.number
|
||||
});
|
||||
const ref = pull.head.sha;
|
||||
|
||||
const { data: checks } = await github.rest.checks.listForRef({
|
||||
...context.repo,
|
||||
ref
|
||||
});
|
||||
|
||||
const check = checks.check_runs.filter(c => c.name === 'deploy-preview-environment');
|
||||
|
||||
if (check.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { data: result } = await github.rest.checks.get({
|
||||
...context.repo,
|
||||
check_run_id: check[0].id,
|
||||
});
|
||||
|
||||
return result.conclusion;
|
||||
- name: Context
|
||||
if: steps.check-conclusion.outputs.result == 'success'
|
||||
uses: okteto/context@latest
|
||||
with:
|
||||
token: ${{ secrets.OKTETO_TOKEN }}
|
||||
|
||||
- name: Destroy preview environment
|
||||
if: steps.check-conclusion.outputs.result == 'success'
|
||||
uses: okteto/destroy-preview@latest
|
||||
with:
|
||||
name: pr-${{ github.event.number }}-syuilo
|
48
.github/workflows/release-edit-with-push.yml
vendored
Normal file
48
.github/workflows/release-edit-with-push.yml
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
name: "Release Manager: sync changelog with PR"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- develop
|
||||
paths:
|
||||
- 'CHANGELOG.md'
|
||||
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
edit:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
# headが$GITHUB_REF_NAME, baseが$STABLE_BRANCHかつopenのPRを1つ取得
|
||||
- name: Get PR
|
||||
run: |
|
||||
echo "pr_number=$(gh pr list --limit 1 --search "head:$GITHUB_REF_NAME base:$STABLE_BRANCH is:open" --json number --jq '.[] | .number')" >> $GITHUB_OUTPUT
|
||||
id: get_pr
|
||||
env:
|
||||
STABLE_BRANCH: ${{ vars.STABLE_BRANCH }}
|
||||
- name: Get target version
|
||||
if: steps.get_pr.outputs.pr_number != ''
|
||||
uses: misskey-dev/release-manager-actions/.github/actions/get-target-version@v2
|
||||
id: v
|
||||
# CHANGELOG.mdの内容を取得
|
||||
- name: Get changelog
|
||||
if: steps.get_pr.outputs.pr_number != ''
|
||||
uses: misskey-dev/release-manager-actions/.github/actions/get-changelog@v2
|
||||
with:
|
||||
version: ${{ steps.v.outputs.target_version }}
|
||||
id: changelog
|
||||
# PRのnotesを更新
|
||||
- name: Update PR
|
||||
if: steps.get_pr.outputs.pr_number != ''
|
||||
run: |
|
||||
gh pr edit "$PR_NUMBER" --body "$CHANGELOG"
|
||||
env:
|
||||
PR_NUMBER: ${{ steps.get_pr.outputs.pr_number }}
|
||||
CHANGELOG: ${{ steps.changelog.outputs.changelog }}
|
136
.github/workflows/release-with-dispatch.yml
vendored
Normal file
136
.github/workflows/release-with-dispatch.yml
vendored
Normal file
@@ -0,0 +1,136 @@
|
||||
name: "Release Manager [Dispatch]"
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
## Specify the type of the next release.
|
||||
#version_increment_type:
|
||||
# type: choice
|
||||
# description: 'VERSION INCREMENT TYPE'
|
||||
# default: 'patch'
|
||||
# required: false
|
||||
# options:
|
||||
# - 'major'
|
||||
# - 'minor'
|
||||
# - 'patch'
|
||||
merge:
|
||||
type: boolean
|
||||
description: 'MERGE RELEASE BRANCH TO MAIN'
|
||||
default: false
|
||||
start-rc:
|
||||
type: boolean
|
||||
description: 'Start Release Candidate'
|
||||
default: false
|
||||
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
get-pr:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
pr_number: ${{ steps.get_pr.outputs.pr_number }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
# headが$GITHUB_REF_NAME, baseが$STABLE_BRANCHかつopenのPRを1つ取得
|
||||
- name: Get PRs
|
||||
run: |
|
||||
echo "pr_number=$(gh pr list --limit 1 --search "head:$GITHUB_REF_NAME base:$STABLE_BRANCH is:open" --json number --jq '.[] | .number')" >> $GITHUB_OUTPUT
|
||||
id: get_pr
|
||||
env:
|
||||
STABLE_BRANCH: ${{ vars.STABLE_BRANCH }}
|
||||
|
||||
merge:
|
||||
uses: misskey-dev/release-manager-actions/.github/workflows/merge.yml@v2
|
||||
needs: get-pr
|
||||
if: ${{ needs.get-pr.outputs.pr_number != '' && inputs.merge == true }}
|
||||
with:
|
||||
pr_number: ${{ needs.get-pr.outputs.pr_number }}
|
||||
user: 'github-actions[bot]'
|
||||
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
|
||||
# Text to prepend to the changelog
|
||||
# The first line must be `## Unreleased`
|
||||
changes_template: |
|
||||
## Unreleased
|
||||
|
||||
### General
|
||||
-
|
||||
|
||||
### Client
|
||||
-
|
||||
|
||||
### Server
|
||||
-
|
||||
|
||||
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
|
||||
indent: ${{ vars.INDENT }}
|
||||
secrets:
|
||||
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
|
||||
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
|
||||
|
||||
create-prerelease:
|
||||
uses: misskey-dev/release-manager-actions/.github/workflows/create-prerelease.yml@v2
|
||||
needs: get-pr
|
||||
if: ${{ needs.get-pr.outputs.pr_number != '' && inputs.merge != true }}
|
||||
with:
|
||||
pr_number: ${{ needs.get-pr.outputs.pr_number }}
|
||||
user: 'github-actions[bot]'
|
||||
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
|
||||
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
|
||||
indent: ${{ vars.INDENT }}
|
||||
draft_prerelease_channel: alpha
|
||||
ready_start_prerelease_channel: beta
|
||||
prerelease_channel: ${{ inputs.start-rc && 'rc' || '' }}
|
||||
reset_number_on_channel_change: true
|
||||
secrets:
|
||||
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
|
||||
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
|
||||
|
||||
create-target:
|
||||
uses: misskey-dev/release-manager-actions/.github/workflows/create-target.yml@v2
|
||||
needs: get-pr
|
||||
if: ${{ needs.get-pr.outputs.pr_number == '' }}
|
||||
with:
|
||||
user: 'github-actions[bot]'
|
||||
# The script for version increment.
|
||||
# process.env.CURRENT_VERSION: The current version.
|
||||
#
|
||||
# Misskey calender versioning (yyyy.MM.patch) example
|
||||
version_increment_script: |
|
||||
const now = new Date();
|
||||
const year = now.toLocaleDateString('en-US', { year: 'numeric', timeZone: 'Asia/Tokyo' });
|
||||
const month = now.toLocaleDateString('en-US', { month: 'numeric', timeZone: 'Asia/Tokyo' });
|
||||
const [major, minor, _patch] = process.env.CURRENT_VERSION.split('.');
|
||||
const patch = Number(_patch.split('-')[0]);
|
||||
if (Number.isNaN(patch)) {
|
||||
console.error('Invalid patch version', year, month, process.env.CURRENT_VERSION, major, minor, _patch);
|
||||
throw new Error('Invalid patch version');
|
||||
}
|
||||
if (year !== major || month !== minor) {
|
||||
return `${year}.${month}.0`;
|
||||
} else {
|
||||
return `${major}.${minor}.${patch + 1}`;
|
||||
}
|
||||
##Semver example
|
||||
#version_increment_script: |
|
||||
# const [major, minor, patch] = process.env.CURRENT_VERSION.split('.');
|
||||
# if ("${{ inputs.version_increment_type }}" === "major") {
|
||||
# return `${Number(major) + 1}.0.0`;
|
||||
# } else if ("${{ inputs.version_increment_type }}" === "minor") {
|
||||
# return `${major}.${Number(minor) + 1}.0`;
|
||||
# } else {
|
||||
# return `${major}.${minor}.${Number(patch) + 1}`;
|
||||
# }
|
||||
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
|
||||
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
|
||||
indent: ${{ vars.INDENT }}
|
||||
stable_branch: ${{ vars.STABLE_BRANCH }}
|
||||
draft_prerelease_channel: alpha
|
||||
secrets:
|
||||
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
|
||||
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
|
104
.github/workflows/report-api-diff.yml
vendored
Normal file
104
.github/workflows/report-api-diff.yml
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
name: Report API Diff
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
types: [completed]
|
||||
workflows:
|
||||
- Get api.json from Misskey # get-api-diff.yml
|
||||
|
||||
jobs:
|
||||
compare-diff:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
||||
permissions:
|
||||
pull-requests: write
|
||||
|
||||
# api-artifact
|
||||
steps:
|
||||
- name: Download artifact
|
||||
uses: actions/github-script@v7.0.1
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
run_id: context.payload.workflow_run.id,
|
||||
});
|
||||
let matchArtifacts = allArtifacts.data.artifacts.filter((artifact) => {
|
||||
return artifact.name.startsWith("api-artifact-") || artifact.name == "api-artifact"
|
||||
});
|
||||
await Promise.all(matchArtifacts.map(async (artifact) => {
|
||||
let download = await github.rest.actions.downloadArtifact({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
artifact_id: artifact.id,
|
||||
archive_format: 'zip',
|
||||
});
|
||||
await fs.promises.writeFile(`${process.env.GITHUB_WORKSPACE}/${artifact.name}.zip`, Buffer.from(download.data));
|
||||
}));
|
||||
- name: Extract all artifacts
|
||||
run: |
|
||||
find . -mindepth 1 -maxdepth 1 -type f -name '*.zip' -exec unzip {} -d artifacts ';'
|
||||
ls -la
|
||||
- name: Load PR Number
|
||||
id: load-pr-num
|
||||
run: echo "pr-number=$(cat artifacts/pr_number)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Output base
|
||||
run: cat ./artifacts/api-base.json
|
||||
- name: Output head
|
||||
run: cat ./artifacts/api-head.json
|
||||
- name: Arrange json files
|
||||
run: |
|
||||
jq '.' ./artifacts/api-base.json > ./api-base.json
|
||||
jq '.' ./artifacts/api-head.json > ./api-head.json
|
||||
- name: Get diff of 2 files
|
||||
run: diff -u --label=base --label=head ./api-base.json ./api-head.json | cat > api.json.diff
|
||||
- name: Get full diff
|
||||
run: diff --label=base --label=head --new-line-format='+%L' --old-line-format='-%L' --unchanged-line-format=' %L' ./api-base.json ./api-head.json | cat > api-full.json.diff
|
||||
- name: Echo full diff
|
||||
run: cat ./api-full.json.diff
|
||||
- name: Upload full diff to Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: api-artifact
|
||||
path: |
|
||||
api-full.json.diff
|
||||
api-base.json
|
||||
api-head.json
|
||||
- id: out-diff
|
||||
name: Build diff Comment
|
||||
run: |
|
||||
HEADER="このPRによるapi.jsonの差分"
|
||||
FOOTER="[Get diff files from Workflow Page](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})"
|
||||
DIFF_BYTES="$(stat ./api.json.diff -c '%s' | tr -d '\n')"
|
||||
|
||||
echo "$HEADER" > ./output.md
|
||||
|
||||
if (( "$DIFF_BYTES" <= 1 )); then
|
||||
echo '差分はありません。' >> ./output.md
|
||||
else
|
||||
echo '<details>' >> ./output.md
|
||||
echo '<summary>差分はこちら</summary>' >> ./output.md
|
||||
echo >> ./output.md
|
||||
echo '```diff' >> ./output.md
|
||||
cat ./api.json.diff >> ./output.md
|
||||
echo '```' >> ./output.md
|
||||
echo '</details>' >> .output.md
|
||||
fi
|
||||
|
||||
echo "$FOOTER" >> ./output.md
|
||||
- uses: thollander/actions-comment-pull-request@v2
|
||||
with:
|
||||
pr_number: ${{ steps.load-pr-num.outputs.pr-number }}
|
||||
comment_tag: show_diff
|
||||
filePath: ./output.md
|
||||
- name: Tell error to PR
|
||||
uses: thollander/actions-comment-pull-request@v2
|
||||
if: failure() && steps.load-pr-num.outputs.pr-number
|
||||
with:
|
||||
pr_number: ${{ steps.load-pr-num.outputs.pr-number }}
|
||||
comment_tag: show_diff_error
|
||||
message: |
|
||||
api.jsonの差分作成中にエラーが発生しました。詳細は[Workflowのログ](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})を確認してください。
|
117
.github/workflows/storybook.yml
vendored
Normal file
117
.github/workflows/storybook.yml
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
name: Storybook
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
- dev/storybook8 # for testing
|
||||
pull_request_target:
|
||||
branches-ignore:
|
||||
# Since pull requests targets master mostly is the "develop" branch.
|
||||
# Storybook CI is checked on the "push" event of "develop" branch so it would cause a duplicate build.
|
||||
# This is a waste of chromatic build quota, so we don't run storybook CI on pull requests targets master.
|
||||
- master
|
||||
|
||||
jobs:
|
||||
build:
|
||||
# chromatic is not likely to be available for fork repositories, so we disable for fork repositories.
|
||||
if: github.repository == 'misskey-dev/misskey'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
env:
|
||||
NODE_OPTIONS: "--max_old_space_size=7168"
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
if: github.event_name != 'pull_request_target'
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: actions/checkout@v4.2.2
|
||||
if: github.event_name == 'pull_request_target'
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
ref: "refs/pull/${{ github.event.number }}/merge"
|
||||
- name: Checkout actual HEAD
|
||||
if: github.event_name == 'pull_request_target'
|
||||
id: rev
|
||||
run: |
|
||||
echo "base=$(git rev-list --parents -n1 HEAD | cut -d" " -f2)" >> $GITHUB_OUTPUT
|
||||
git checkout $(git rev-list --parents -n1 HEAD | cut -d" " -f3)
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Use Node.js 20.x
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Build misskey-js
|
||||
run: pnpm --filter misskey-js build
|
||||
- name: Build storybook
|
||||
run: pnpm --filter frontend build-storybook
|
||||
- name: Publish to Chromatic
|
||||
if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/master'
|
||||
run: pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static
|
||||
env:
|
||||
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
||||
- name: Publish to Chromatic
|
||||
if: github.event_name != 'pull_request_target' && github.ref != 'refs/heads/master'
|
||||
id: chromatic_push
|
||||
run: |
|
||||
DIFF="${{ github.event.before }} HEAD"
|
||||
if [ "$DIFF" = "0000000000000000000000000000000000000000 HEAD" ]; then
|
||||
DIFF="HEAD"
|
||||
fi
|
||||
CHROMATIC_PARAMETER="$(node packages/frontend/.storybook/changes.js $(git diff-tree --no-commit-id --name-only -r $(echo "$DIFF") | xargs))"
|
||||
if [ "$CHROMATIC_PARAMETER" = " --skip" ]; then
|
||||
echo "skip=true" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
if pnpm --filter frontend chromatic -d storybook-static $(echo "$CHROMATIC_PARAMETER"); then
|
||||
echo "success=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "success=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
env:
|
||||
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
||||
- name: Publish to Chromatic
|
||||
if: github.event_name == 'pull_request_target'
|
||||
id: chromatic_pull_request
|
||||
run: |
|
||||
DIFF="${{ steps.rev.outputs.base }} HEAD"
|
||||
if [ "$DIFF" = "0000000000000000000000000000000000000000 HEAD" ]; then
|
||||
DIFF="HEAD"
|
||||
fi
|
||||
CHROMATIC_PARAMETER="$(node packages/frontend/.storybook/changes.js $(git diff-tree --no-commit-id --name-only -r $(echo "$DIFF") | xargs))"
|
||||
if [ "$CHROMATIC_PARAMETER" = " --skip" ]; then
|
||||
echo "skip=true" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
BRANCH="${{ github.event.pull_request.head.user.login }}:$HEAD_REF"
|
||||
if [ "$BRANCH" = "misskey-dev:$HEAD_REF" ]; then
|
||||
BRANCH="$HEAD_REF"
|
||||
fi
|
||||
pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static --branch-name "$BRANCH" $(echo "$CHROMATIC_PARAMETER")
|
||||
env:
|
||||
HEAD_REF: ${{ github.event.pull_request.head.ref }}
|
||||
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
||||
- name: Notify that Chromatic detects changes
|
||||
uses: actions/github-script@v7.0.1
|
||||
if: github.event_name != 'pull_request_target' && steps.chromatic_push.outputs.success == 'false'
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
github.rest.repos.createCommitComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
commit_sha: context.sha,
|
||||
body: 'Chromatic detects changes. Please [review the changes on Chromatic](https://www.chromatic.com/builds?appId=6428f7d7b962f0b79f97d6e4).'
|
||||
})
|
||||
- name: Upload Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: storybook
|
||||
path: packages/frontend/storybook-static
|
100
.github/workflows/test-backend.yml
vendored
100
.github/workflows/test-backend.yml
vendored
@@ -5,19 +5,31 @@ on:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
paths:
|
||||
- packages/backend/**
|
||||
# for permissions
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/test-backend.yml
|
||||
- .github/misskey/test.yml
|
||||
pull_request:
|
||||
|
||||
paths:
|
||||
- packages/backend/**
|
||||
# for permissions
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/test-backend.yml
|
||||
- .github/misskey/test.yml
|
||||
jobs:
|
||||
jest:
|
||||
unit:
|
||||
name: Unit tests (backend)
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.5.1]
|
||||
node-version: [22.11.0]
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:13
|
||||
image: postgres:15
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
@@ -29,20 +41,31 @@ jobs:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Install FFmpeg
|
||||
run: |
|
||||
for i in {1..3}; do
|
||||
echo "Attempt $i: Installing FFmpeg..."
|
||||
curl -s -L https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz -o ffmpeg.tar.xz && \
|
||||
tar -xf ffmpeg.tar.xz && \
|
||||
mv ffmpeg-*-static/ffmpeg /usr/local/bin/ && \
|
||||
mv ffmpeg-*-static/ffprobe /usr/local/bin/ && \
|
||||
rm -rf ffmpeg.tar.xz ffmpeg-*-static/ && \
|
||||
break || sleep 10
|
||||
if [ $i -eq 3 ]; then
|
||||
echo "Failed to install FFmpeg after 3 attempts"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3.8.1
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'pnpm'
|
||||
- run: corepack enable
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
@@ -51,9 +74,56 @@ jobs:
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
- name: Test
|
||||
run: pnpm jest-and-coverage
|
||||
- name: Upload Coverage
|
||||
uses: codecov/codecov-action@v3
|
||||
run: pnpm --filter backend test-and-coverage
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
files: ./packages/backend/coverage/coverage-final.json
|
||||
|
||||
e2e:
|
||||
name: E2E tests (backend)
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [22.11.0]
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:15
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
POSTGRES_DB: test-misskey
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
redis:
|
||||
image: redis:7
|
||||
ports:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'pnpm'
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Copy Configure
|
||||
run: cp .github/misskey/test.yml .config
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
- name: Test
|
||||
run: pnpm --filter backend test-and-coverage:e2e
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
files: ./packages/backend/coverage/coverage-final.json
|
||||
|
88
.github/workflows/test-federation.yml
vendored
Normal file
88
.github/workflows/test-federation.yml
vendored
Normal file
@@ -0,0 +1,88 @@
|
||||
name: Test (federation)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
paths:
|
||||
- packages/backend/**
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/test-federation.yml
|
||||
pull_request:
|
||||
paths:
|
||||
- packages/backend/**
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/test-federation.yml
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Federation test
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [22.11.0]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Install FFmpeg
|
||||
run: |
|
||||
for i in {1..3}; do
|
||||
echo "Attempt $i: Installing FFmpeg..."
|
||||
curl -s -L https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz -o ffmpeg.tar.xz && \
|
||||
tar -xf ffmpeg.tar.xz && \
|
||||
mv ffmpeg-*-static/ffmpeg /usr/local/bin/ && \
|
||||
mv ffmpeg-*-static/ffprobe /usr/local/bin/ && \
|
||||
rm -rf ffmpeg.tar.xz ffmpeg-*-static/ && \
|
||||
break || sleep 10
|
||||
if [ $i -eq 3 ]; then
|
||||
echo "Failed to install FFmpeg after 3 attempts"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'pnpm'
|
||||
- name: Build Misskey
|
||||
run: |
|
||||
pnpm i --frozen-lockfile
|
||||
pnpm build
|
||||
- name: Setup
|
||||
run: |
|
||||
cd packages/backend/test-federation
|
||||
bash ./setup.sh
|
||||
sudo chmod 644 ./certificates/*.test.key
|
||||
- name: Start servers
|
||||
id: start_servers
|
||||
continue-on-error: true
|
||||
# https://github.com/docker/compose/issues/1294#issuecomment-374847206
|
||||
run: |
|
||||
cd packages/backend/test-federation
|
||||
docker compose up -d --scale tester=0
|
||||
- name: Print start_servers error
|
||||
if: ${{ steps.start_servers.outcome == 'failure' }}
|
||||
run: |
|
||||
cd packages/backend/test-federation
|
||||
docker compose logs | tail -n 300
|
||||
exit 1
|
||||
- name: Test
|
||||
id: test
|
||||
continue-on-error: true
|
||||
run: |
|
||||
cd packages/backend/test-federation
|
||||
docker compose run --no-deps tester
|
||||
- name: Log
|
||||
if: ${{ steps.test.outcome == 'failure' }}
|
||||
run: |
|
||||
cd packages/backend/test-federation
|
||||
docker compose logs
|
||||
exit 1
|
||||
- name: Stop servers
|
||||
run: |
|
||||
cd packages/backend/test-federation
|
||||
docker compose down
|
56
.github/workflows/test-frontend.yml
vendored
56
.github/workflows/test-frontend.yml
vendored
@@ -5,31 +5,43 @@ on:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
paths:
|
||||
- packages/frontend/**
|
||||
# for permissions
|
||||
- packages/misskey-js/**
|
||||
# for e2e
|
||||
- packages/backend/**
|
||||
- .github/workflows/test-frontend.yml
|
||||
- .github/misskey/test.yml
|
||||
pull_request:
|
||||
|
||||
paths:
|
||||
- packages/frontend/**
|
||||
# for permissions
|
||||
- packages/misskey-js/**
|
||||
# for e2e
|
||||
- packages/backend/**
|
||||
- .github/workflows/test-frontend.yml
|
||||
- .github/misskey/test.yml
|
||||
jobs:
|
||||
vitest:
|
||||
name: Unit tests (frontend)
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.5.1]
|
||||
node-version: [22.11.0]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3.8.1
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'pnpm'
|
||||
- run: corepack enable
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
@@ -40,23 +52,24 @@ jobs:
|
||||
- name: Test
|
||||
run: pnpm --filter frontend test-and-coverage
|
||||
- name: Upload Coverage
|
||||
uses: codecov/codecov-action@v3
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
files: ./packages/frontend/coverage/coverage-final.json
|
||||
|
||||
e2e:
|
||||
name: E2E tests (frontend)
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
node-version: [20.5.1]
|
||||
node-version: [22.11.0]
|
||||
browser: [chrome]
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:13
|
||||
image: postgres:15
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
@@ -68,7 +81,7 @@ jobs:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
submodules: true
|
||||
# https://github.com/cypress-io/cypress-docker-images/issues/150
|
||||
@@ -77,17 +90,13 @@ jobs:
|
||||
# if: ${{ matrix.browser == 'firefox' }}
|
||||
#- uses: browser-actions/setup-firefox@latest
|
||||
# if: ${{ matrix.browser == 'firefox' }}
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 7
|
||||
run_install: false
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3.8.1
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'pnpm'
|
||||
- run: corepack enable
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Copy Configure
|
||||
run: cp .github/misskey/test.yml .config
|
||||
@@ -102,18 +111,19 @@ jobs:
|
||||
run: pnpm exec cypress install
|
||||
- name: Cypress run
|
||||
uses: cypress-io/github-action@v6
|
||||
timeout-minutes: 15
|
||||
with:
|
||||
install: false
|
||||
start: pnpm start:test
|
||||
wait-on: 'http://localhost:61812'
|
||||
headed: true
|
||||
browser: ${{ matrix.browser }}
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v4
|
||||
if: failure()
|
||||
with:
|
||||
name: ${{ matrix.browser }}-cypress-screenshots
|
||||
path: cypress/screenshots
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: ${{ matrix.browser }}-cypress-videos
|
||||
|
19
.github/workflows/test-misskey-js.yml
vendored
19
.github/workflows/test-misskey-js.yml
vendored
@@ -6,27 +6,34 @@ name: Test (misskey.js)
|
||||
on:
|
||||
push:
|
||||
branches: [ develop ]
|
||||
paths:
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/test-misskey-js.yml
|
||||
pull_request:
|
||||
branches: [ develop ]
|
||||
|
||||
paths:
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/test-misskey-js.yml
|
||||
jobs:
|
||||
test:
|
||||
name: Unit tests (misskey.js)
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.5.1]
|
||||
node-version: [22.11.0]
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.1.1
|
||||
uses: actions/checkout@v4.2.2
|
||||
|
||||
- run: corepack enable
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
|
||||
- name: Setup Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3.8.1
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'pnpm'
|
||||
@@ -46,7 +53,7 @@ jobs:
|
||||
CI: true
|
||||
|
||||
- name: Upload Coverage
|
||||
uses: codecov/codecov-action@v3
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
files: ./packages/misskey-js/coverage/coverage-final.json
|
||||
|
15
.github/workflows/test-production.yml
vendored
15
.github/workflows/test-production.yml
vendored
@@ -12,27 +12,24 @@ env:
|
||||
|
||||
jobs:
|
||||
production:
|
||||
name: Production build
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.5.1]
|
||||
node-version: [22.11.0]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
run_install: false
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3.8.1
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'pnpm'
|
||||
- run: corepack enable
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
|
44
.github/workflows/validate-api-json.yml
vendored
Normal file
44
.github/workflows/validate-api-json.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
name: api.json validation
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
paths:
|
||||
- packages/backend/**
|
||||
- .github/workflows/validate-api-json.yml
|
||||
pull_request:
|
||||
paths:
|
||||
- packages/backend/**
|
||||
- .github/workflows/validate-api-json.yml
|
||||
jobs:
|
||||
validate-api-json:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [22.11.0]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'pnpm'
|
||||
- name: Install Redocly CLI
|
||||
run: npm i -g @redocly/cli
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Copy Configure
|
||||
run: cp .config/example.yml .config/default.yml
|
||||
- name: Build and generate
|
||||
run: pnpm build && pnpm --filter backend generate-api-json
|
||||
- name: Validation
|
||||
run: npx @redocly/cli lint --extends=minimal ./packages/backend/built/api.json
|
15
.gitignore
vendored
15
.gitignore
vendored
@@ -35,12 +35,17 @@ coverage
|
||||
!/.config/example.yml
|
||||
!/.config/docker_example.yml
|
||||
!/.config/docker_example.env
|
||||
!/.config/cypress-devcontainer.yml
|
||||
docker-compose.yml
|
||||
!/.devcontainer/docker-compose.yml
|
||||
./compose.yml
|
||||
.devcontainer/compose.yml
|
||||
!/.devcontainer/compose.yml
|
||||
|
||||
# misskey
|
||||
/build
|
||||
built
|
||||
built-test
|
||||
js-built
|
||||
/data
|
||||
/.cache-loader
|
||||
/db
|
||||
@@ -57,6 +62,14 @@ api-docs.json
|
||||
ormconfig.json
|
||||
temp
|
||||
/packages/frontend/src/**/*.stories.ts
|
||||
tsdoc-metadata.json
|
||||
misskey-assets
|
||||
|
||||
# Vite temporary files
|
||||
vite.config.js.timestamp-*
|
||||
vite.config.ts.timestamp-*
|
||||
vite.config.local-dev.js.timestamp-*
|
||||
vite.config.local-dev.ts.timestamp-*
|
||||
|
||||
# blender backups
|
||||
*.blend1
|
||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,6 +1,3 @@
|
||||
[submodule "misskey-assets"]
|
||||
path = misskey-assets
|
||||
url = https://github.com/misskey-dev/assets.git
|
||||
[submodule "fluent-emojis"]
|
||||
path = fluent-emojis
|
||||
url = https://github.com/misskey-dev/emojis.git
|
||||
|
@@ -1 +1 @@
|
||||
20.5.1
|
||||
22.11.0
|
||||
|
3
.npmrc
Normal file
3
.npmrc
Normal file
@@ -0,0 +1,3 @@
|
||||
engine-strict = true
|
||||
save-exact = true
|
||||
shell-emulator = true
|
2
.vscode/extensions.json
vendored
2
.vscode/extensions.json
vendored
@@ -3,9 +3,7 @@
|
||||
"editorconfig.editorconfig",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"Vue.volar",
|
||||
"Vue.vscode-typescript-vue-plugin",
|
||||
"Orta.vscode-jest",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"mrmlnc.vscode-json5"
|
||||
]
|
||||
}
|
||||
|
24
.vscode/settings.json
vendored
24
.vscode/settings.json
vendored
@@ -1,11 +1,15 @@
|
||||
{
|
||||
"search.exclude": {
|
||||
"**/node_modules": true
|
||||
},
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"files.associations": {
|
||||
"*.test.ts": "typescript"
|
||||
},
|
||||
"jest.jestCommandLine": "pnpm run jest",
|
||||
"jest.autoRun": "off"
|
||||
}
|
||||
"search.exclude": {
|
||||
"**/node_modules": true
|
||||
},
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"files.associations": {
|
||||
"*.test.ts": "typescript"
|
||||
},
|
||||
"jest.jestCommandLine": "pnpm run jest",
|
||||
"jest.runMode": "on-demand",
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll": "explicit"
|
||||
},
|
||||
"editor.formatOnSave": false
|
||||
}
|
||||
|
1035
CHANGELOG.md
1035
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
@@ -2,45 +2,131 @@
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, caste, color, religion, or sexual
|
||||
identity and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment include:
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the overall
|
||||
community
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* The use of sexualized language or imagery, and sexual attention or advances of
|
||||
any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
* Publishing others' private information, such as a physical or email address,
|
||||
without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at syuilotan@yahoo.co.jp. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
<syuilotan@yahoo.co.jp>.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series of
|
||||
actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or permanent
|
||||
ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within the
|
||||
community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.1, available at
|
||||
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
||||
Community Impact Guidelines were inspired by
|
||||
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
|
||||
[https://www.contributor-covenant.org/translations][translations].
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
||||
[Mozilla CoC]: https://github.com/mozilla/diversity
|
||||
[FAQ]: https://www.contributor-covenant.org/faq
|
||||
[translations]: https://www.contributor-covenant.org/translations
|
||||
|
303
CONTRIBUTING.md
303
CONTRIBUTING.md
@@ -1,7 +1,7 @@
|
||||
# Contribution guide
|
||||
We're glad you're interested in contributing Misskey! In this document you will find the information you need to contribute to the project.
|
||||
|
||||
> **Note**
|
||||
> [!NOTE]
|
||||
> This project uses Japanese as its major language, **but you do not need to translate and write the Issues/PRs in Japanese.**
|
||||
> Also, you might receive comments on your Issue/PR in Japanese, but you do not need to reply to them in Japanese as well.\
|
||||
> The accuracy of machine translation into Japanese is not high, so it will be easier for us to understand if you write it in the original language.
|
||||
@@ -15,18 +15,33 @@ Before creating an issue, please check the following:
|
||||
- To avoid duplication, please search for similar issues before creating a new issue.
|
||||
- Do not use Issues to ask questions or troubleshooting.
|
||||
- Issues should only be used to feature requests, suggestions, and bug tracking.
|
||||
- Please ask questions or troubleshooting in ~~the [Misskey Forum](https://forum.misskey.io/)~~ [GitHub Discussions](https://github.com/misskey-dev/misskey/discussions) or [Discord](https://discord.gg/Wp8gVStHW3).
|
||||
- Please ask questions or troubleshooting in [GitHub Discussions](https://github.com/misskey-dev/misskey/discussions) or [Discord](https://discord.gg/Wp8gVStHW3).
|
||||
|
||||
> **Warning**
|
||||
> [!WARNING]
|
||||
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
|
||||
|
||||
## Before implementation
|
||||
### Recommended discussing before implementation
|
||||
We welcome your proposal.
|
||||
|
||||
When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented.
|
||||
|
||||
At this point, you also need to clarify the goals of the PR you will create, and make sure that the other members of the team are aware of them.
|
||||
PRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review.
|
||||
|
||||
Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work.
|
||||
Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask Committer to assign you).
|
||||
By expressing your intention to work on the Issue, you can prevent conflicts in the work.
|
||||
|
||||
To the Committers: you should not assign someone on it before the Final Decision.
|
||||
|
||||
### How issues are triaged
|
||||
|
||||
The Committers may:
|
||||
* close an issue that is not reproducible on latest stable release,
|
||||
* merge an issue into another issue,
|
||||
* split an issue into multiple issues,
|
||||
* or re-open that has been closed for some reason which is not applicable anymore.
|
||||
|
||||
@syuilo reserves the Final Decision rights including whether the project will implement feature and how to implement, these rights are not always exercised.
|
||||
|
||||
## Well-known branches
|
||||
- **`master`** branch is tracking the latest release and used for production purposes.
|
||||
@@ -37,25 +52,45 @@ Also, when you start implementation, assign yourself to the Issue (if you cannot
|
||||
## Creating a PR
|
||||
Thank you for your PR! Before creating a PR, please check the following:
|
||||
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
|
||||
- `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc
|
||||
- Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
|
||||
- `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc
|
||||
- Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
|
||||
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text.
|
||||
- Please add the summary of the changes to [`CHANGELOG.md`](/CHANGELOG.md). However, this is not necessary for changes that do not affect the users, such as refactoring.
|
||||
- Check if there are any documents that need to be created or updated due to this change.
|
||||
- If you have added a feature or fixed a bug, please add a test case if possible.
|
||||
- Please make sure that tests and Lint are passed in advance.
|
||||
- You can run it with `pnpm test` and `pnpm lint`. [See more info](#testing)
|
||||
- You can run it with `pnpm test` and `pnpm lint`. [See more info](#testing)
|
||||
- If this PR includes UI changes, please attach a screenshot in the text.
|
||||
|
||||
Thanks for your cooperation 🤗
|
||||
|
||||
### Additional things for ActivityPub payload changes
|
||||
*This section is specific to misskey-dev implementation. Other fork or implementation may take different way. A significant difference is that non-"misskey-dev" extension is not described in the misskey-hub's document.*
|
||||
|
||||
If PR includes changes to ActivityPub payload, please reflect it in [misskey-hub's document](https://github.com/misskey-dev/misskey-hub-next/blob/master/content/ns.md) by sending PR.
|
||||
|
||||
The name of purporsed extension property (referred as "extended property" in later) to ActivityPub shall be prefixed by `_misskey_`. (i.e. `_misskey_quote`)
|
||||
|
||||
The extended property in `packages/backend/src/core/activitypub/type.ts` **must** be declared as optional because ActivityPub payloads that comes from older Misskey or other implementation may not contain it.
|
||||
|
||||
The extended property must be included in the context definition. Context is defined in `packages/backend/src/core/activitypub/misc/contexts.ts`.
|
||||
The key shall be same as the name of extended property, and the value shall be same as "short IRI".
|
||||
|
||||
"Short IRI" is defined in misskey-hub's document, but usually takes form of `misskey:<name of extended property>`. (i.e. `misskey:_misskey_quote`)
|
||||
|
||||
One should not add property that has defined before by other implementation, or add custom variant value to "well-known" property.
|
||||
|
||||
## Reviewers guide
|
||||
Be willing to comment on the good points and not just the things you want fixed 💯
|
||||
|
||||
読んでおくといいやつ
|
||||
- https://blog.lacolaco.net/posts/1e2cf439b3c2/
|
||||
- https://konifar-zatsu.hatenadiary.jp/entry/2024/11/05/192421
|
||||
|
||||
### Review perspective
|
||||
- Scope
|
||||
- Are the goals of the PR clear?
|
||||
- Is the granularity of the PR appropriate?
|
||||
- Are the goals of the PR clear?
|
||||
- Is the granularity of the PR appropriate?
|
||||
- Security
|
||||
- Does merging this PR create a vulnerability?
|
||||
- Performance
|
||||
@@ -66,6 +101,22 @@ Be willing to comment on the good points and not just the things you want fixed
|
||||
- Are there any omissions or gaps?
|
||||
- Does it check for anomalies?
|
||||
|
||||
## Security Advisory
|
||||
### For reporter
|
||||
Thank you for your reporting!
|
||||
|
||||
If you can also create a patch to fix the vulnerability, please create a PR on the private fork.
|
||||
|
||||
> [!note]
|
||||
> There is a GitHub bug that prevents merging if a PR not following the develop branch of upstream, so please keep follow the develop branch.
|
||||
|
||||
### For misskey-dev member
|
||||
修正PRがdevelopに追従されていないとマージできないので、マージできなかったら
|
||||
|
||||
> Could you merge or rebase onto upstream develop branch?
|
||||
|
||||
などと伝える。
|
||||
|
||||
## Deploy
|
||||
The `/deploy` command by issue comment can be used to deploy the contents of a PR to the preview environment.
|
||||
```
|
||||
@@ -77,7 +128,7 @@ An actual domain will be assigned so you can test the federation.
|
||||
|
||||
## Release
|
||||
### Release Instructions
|
||||
1. Commit version changes in the `develop` branch ([package.json](https://github.com/misskey-dev/misskey/blob/develop/package.json))
|
||||
1. Commit version changes in the `develop` branch ([package.json](package.json))
|
||||
2. Create a release PR.
|
||||
- Into `master` from `develop` branch.
|
||||
- The title must be in the format `Release: x.y.z`.
|
||||
@@ -88,7 +139,7 @@ An actual domain will be assigned so you can test the federation.
|
||||
- The target branch must be `master`
|
||||
- The tag name must be the version
|
||||
|
||||
> **Note**
|
||||
> [!NOTE]
|
||||
> Why this instruction is necessary:
|
||||
> - To perform final QA checks
|
||||
> - To distribute responsibility
|
||||
@@ -101,26 +152,30 @@ You can improve our translations with your Crowdin account.
|
||||
Your changes in Crowdin are automatically submitted as a PR (with the title "New Crowdin translations") to the repository.
|
||||
The owner [@syuilo](https://github.com/syuilo) merges the PR into the develop branch before the next release.
|
||||
|
||||
If your language is not listed in Crowdin, please open an issue.
|
||||
If your language is not listed in Crowdin, please open an issue. We will add it to Crowdin.
|
||||
For newly added languages, once the translation progress per language exceeds 70%, it will be officially introduced into Misskey and made available to users.
|
||||
|
||||

|
||||
|
||||
## Development
|
||||
During development, it is useful to use the
|
||||
### Setup
|
||||
Before developing, you have to set up environment. Misskey requires Redis, PostgreSQL, and FFmpeg.
|
||||
|
||||
```
|
||||
pnpm dev
|
||||
```
|
||||
You would want to install Meilisearch to experiment related features. Technically, meilisearch is not strict requirement, but some features and tests require it.
|
||||
|
||||
command.
|
||||
There are a few ways to proceed.
|
||||
|
||||
- Server-side source files and automatically builds them if they are modified. Automatically start the server process(es).
|
||||
- Vite HMR (just the `vite` command) is available. The behavior may be different from production.
|
||||
- Service Worker is watched by esbuild.
|
||||
#### Use system-wide software
|
||||
You could install them in system-wide (such as from package manager).
|
||||
|
||||
#### Use `docker compose`
|
||||
You could obtain middleware container by typing `docker compose -f $PROJECT_ROOT/compose.local-db.yml up -d`.
|
||||
|
||||
#### Use Devcontainer
|
||||
Devcontainer also has necessary setting. This method can be done by connecting from VSCode.
|
||||
|
||||
### Dev Container
|
||||
Instead of running `pnpm` locally, you can use Dev Container to set up your development environment.
|
||||
To use Dev Container, open the project directory on VSCode with Dev Containers installed.
|
||||
To use Dev Container, open the project directory on VSCode with Dev Containers installed.
|
||||
**Note:** If you are using Windows, please clone the repository with WSL. Using Git for Windows will result in broken files due to the difference in how newlines are handled.
|
||||
|
||||
It will run the following command automatically inside the container.
|
||||
@@ -132,38 +187,61 @@ pnpm build
|
||||
pnpm migrate
|
||||
```
|
||||
|
||||
After finishing the migration, run the `pnpm dev` command to start the development server.
|
||||
After finishing the migration, you can proceed.
|
||||
|
||||
``` bash
|
||||
### Start developing
|
||||
During development, it is useful to use the
|
||||
```
|
||||
pnpm dev
|
||||
```
|
||||
command.
|
||||
|
||||
- Server-side source files and automatically builds them if they are modified. Automatically start the server process(es).
|
||||
- Service Worker is watched by esbuild.
|
||||
- Vite HMR (just the `vite` command) is available. The behavior may be different from production.
|
||||
- Vite runs behind the backend (the backend will proxy Vite at /vite and /embed_vite except for websocket used for HMR).
|
||||
- You can see Misskey by accessing `http://localhost:3000` (Replace `3000` with the port configured with `port` in .config/default.yml).
|
||||
|
||||
## Testing
|
||||
- Test codes are located in [`/packages/backend/test`](/packages/backend/test).
|
||||
|
||||
### Run test
|
||||
Create a config file.
|
||||
You can run non-backend tests by executing following commands:
|
||||
```sh
|
||||
pnpm --filter frontend test
|
||||
pnpm --filter misskey-js test
|
||||
```
|
||||
|
||||
Backend tests require manual preparation of servers. See the next section for more on this.
|
||||
|
||||
### Backend
|
||||
There are three types of test codes for the backend:
|
||||
- Unit tests: [`/packages/backend/test/unit`](/packages/backend/test/unit)
|
||||
- Single-server E2E tests: [`/packages/backend/test/e2e`](/packages/backend/test/e2e)
|
||||
- Multiple-server E2E tests: [`/packages/backend/test-federation`](/packages/backend/test-federation)
|
||||
|
||||
#### Running Unit Tests or Single-server E2E Tests
|
||||
1. Create a config file:
|
||||
```sh
|
||||
cp .github/misskey/test.yml .config/
|
||||
```
|
||||
Prepare DB/Redis for testing.
|
||||
```
|
||||
docker compose -f packages/backend/test/docker-compose.yml up
|
||||
```
|
||||
Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
|
||||
|
||||
Run all test.
|
||||
2. Start DB and Redis servers for testing:
|
||||
```sh
|
||||
docker compose -f packages/backend/test/compose.yml up
|
||||
```
|
||||
pnpm test
|
||||
Instead, you can prepare an empty (data can be erased) DB and edit `.config/test.yml` appropriately.
|
||||
|
||||
3. Run all tests:
|
||||
```sh
|
||||
pnpm --filter backend test # unit tests
|
||||
pnpm --filter backend test:e2e # single-server E2E tests
|
||||
```
|
||||
If you want to run a specific test, run as a following command:
|
||||
```sh
|
||||
pnpm --filter backend test -- packages/backend/test/unit/activitypub.ts
|
||||
pnpm --filter backend test:e2e -- packages/backend/test/e2e/nodeinfo.ts
|
||||
```
|
||||
|
||||
#### Run specify test
|
||||
```
|
||||
pnpm jest -- foo.ts
|
||||
```
|
||||
|
||||
### e2e tests
|
||||
TODO
|
||||
#### Running Multiple-server E2E Tests
|
||||
See [`/packages/backend/test-federation/README.md`](/packages/backend/test-federation/README.md).
|
||||
|
||||
## Environment Variable
|
||||
|
||||
@@ -187,7 +265,7 @@ niraxは、Misskeyで使用しているオリジナルのフロントエンド
|
||||
### ルート定義
|
||||
ルート定義は、以下の形式のオブジェクトの配列です。
|
||||
|
||||
``` ts
|
||||
```ts
|
||||
{
|
||||
name?: string;
|
||||
path: string;
|
||||
@@ -200,7 +278,7 @@ niraxは、Misskeyで使用しているオリジナルのフロントエンド
|
||||
}
|
||||
```
|
||||
|
||||
> **Warning**
|
||||
> [!WARNING]
|
||||
> 現状、ルートは定義された順に評価されます。
|
||||
> たとえば、`/foo/:id`ルート定義の次に`/foo/bar`ルート定義がされていた場合、後者がマッチすることはありません。
|
||||
|
||||
@@ -262,7 +340,7 @@ export const Default = {
|
||||
parameters: {
|
||||
layout: 'centered',
|
||||
},
|
||||
} satisfies StoryObj<typeof MkAvatar>;
|
||||
} satisfies StoryObj<typeof MyComponent>;
|
||||
```
|
||||
|
||||
If you want to opt-out from the automatic generation, create a `MyComponent.stories.impl.ts` file and add the following line to the file.
|
||||
@@ -282,24 +360,115 @@ export const argTypes = {
|
||||
min: 1,
|
||||
max: 4,
|
||||
},
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
Also, you can use msw to mock API requests in the storybook. Creating a `MyComponent.stories.msw.ts` file to define the mock handlers.
|
||||
|
||||
```ts
|
||||
import { rest } from 'msw';
|
||||
import { HttpResponse, http } from 'msw';
|
||||
export const handlers = [
|
||||
rest.post('/api/notes/timeline', (req, res, ctx) => {
|
||||
return res(
|
||||
ctx.json([]),
|
||||
);
|
||||
http.post('/api/notes/timeline', ({ request }) => {
|
||||
return HttpResponse.json([]);
|
||||
}),
|
||||
];
|
||||
```
|
||||
|
||||
Don't forget to re-run the `.storybook/generate.js` script after adding, editing, or removing the above files.
|
||||
|
||||
## Nest
|
||||
|
||||
### Nest Service Circular dependency / Nestでサービスの循環参照でエラーが起きた場合
|
||||
|
||||
#### forwardRef
|
||||
まずは簡単に`forwardRef`を試してみる
|
||||
|
||||
```typescript
|
||||
export class FooService {
|
||||
constructor(
|
||||
@Inject(forwardRef(() => BarService))
|
||||
private barService: BarService
|
||||
) {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### OnModuleInit
|
||||
できなければ`OnModuleInit`を使う
|
||||
|
||||
```typescript
|
||||
import { Injectable, OnModuleInit } from '@nestjs/common';
|
||||
import { ModuleRef } from '@nestjs/core';
|
||||
import { BarService } from '@/core/BarService';
|
||||
|
||||
@Injectable()
|
||||
export class FooService implements OnModuleInit {
|
||||
private barService: BarService // constructorから移動してくる
|
||||
|
||||
constructor(
|
||||
private moduleRef: ModuleRef,
|
||||
) {
|
||||
}
|
||||
|
||||
async onModuleInit() {
|
||||
this.barService = this.moduleRef.get(BarService.name);
|
||||
}
|
||||
|
||||
public async niceMethod() {
|
||||
return await this.barService.incredibleMethod({ hoge: 'fuga' });
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##### Service Unit Test
|
||||
テストで`onModuleInit`を呼び出す必要がある
|
||||
|
||||
```typescript
|
||||
// import ...
|
||||
|
||||
describe('test', () => {
|
||||
let app: TestingModule;
|
||||
let fooService: FooService; // for test case
|
||||
let barService: BarService; // for test case
|
||||
|
||||
beforeEach(async () => {
|
||||
app = await Test.createTestingModule({
|
||||
imports: ...,
|
||||
providers: [
|
||||
FooService,
|
||||
{ // mockする (mockは必須ではないかもしれない)
|
||||
provide: BarService,
|
||||
useFactory: () => ({
|
||||
incredibleMethod: jest.fn(),
|
||||
}),
|
||||
},
|
||||
{ // Provideにする
|
||||
provide: BarService.name,
|
||||
useExisting: BarService,
|
||||
},
|
||||
],
|
||||
})
|
||||
.useMocker(...
|
||||
.compile();
|
||||
|
||||
fooService = app.get<FooService>(FooService);
|
||||
barService = app.get<BarService>(BarService) as jest.Mocked<BarService>;
|
||||
|
||||
// onModuleInitを実行する
|
||||
await fooService.onModuleInit();
|
||||
});
|
||||
|
||||
test('nice', () => {
|
||||
await fooService.niceMethod();
|
||||
|
||||
expect(barService.incredibleMethod).toHaveBeenCalled();
|
||||
expect(barService.incredibleMethod.mock.lastCall![0])
|
||||
.toEqual({ hoge: 'fuga' });
|
||||
});
|
||||
})
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
### Misskeyのドメイン固有の概念は`Mi`をprefixする
|
||||
@@ -307,6 +476,11 @@ Don't forget to re-run the `.storybook/generate.js` script after adding, editing
|
||||
コード上でMisskeyのドメイン固有の概念には`Mi`をprefixすることで、他のドメインの同様の概念と区別できるほか、名前の衝突を防ぐ。
|
||||
ただし、文脈上Misskeyのものを指すことが明らかであり、名前の衝突の恐れがない場合は、一時的なローカル変数に限って`Mi`を省略してもよい。
|
||||
|
||||
### Misskey.jsの型生成
|
||||
```bash
|
||||
pnpm build-misskey-js-with-types
|
||||
```
|
||||
|
||||
### How to resolve conflictions occurred at pnpm-lock.yaml?
|
||||
|
||||
Just execute `pnpm` to fix it.
|
||||
@@ -403,13 +577,13 @@ pnpm dlx typeorm migration:generate -d ormconfig.js -o <migration name>
|
||||
- 作成されたスクリプトは不必要な変更を含むため除去してください
|
||||
|
||||
### JSON SchemaのobjectでanyOfを使うとき
|
||||
JSON Schemaで、objectに対してanyOfを使う場合、anyOfの中でpropertiesを定義しないこと。
|
||||
バリデーションが効かないため。(SchemaTypeもそのように作られており、objectのanyOf内のpropertiesは捨てられます)
|
||||
JSON Schemaで、objectに対してanyOfを使う場合、anyOfの中でpropertiesを定義しないこと。
|
||||
バリデーションが効かないため。(SchemaTypeもそのように作られており、objectのanyOf内のpropertiesは捨てられます)
|
||||
https://github.com/misskey-dev/misskey/pull/10082
|
||||
|
||||
テキストhogeおよびfugaについて、片方を必須としつつ両方の指定もありうる場合:
|
||||
|
||||
```
|
||||
```ts
|
||||
export const paramDef = {
|
||||
type: 'object',
|
||||
properties: {
|
||||
@@ -439,3 +613,24 @@ marginはそのコンポーネントを使う側が設定する
|
||||
|
||||
### indexというファイル名を使うな
|
||||
ESMではディレクトリインポートは廃止されているのと、ディレクトリインポートせずともファイル名が index だと何故か一部のライブラリ?でディレクトリインポートだと見做されてエラーになる
|
||||
|
||||
## CSS Recipe
|
||||
|
||||
### Lighten CSS vars
|
||||
|
||||
``` css
|
||||
color: hsl(from var(--MI_THEME-accent) h s calc(l + 10));
|
||||
```
|
||||
|
||||
### Darken CSS vars
|
||||
|
||||
``` css
|
||||
color: hsl(from var(--MI_THEME-accent) h s calc(l - 10));
|
||||
```
|
||||
|
||||
### Add alpha to CSS vars
|
||||
|
||||
``` css
|
||||
color: color(from var(--MI_THEME-accent) srgb r g b / 0.5);
|
||||
```
|
||||
|
||||
|
2
COPYING
2
COPYING
@@ -1,5 +1,5 @@
|
||||
Unless otherwise stated this repository is
|
||||
Copyright © 2014-2023 syuilo and contributers
|
||||
Copyright © 2014-2025 syuilo and contributors
|
||||
|
||||
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
|
||||
|
||||
|
38
Dockerfile
38
Dockerfile
@@ -1,6 +1,6 @@
|
||||
# syntax = docker/dockerfile:1.4
|
||||
|
||||
ARG NODE_VERSION=20.5.1-bullseye
|
||||
ARG NODE_VERSION=22.11.0-bookworm
|
||||
|
||||
# build assets & compile TypeScript
|
||||
|
||||
@@ -14,24 +14,28 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||
&& apt-get install -yqq --no-install-recommends \
|
||||
build-essential
|
||||
|
||||
RUN corepack enable
|
||||
|
||||
WORKDIR /misskey
|
||||
|
||||
COPY --link ["pnpm-lock.yaml", "pnpm-workspace.yaml", "package.json", "./"]
|
||||
COPY --link ["scripts", "./scripts"]
|
||||
COPY --link ["packages/backend/package.json", "./packages/backend/"]
|
||||
COPY --link ["packages/frontend-shared/package.json", "./packages/frontend-shared/"]
|
||||
COPY --link ["packages/frontend/package.json", "./packages/frontend/"]
|
||||
COPY --link ["packages/frontend-embed/package.json", "./packages/frontend-embed/"]
|
||||
COPY --link ["packages/sw/package.json", "./packages/sw/"]
|
||||
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
|
||||
COPY --link ["packages/misskey-reversi/package.json", "./packages/misskey-reversi/"]
|
||||
COPY --link ["packages/misskey-bubble-game/package.json", "./packages/misskey-bubble-game/"]
|
||||
|
||||
ARG NODE_ENV=production
|
||||
|
||||
RUN node -e "console.log(JSON.parse(require('node:fs').readFileSync('./package.json')).packageManager)" | xargs npm install -g
|
||||
|
||||
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
|
||||
pnpm i --frozen-lockfile --aggregate-output
|
||||
|
||||
COPY --link . ./
|
||||
|
||||
ARG NODE_ENV=production
|
||||
|
||||
RUN git submodule update --init
|
||||
RUN pnpm build
|
||||
RUN rm -rf .git/
|
||||
@@ -44,13 +48,18 @@ RUN apt-get update \
|
||||
&& apt-get install -yqq --no-install-recommends \
|
||||
build-essential
|
||||
|
||||
RUN corepack enable
|
||||
|
||||
WORKDIR /misskey
|
||||
|
||||
COPY --link ["pnpm-lock.yaml", "pnpm-workspace.yaml", "package.json", "./"]
|
||||
COPY --link ["scripts", "./scripts"]
|
||||
COPY --link ["packages/backend/package.json", "./packages/backend/"]
|
||||
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
|
||||
COPY --link ["packages/misskey-reversi/package.json", "./packages/misskey-reversi/"]
|
||||
COPY --link ["packages/misskey-bubble-game/package.json", "./packages/misskey-bubble-game/"]
|
||||
|
||||
ARG NODE_ENV=production
|
||||
|
||||
RUN node -e "console.log(JSON.parse(require('node:fs').readFileSync('./package.json')).packageManager)" | xargs npm install -g
|
||||
|
||||
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
|
||||
pnpm i --frozen-lockfile --aggregate-output
|
||||
@@ -64,20 +73,29 @@ RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
ffmpeg tini curl libjemalloc-dev libjemalloc2 \
|
||||
&& ln -s /usr/lib/$(uname -m)-linux-gnu/libjemalloc.so.2 /usr/local/lib/libjemalloc.so \
|
||||
&& corepack enable \
|
||||
&& groupadd -g "${GID}" misskey \
|
||||
&& useradd -l -u "${UID}" -g "${GID}" -m -d /misskey misskey \
|
||||
&& find / -type d -path /proc -prune -o -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \
|
||||
&& find / -type d -path /proc -prune -o -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \; \
|
||||
&& find / -type d -path /sys -prune -o -type d -path /proc -prune -o -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \
|
||||
&& find / -type d -path /sys -prune -o -type d -path /proc -prune -o -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \; \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists
|
||||
|
||||
# add package.json to add pnpm
|
||||
COPY ./package.json ./package.json
|
||||
RUN node -e "console.log(JSON.parse(require('node:fs').readFileSync('./package.json')).packageManager)" | xargs npm install -g
|
||||
|
||||
USER misskey
|
||||
WORKDIR /misskey
|
||||
|
||||
COPY --chown=misskey:misskey --from=target-builder /misskey/node_modules ./node_modules
|
||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/backend/node_modules ./packages/backend/node_modules
|
||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-js/node_modules ./packages/misskey-js/node_modules
|
||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-reversi/node_modules ./packages/misskey-reversi/node_modules
|
||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-bubble-game/node_modules ./packages/misskey-bubble-game/node_modules
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/built ./built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-js/built ./packages/misskey-js/built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-reversi/built ./packages/misskey-reversi/built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-bubble-game/built ./packages/misskey-bubble-game/built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/built ./packages/backend/built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/fluent-emojis /misskey/fluent-emojis
|
||||
COPY --chown=misskey:misskey . ./
|
||||
|
49
README.md
49
README.md
@@ -1,16 +1,18 @@
|
||||
<div align="center">
|
||||
<a href="https://misskey-hub.net">
|
||||
<img src="./assets/title_float.svg" alt="Misskey logo" style="border-radius:50%" width="400"/>
|
||||
<img src="./assets/title_float.svg" alt="Misskey logo" style="border-radius:50%" width="300"/>
|
||||
</a>
|
||||
|
||||
**🌎 **[Misskey](https://misskey-hub.net/)** is an open source, decentralized social media platform that's free forever! 🚀**
|
||||
**🌎 **Misskey** is an open source, federated social media platform that's free forever! 🚀**
|
||||
|
||||
[Learn more](https://misskey-hub.net/)
|
||||
|
||||
---
|
||||
|
||||
<a href="https://misskey-hub.net/instances.html">
|
||||
<a href="https://misskey-hub.net/servers/">
|
||||
<img src="https://custom-icon-badges.herokuapp.com/badge/find_an-instance-acea31?logoColor=acea31&style=for-the-badge&logo=misskey&labelColor=363B40" alt="find an instance"/></a>
|
||||
|
||||
<a href="https://misskey-hub.net/docs/install.html">
|
||||
<a href="https://misskey-hub.net/docs/for-admin/install/guides/">
|
||||
<img src="https://custom-icon-badges.herokuapp.com/badge/create_an-instance-FBD53C?logoColor=FBD53C&style=for-the-badge&logo=server&labelColor=363B40" alt="create an instance"/></a>
|
||||
|
||||
<a href="./CONTRIBUTING.md">
|
||||
@@ -22,45 +24,14 @@
|
||||
<a href="https://www.patreon.com/syuilo">
|
||||
<img src="https://custom-icon-badges.herokuapp.com/badge/become_a-patron-F96854?logoColor=F96854&style=for-the-badge&logo=patreon&labelColor=363B40" alt="become a patron"/></a>
|
||||
|
||||
---
|
||||
|
||||
[](https://codecov.io/gh/misskey-dev/misskey)
|
||||
|
||||
</div>
|
||||
|
||||
<div>
|
||||
|
||||
<a href="https://xn--931a.moe/"><img src="https://github.com/misskey-dev/misskey/blob/develop/assets/ai.png?raw=true" align="right" height="320px"/></a>
|
||||
|
||||
## ✨ Features
|
||||
- **ActivityPub support**\
|
||||
Not on Misskey? No problem! Not only can Misskey instances talk to each other, but you can make friends with people on other networks like Mastodon and Pixelfed!
|
||||
- **Reactions**\
|
||||
You can add emoji reactions to any post! No longer are you bound by a like button, show everyone exactly how you feel with the tap of a button.
|
||||
- **Drive**\
|
||||
With Misskey's built in drive, you get cloud storage right in your social media, where you can upload any files, make folders, and find media from posts you've made!
|
||||
- **Rich Web UI**\
|
||||
Misskey has a rich and easy to use Web UI!
|
||||
It is highly customizable, from changing the layout and adding widgets to making custom themes.
|
||||
Furthermore, plugins can be created using AiScript, an original programming language.
|
||||
- And much more...
|
||||
|
||||
</div>
|
||||
|
||||
<div style="clear: both;"></div>
|
||||
|
||||
## Documentation
|
||||
|
||||
Misskey Documentation can be found at [Misskey Hub](https://misskey-hub.net/), some of the links and graphics above also lead to specific portions of it.
|
||||
|
||||
## Sponsors
|
||||
|
||||
<div align="center">
|
||||
<a class="rss3" title="RSS3" href="https://rss3.io/" target="_blank"><img src="https://rss3.mypinata.cloud/ipfs/QmUG6H3Z7D5P511shn7sB4CPmpjH5uZWu4m5mWX7U3Gqbu" alt="RSS3" height="60"></a>
|
||||
</div>
|
||||
|
||||
## Thanks
|
||||
|
||||
<a href="https://sentry.io/"><img src="https://github.com/misskey-dev/misskey/assets/4439005/98576556-222f-467a-94be-e98dbda1d852" height="30" alt="Sentry" /></a>
|
||||
|
||||
Thanks to [Sentry](https://sentry.io/) for providing the error tracking platform that helps us catch unexpected errors.
|
||||
|
||||
<a href="https://www.chromatic.com/"><img src="https://user-images.githubusercontent.com/321738/84662277-e3db4f80-af1b-11ea-88f5-91d67a5e59f6.png" height="30" alt="Chromatic" /></a>
|
||||
|
||||
Thanks to [Chromatic](https://www.chromatic.com/) for providing the visual testing platform that helps us review UI changes and catch visual regressions.
|
||||
|
@@ -6,6 +6,7 @@ Also, the later tasks are more indefinite and are subject to change as developme
|
||||
This is the phase we are at now. We need to make a high-maintenance environment that can withstand future development.
|
||||
|
||||
- ~~Make the number of type errors zero (backend)~~ → Done ✔️
|
||||
- Make the number of type errors zero (frontend)
|
||||
- Improve CI
|
||||
- ~~Fix tests~~ → Done ✔️
|
||||
- Fix random test failures - https://github.com/misskey-dev/misskey/issues/7985 and https://github.com/misskey-dev/misskey/issues/7986
|
||||
|
15
SECURITY.md
15
SECURITY.md
@@ -1,9 +1,20 @@
|
||||
# Reporting Security Issues
|
||||
|
||||
If you discover a security issue in Misskey, please report it by sending an
|
||||
email to [syuilotan@yahoo.co.jp](mailto:syuilotan@yahoo.co.jp).
|
||||
If you discover a security issue in Misskey, please report it by **[this form](https://github.com/misskey-dev/misskey/security/advisories/new)**.
|
||||
|
||||
This will allow us to assess the risk, and make a fix available before we add a
|
||||
bug report to the GitHub repository.
|
||||
|
||||
Thanks for helping make Misskey safe for everyone.
|
||||
|
||||
> [!note]
|
||||
> CNA [requires](https://www.cve.org/ResourcesSupport/AllResources/CNARules#section_5-2_Description) that CVEs include a description in English for inclusion in the CVE Catalog.
|
||||
>
|
||||
> When creating a security advisory, all content must be written in English (it is acceptable to include a non-English description along with the English one).
|
||||
|
||||
## When create a patch
|
||||
|
||||
If you can also create a patch to fix the vulnerability, please create a PR on the private fork.
|
||||
|
||||
> [!note]
|
||||
> There is a GitHub bug that prevents merging if a PR not following the develop branch of upstream, so please keep follow the develop branch.
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 94 KiB |
Binary file not shown.
Before Width: | Height: | Size: 317 KiB |
Binary file not shown.
Before Width: | Height: | Size: 24 KiB |
Binary file not shown.
Before Width: | Height: | Size: 95 KiB |
Binary file not shown.
Before Width: | Height: | Size: 238 KiB |
Binary file not shown.
Before Width: | Height: | Size: 148 KiB |
@@ -77,17 +77,17 @@ dbReplications: false
|
||||
# You can configure any number of replicas here
|
||||
#dbSlaves:
|
||||
# -
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
# -
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Redis configuration └─────────────────────────────────────
|
||||
@@ -124,6 +124,14 @@ redis:
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
|
||||
#redisForReactions:
|
||||
# host: redis
|
||||
# port: 6379
|
||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
# #pass: example-pass
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
|
||||
# ┌───────────────────────────┐
|
||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
||||
|
||||
@@ -152,6 +160,22 @@ redis:
|
||||
# ID SETTINGS AFTER THAT!
|
||||
|
||||
id: "aidx"
|
||||
|
||||
# ┌────────────────┐
|
||||
#───┘ Error tracking └──────────────────────────────────────────
|
||||
|
||||
# Sentry is available for error tracking.
|
||||
# See the Sentry documentation for more details on options.
|
||||
|
||||
#sentryForBackend:
|
||||
# enableNodeProfiling: true
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
#sentryForFrontend:
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
@@ -167,7 +191,7 @@ id: "aidx"
|
||||
|
||||
# Job rate limiter
|
||||
# deliverJobPerSec: 128
|
||||
# inboxJobPerSec: 16
|
||||
# inboxJobPerSec: 32
|
||||
|
||||
# Job attempts
|
||||
# deliverJobMaxAttempts: 12
|
||||
|
@@ -27,7 +27,7 @@ spec:
|
||||
ports:
|
||||
- containerPort: 3000
|
||||
- name: postgres
|
||||
image: postgres:14-alpine
|
||||
image: postgres:15-alpine
|
||||
env:
|
||||
- name: POSTGRES_USER
|
||||
value: "example-misskey-user"
|
||||
@@ -38,7 +38,7 @@ spec:
|
||||
ports:
|
||||
- containerPort: 5432
|
||||
- name: redis
|
||||
image: redis:alpine
|
||||
image: redis:7-alpine
|
||||
ports:
|
||||
- containerPort: 6379
|
||||
volumes:
|
||||
|
40
compose.local-db.yml
Normal file
40
compose.local-db.yml
Normal file
@@ -0,0 +1,40 @@
|
||||
# このconfigは、 dockerでMisskey本体を起動せず、 redisとpostgresql などだけを起動します
|
||||
|
||||
services:
|
||||
redis:
|
||||
restart: always
|
||||
image: redis:7-alpine
|
||||
ports:
|
||||
- "6379:6379"
|
||||
volumes:
|
||||
- ./redis:/data
|
||||
healthcheck:
|
||||
test: "redis-cli ping"
|
||||
interval: 5s
|
||||
retries: 20
|
||||
|
||||
db:
|
||||
restart: always
|
||||
image: postgres:15-alpine
|
||||
ports:
|
||||
- "5432:5432"
|
||||
env_file:
|
||||
- .config/docker.env
|
||||
volumes:
|
||||
- ./db:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"
|
||||
interval: 5s
|
||||
retries: 20
|
||||
|
||||
# meilisearch:
|
||||
# restart: always
|
||||
# image: getmeili/meilisearch:v1.3.4
|
||||
# environment:
|
||||
# - MEILI_NO_ANALYTICS=true
|
||||
# - MEILI_ENV=production
|
||||
# env_file:
|
||||
# - .config/meilisearch.env
|
||||
# volumes:
|
||||
# - ./meili_data:/meili_data
|
||||
|
@@ -1,5 +1,3 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
web:
|
||||
build: .
|
||||
@@ -7,6 +5,7 @@ services:
|
||||
links:
|
||||
- db
|
||||
- redis
|
||||
# - mcaptcha
|
||||
# - meilisearch
|
||||
depends_on:
|
||||
db:
|
||||
@@ -18,6 +17,8 @@ services:
|
||||
networks:
|
||||
- internal_network
|
||||
- external_network
|
||||
# env_file:
|
||||
# - .config/docker.env
|
||||
volumes:
|
||||
- ./files:/misskey/files
|
||||
- ./.config:/misskey/.config:ro
|
||||
@@ -48,6 +49,36 @@ services:
|
||||
interval: 5s
|
||||
retries: 20
|
||||
|
||||
# mcaptcha:
|
||||
# restart: always
|
||||
# image: mcaptcha/mcaptcha:latest
|
||||
# networks:
|
||||
# internal_network:
|
||||
# external_network:
|
||||
# aliases:
|
||||
# - localhost
|
||||
# ports:
|
||||
# - 7493:7493
|
||||
# env_file:
|
||||
# - .config/docker.env
|
||||
# environment:
|
||||
# PORT: 7493
|
||||
# MCAPTCHA_redis_URL: "redis://mcaptcha_redis/"
|
||||
# depends_on:
|
||||
# db:
|
||||
# condition: service_healthy
|
||||
# mcaptcha_redis:
|
||||
# condition: service_healthy
|
||||
#
|
||||
# mcaptcha_redis:
|
||||
# image: mcaptcha/cache:latest
|
||||
# networks:
|
||||
# - internal_network
|
||||
# healthcheck:
|
||||
# test: "redis-cli ping"
|
||||
# interval: 5s
|
||||
# retries: 20
|
||||
|
||||
# meilisearch:
|
||||
# restart: always
|
||||
# image: getmeili/meilisearch:v1.3.4
|
@@ -1,3 +1,8 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
describe('Before setup instance', () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
@@ -18,6 +23,7 @@ describe('Before setup instance', () => {
|
||||
|
||||
cy.intercept('POST', '/api/admin/accounts/create').as('signup');
|
||||
|
||||
cy.get('[data-cy-admin-initial-password] input').type('example_password_please_change_this_or_you_will_get_hacked');
|
||||
cy.get('[data-cy-admin-username] input').type('admin');
|
||||
cy.get('[data-cy-admin-password] input').type('admin1234');
|
||||
cy.get('[data-cy-admin-ok]').click();
|
||||
@@ -114,11 +120,16 @@ describe('After user signup', () => {
|
||||
it('signin', () => {
|
||||
cy.visitHome();
|
||||
|
||||
cy.intercept('POST', '/api/signin').as('signin');
|
||||
cy.intercept('POST', '/api/signin-flow').as('signin');
|
||||
|
||||
cy.get('[data-cy-signin]').click();
|
||||
cy.get('[data-cy-signin-username] input').type('alice');
|
||||
// Enterキーでサインインできるかの確認も兼ねる
|
||||
|
||||
cy.get('[data-cy-signin-page-input]').should('be.visible', { timeout: 1000 });
|
||||
// Enterキーで続行できるかの確認も兼ねる
|
||||
cy.get('[data-cy-signin-username] input').type('alice{enter}');
|
||||
|
||||
cy.get('[data-cy-signin-page-password]').should('be.visible', { timeout: 10000 });
|
||||
// Enterキーで続行できるかの確認も兼ねる
|
||||
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||
|
||||
cy.wait('@signin');
|
||||
@@ -133,8 +144,9 @@ describe('After user signup', () => {
|
||||
cy.visitHome();
|
||||
|
||||
cy.get('[data-cy-signin]').click();
|
||||
cy.get('[data-cy-signin-username] input').type('alice');
|
||||
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||
|
||||
cy.get('[data-cy-signin-page-input]').should('be.visible', { timeout: 1000 });
|
||||
cy.get('[data-cy-signin-username] input').type('alice{enter}');
|
||||
|
||||
// TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする
|
||||
cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi);
|
||||
@@ -161,11 +173,13 @@ describe('After user signed in', () => {
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
cy.get('[data-cy-user-setup-continue]').should('be.visible');
|
||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
||||
cy.get('[data-cy-user-setup-continue]', { timeout: 30000 }).should('be.visible');
|
||||
});
|
||||
|
||||
it('account setup wizard', () => {
|
||||
cy.get('[data-cy-user-setup-continue]').click();
|
||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
||||
cy.get('[data-cy-user-setup-continue]', { timeout: 30000 }).click();
|
||||
|
||||
cy.get('[data-cy-user-setup-user-name] input').type('ありす');
|
||||
cy.get('[data-cy-user-setup-user-description] textarea').type('ほげ');
|
||||
@@ -202,7 +216,8 @@ describe('After user setup', () => {
|
||||
cy.login('alice', 'alice1234');
|
||||
|
||||
// アカウント初期設定ウィザード
|
||||
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]').click();
|
||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
||||
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]', { timeout: 30000 }).click();
|
||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
||||
});
|
||||
|
||||
@@ -218,7 +233,7 @@ describe('After user setup', () => {
|
||||
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
||||
cy.get('[data-cy-open-post-form-submit]').click();
|
||||
|
||||
cy.contains('Hello, Misskey!');
|
||||
cy.contains('Hello, Misskey!', { timeout: 15000 });
|
||||
});
|
||||
|
||||
it('open note form with hotkey', () => {
|
35
cypress/e2e/router.cy.ts
Normal file
35
cypress/e2e/router.cy.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
describe('Router transition', () => {
|
||||
describe('Redirect', () => {
|
||||
// サーバの初期化。ルートのテストに関しては各describeごとに1度だけ実行で十分だと思う(使いまわした方が早い)
|
||||
before(() => {
|
||||
cy.resetState();
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
|
||||
// ユーザー作成
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
|
||||
cy.login('alice', 'alice1234');
|
||||
|
||||
// アカウント初期設定ウィザード
|
||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
||||
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]', { timeout: 30000 }).click();
|
||||
cy.wait(500);
|
||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
||||
});
|
||||
|
||||
it('redirect to user profile', () => {
|
||||
// テストのためだけに用意されたリダイレクト用ルートに飛ぶ
|
||||
cy.visit('/redirect-test');
|
||||
|
||||
// プロフィールページのURLであることを確認する
|
||||
cy.url().should('include', '/@alice')
|
||||
});
|
||||
});
|
||||
});
|
@@ -1,3 +1,8 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
/* flaky
|
||||
describe('After user signed in', () => {
|
||||
beforeEach(() => {
|
@@ -30,9 +30,13 @@ Cypress.Commands.add('visitHome', () => {
|
||||
})
|
||||
|
||||
Cypress.Commands.add('resetState', () => {
|
||||
cy.window(win => {
|
||||
// iframe.contentWindow.indexedDB.deleteDatabase() がchromeのバグで使用できないため、indexedDBを無効化している。
|
||||
// see https://github.com/misskey-dev/misskey/issues/13605#issuecomment-2053652123
|
||||
/*
|
||||
cy.window().then(win => {
|
||||
win.indexedDB.deleteDatabase('keyval-store');
|
||||
});
|
||||
*/
|
||||
cy.request('POST', '/api/reset-db', {}).as('reset');
|
||||
cy.get('@reset').its('status').should('equal', 204);
|
||||
cy.reload(true);
|
||||
@@ -44,16 +48,19 @@ Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => {
|
||||
cy.request('POST', route, {
|
||||
username: username,
|
||||
password: password,
|
||||
...(isAdmin ? { setupPassword: 'example_password_please_change_this_or_you_will_get_hacked' } : {}),
|
||||
}).its('body').as(username);
|
||||
});
|
||||
|
||||
Cypress.Commands.add('login', (username, password) => {
|
||||
cy.visitHome();
|
||||
|
||||
cy.intercept('POST', '/api/signin').as('signin');
|
||||
cy.intercept('POST', '/api/signin-flow').as('signin');
|
||||
|
||||
cy.get('[data-cy-signin]').click();
|
||||
cy.get('[data-cy-signin-username] input').type(username);
|
||||
cy.get('[data-cy-signin-page-input]').should('be.visible', { timeout: 1000 });
|
||||
cy.get('[data-cy-signin-username] input').type(`${username}{enter}`);
|
||||
cy.get('[data-cy-signin-page-password]').should('be.visible', { timeout: 10000 });
|
||||
cy.get('[data-cy-signin-password] input').type(`${password}{enter}`);
|
||||
|
||||
cy.wait('@signin').as('signedIn');
|
19
cypress/support/index.ts
Normal file
19
cypress/support/index.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
declare global {
|
||||
namespace Cypress {
|
||||
interface Chainable {
|
||||
login(username: string, password: string): Chainable<void>;
|
||||
|
||||
registerUser(
|
||||
username: string,
|
||||
password: string,
|
||||
isAdmin?: boolean
|
||||
): Chainable<void>;
|
||||
|
||||
resetState(): Chainable<void>;
|
||||
|
||||
visitHome(): Chainable<void>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export {}
|
8
cypress/tsconfig.json
Normal file
8
cypress/tsconfig.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"lib": ["dom", "es5"],
|
||||
"target": "es5",
|
||||
"types": ["cypress", "node"]
|
||||
},
|
||||
"include": ["./**/*.ts"]
|
||||
}
|
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# SPDX-FileCopyrightText: syuilo and other misskey contributors
|
||||
# SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
PORT=$(grep '^port:' /misskey/.config/default.yml | awk 'NR==1{print $2; exit}')
|
||||
curl -s -S -o /dev/null "http://localhost:${PORT}"
|
||||
curl -Sfso/dev/null "http://localhost:${PORT}/healthz"
|
||||
|
@@ -1,14 +1,14 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and other misskey contributors
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
||||
import { action } from '@storybook/addon-actions';
|
||||
import { StoryObj } from '@storybook/vue3';
|
||||
import { rest } from 'msw';
|
||||
import { abuseUserReport } from '../../.storybook/fakes';
|
||||
import { commonHandlers } from '../../.storybook/mocks';
|
||||
import { HttpResponse, http } from 'msw';
|
||||
import { abuseUserReport } from '../packages/frontend/.storybook/fakes.js';
|
||||
import { commonHandlers } from '../packages/frontend/.storybook/mocks.js';
|
||||
import MkAbuseReport from './MkAbuseReport.vue';
|
||||
export const Default = {
|
||||
render(args) {
|
||||
@@ -44,9 +44,9 @@ export const Default = {
|
||||
msw: {
|
||||
handlers: [
|
||||
...commonHandlers,
|
||||
rest.post('/api/admin/resolve-abuse-user-report', async (req, res, ctx) => {
|
||||
action('POST /api/admin/resolve-abuse-user-report')(await req.json());
|
||||
return res(ctx.json({}));
|
||||
http.post('/api/admin/resolve-abuse-user-report', async ({ request }) => {
|
||||
action('POST /api/admin/resolve-abuse-user-report')(await request.json());
|
||||
return HttpResponse.json({});
|
||||
}),
|
||||
],
|
||||
},
|
1
idea/README.md
Normal file
1
idea/README.md
Normal file
@@ -0,0 +1 @@
|
||||
使われなくなったけど消すのは勿体ない(将来使えるかもしれない)コードを入れておくとこ
|
@@ -120,10 +120,10 @@ sensitive: "محتوى حساس"
|
||||
add: "إضافة"
|
||||
reaction: "التفاعلات"
|
||||
reactions: "التفاعلات"
|
||||
reactionSetting: "التفاعلات المراد عرضها في منتقي التفاعلات."
|
||||
reactionSettingDescription2: "اسحب لترتيب ، انقر للحذف ، استخدم \"+\" للإضافة."
|
||||
rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات"
|
||||
attachCancel: "أزل المرفق"
|
||||
deleteFile: "حُذف الملف"
|
||||
markAsSensitive: "علّمه كمحتوى حساس"
|
||||
unmarkAsSensitive: "ألغ تعيينه كمحتوى حساس"
|
||||
enterFileName: "ادخل اسم الملف"
|
||||
@@ -343,7 +343,6 @@ enableLocalTimeline: "تفعيل الخيط المحلي"
|
||||
enableGlobalTimeline: "تفعيل الخيط الزمني الشامل"
|
||||
disablingTimelinesInfo: "سيتمكن المديرون والمشرفون من الوصول إلى كل الخيوط الزمنية حتى وإن لم تفعّل."
|
||||
registration: "إنشاء حساب"
|
||||
enableRegistration: "تفعيل إنشاء الحسابات الجديدة"
|
||||
invite: "دعوة"
|
||||
driveCapacityPerLocalAccount: "حصة التخزين لكل مستخدم محلي"
|
||||
driveCapacityPerRemoteAccount: "حصة التخزين لكل مستخدم بعيد"
|
||||
@@ -361,6 +360,8 @@ hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "فعّل hCaptcha"
|
||||
hcaptchaSiteKey: "مفتاح الموقع"
|
||||
hcaptchaSecretKey: "المفتاح السري"
|
||||
mcaptchaSiteKey: "مفتاح الموقع"
|
||||
mcaptchaSecretKey: "المفتاح السري"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "تمكين reCAPTCHA"
|
||||
recaptchaSiteKey: "مفتاح الموقع"
|
||||
@@ -418,7 +419,6 @@ share: "شارِك"
|
||||
notFound: "غير موجود"
|
||||
notFoundDescription: "تعذر العثور على صفحة يقود إليها هذا الرابط."
|
||||
uploadFolder: "المجلد الافتراضي للرفع"
|
||||
cacheClear: "مسح ذاكرة التخزين المؤقت"
|
||||
markAsReadAllNotifications: "وضع جميع الإشعارات كأنها مقروءة"
|
||||
markAsReadAllUnreadNotes: "علّم جميع الملاحظات كمقروءة"
|
||||
markAsReadAllTalkMessages: "علّم جميع الرسائل كمقروءة"
|
||||
@@ -625,10 +625,7 @@ abuseReported: "أُرسل البلاغ، شكرًا لك"
|
||||
reporter: "المُبلّغ"
|
||||
reporteeOrigin: "أصل البلاغ"
|
||||
reporterOrigin: "أصل المُبلّغ"
|
||||
forwardReport: "وجّه البلاغ إلى المثيل البعيد"
|
||||
forwardReportIsAnonymous: "في المثيل البعيد سيظهر المبلّغ كحساب مجهول."
|
||||
send: "أرسل"
|
||||
abuseMarkAsResolved: "علّم البلاغ كمحلول"
|
||||
openInNewTab: "افتح في لسان جديد"
|
||||
defaultNavigationBehaviour: "سلوك الملاحة الافتراضي"
|
||||
editTheseSettingsMayBreakAccount: "تعديل هذه الإعدادات قد يسبب عطبًا لحسابك"
|
||||
@@ -818,8 +815,6 @@ makeReactionsPublicDescription: "هذا سيجعل قائمة تفاعلاتك
|
||||
classic: "تقليدي"
|
||||
muteThread: "اكتم النقاش"
|
||||
unmuteThread: "ارفع الكتم عن النقاش"
|
||||
ffVisibility: "مرئية المتابِعين/المتابَعين"
|
||||
ffVisibilityDescription: "يسمح لك بتحديد من يمكنهم رؤية متابِعيك ومتابَعيك."
|
||||
continueThread: "اعرض بقية النقاش"
|
||||
deleteAccountConfirm: "سيحذف حسابك نهائيًا، أتريد المتابعة؟"
|
||||
incorrectPassword: "كلمة السر خاطئة."
|
||||
@@ -948,9 +943,12 @@ rolesAssignedToMe: "الأدوار المسندة إلي"
|
||||
resetPasswordConfirm: "هل تريد إعادة تعيين كلمة السر؟"
|
||||
license: "الرخصة"
|
||||
unfavoriteConfirm: "أتريد إزالتها من المفضلة؟"
|
||||
reactionsDisplaySize: "حجم التفاعلات"
|
||||
limitWidthOfReaction: "تصغير حجم التفاعلات"
|
||||
noteIdOrUrl: "معرف الملاحظة أو رابطها"
|
||||
video: "فيديو"
|
||||
videos: "فيديوهات"
|
||||
dataSaver: "موفر البيانات"
|
||||
accountMigration: "ترحيل الحساب"
|
||||
accountMoved: "نقل هذا المستخدم حسابه:"
|
||||
accountMovedShort: "رُحل هذا الحساب."
|
||||
@@ -958,6 +956,7 @@ operationForbidden: "عملية ممنوعة"
|
||||
forceShowAds: "أظهر الإعلانات التجارية دائما"
|
||||
reactionsList: "التفاعلات"
|
||||
renotesList: "إعادات النشر"
|
||||
notificationDisplay: "إشعارات"
|
||||
leftTop: "أعلى اليسار"
|
||||
rightTop: "أعلى اليمين"
|
||||
leftBottom: "أسفل اليسار"
|
||||
@@ -980,6 +979,7 @@ thisChannelArchived: "أُرشفت هذه القناة."
|
||||
displayOfNote: "عرض الملاحظة"
|
||||
initialAccountSetting: "إعداد الملف الشخصي"
|
||||
youFollowing: "متابَع"
|
||||
preventAiLearning: "منع استخدام البيانات في تعليم الآلة"
|
||||
options: "خيارات"
|
||||
specifyUser: "مستخدم محدد"
|
||||
failedToPreviewUrl: "تتعذر المعاينة"
|
||||
@@ -993,12 +993,28 @@ later: "لاحقاً"
|
||||
goToMisskey: "لميسكي"
|
||||
additionalEmojiDictionary: "قواميس إيموجي إضافية"
|
||||
installed: "مُثبت"
|
||||
enableServerMachineStats: "نشر إحصائيات عتاد الخادم"
|
||||
turnOffToImprovePerformance: "تفعيله قد يزيد الأداء."
|
||||
createInviteCode: "ولِّد دعوة"
|
||||
inviteCodeCreated: "ولِّدت دعوة"
|
||||
inviteLimitExceeded: "وصلتَ لحد عدد الدعوات المسموح لك توليدها."
|
||||
createLimitRemaining: "حد عدد الدعوات: {limit} دعوة"
|
||||
expirationDate: "تاريخ انتهاء الصلاحية"
|
||||
noExpirationDate: "لا نهاية لصلاحيتها"
|
||||
inviteCodeUsedAt: "اُستخدم رمز الدعوة في"
|
||||
registeredUserUsingInviteCode: "اِستخدم رمز الدعوة"
|
||||
unused: "غير مستعمَل"
|
||||
expired: "منتهية صلاحيته"
|
||||
icon: "الصورة الرمزية"
|
||||
replies: "رد"
|
||||
renotes: "أعد النشر"
|
||||
sourceCode: "الشفرة المصدرية"
|
||||
flip: "اقلب"
|
||||
lastNDays: "آخر {n} أيام"
|
||||
surrender: "ألغِ"
|
||||
postForm: "أنشئ ملاحظة"
|
||||
_delivery:
|
||||
stop: "مُعلّق"
|
||||
_initialAccountSetting:
|
||||
accountCreated: "نجح إنشاء حسابك!"
|
||||
letsStartAccountSetup: "إذا كنت جديدًا لنعدّ حسابك الشخصي."
|
||||
@@ -1236,15 +1252,12 @@ _theme:
|
||||
buttonBg: "خلفية الأزرار"
|
||||
buttonHoverBg: "خلفية الأزرار (عند التمرير فوقها)"
|
||||
inputBorder: "حواف حقل الإدخال"
|
||||
listItemHoverBg: "خلفية عناصر القائمة (عند التمرير فوقها)"
|
||||
driveFolderBg: "خلفية مجلد قرص التخزين"
|
||||
messageBg: "خلفية المحادثة"
|
||||
_sfx:
|
||||
note: "الملاحظات"
|
||||
noteMy: "ملاحظتي"
|
||||
notification: "الإشعارات"
|
||||
antenna: "الهوائيات"
|
||||
channel: "إشعارات القنات"
|
||||
_ago:
|
||||
future: "المستقبَل"
|
||||
justNow: "اللحظة"
|
||||
@@ -1261,9 +1274,6 @@ _time:
|
||||
minute: "د"
|
||||
hour: "سا"
|
||||
day: "ي"
|
||||
_timelineTutorial:
|
||||
title: "كيف تستخدم Misskey"
|
||||
step3_1: "هل نشرت ملاحظتك الأولى؟"
|
||||
_2fa:
|
||||
alreadyRegistered: "سجلت سلفًا جهازًا للاستيثاق بعاملين."
|
||||
step1: "أولًا ثبّت تطبيق استيثاق على جهازك (مثل {a} و{b})."
|
||||
@@ -1406,6 +1416,7 @@ _profile:
|
||||
_exportOrImport:
|
||||
allNotes: "كل الملاحظات"
|
||||
favoritedNotes: " الملاحظات المفضلة"
|
||||
clips: "مِشبك"
|
||||
followingList: "المتابَعون"
|
||||
muteList: "المستخدمون المكتومون"
|
||||
blockingList: "المستخدمون المحجوبون"
|
||||
@@ -1450,9 +1461,6 @@ _pages:
|
||||
newPage: "أنشئ صفحة جديدة"
|
||||
editPage: "عدّل الصفحة"
|
||||
readPage: "نُشّط عرض المصدر"
|
||||
created: "نجح إنشاء الصفحة"
|
||||
updated: "نجح تعديل الصفحة"
|
||||
deleted: "نجح حذف الصفحة"
|
||||
pageSetting: "إعدادات الصفحة"
|
||||
nameAlreadyExists: "رابط الصفحة موجود مسبقًا"
|
||||
invalidNameTitle: "رابط الصفحة ليس صالحًا"
|
||||
@@ -1518,6 +1526,7 @@ _notification:
|
||||
reaction: "التفاعل"
|
||||
receiveFollowRequest: "طلبات المتابعة"
|
||||
followRequestAccepted: "طلبات المتابعة المقبولة"
|
||||
login: "لِج"
|
||||
app: "إشعارات التطبيقات المرتبطة"
|
||||
_actions:
|
||||
followBack: "تابعك بالمثل"
|
||||
@@ -1549,6 +1558,34 @@ _webhookSettings:
|
||||
active: "مُفعّل"
|
||||
_events:
|
||||
reaction: "عند التفاعل"
|
||||
_abuseReport:
|
||||
_notificationRecipient:
|
||||
_recipientType:
|
||||
mail: "البريد الإلكتروني "
|
||||
_moderationLogTypes:
|
||||
suspend: "علِق"
|
||||
deleteDriveFile: "حُذف الملف"
|
||||
deleteNote: "حُذفت الملاحظة"
|
||||
createGlobalAnnouncement: "أُنشئ إعلان عام"
|
||||
createUserAnnouncement: "أُنشئ إعلان مستخدم"
|
||||
updateGlobalAnnouncement: "حُدث إعلان عام"
|
||||
updateUserAnnouncement: "حُدث إعلان مستخدم"
|
||||
resetPassword: "أعد تعيين كلمتك السرية"
|
||||
createInvitation: "ولِّد دعوة"
|
||||
_reversi:
|
||||
total: "المجموع"
|
||||
lookingForPlayer: "يبحث عن خصم..."
|
||||
gameCanceled: "أُلغيت اللعبة."
|
||||
opponentHasSettingsChanged: "غيَر الخصم إعدادته."
|
||||
showBoardLabels: "اعرض ترقيم الصفوف والأعمدة على اللوح"
|
||||
useAvatarAsStone: "حوَل الحجارة إلى صور مستخدمين"
|
||||
_offlineScreen:
|
||||
title: "غير متصل - يتعذر الاتصال بالخادم"
|
||||
header: "يتعذر الاتصال بالخادم"
|
||||
_remoteLookupErrors:
|
||||
_noSuchObject:
|
||||
title: "غير موجود"
|
||||
_search:
|
||||
searchScopeAll: "الكل"
|
||||
searchScopeLocal: "المحلي"
|
||||
searchScopeUser: "مستخدم محدد"
|
||||
|
@@ -2,6 +2,7 @@
|
||||
_lang_: "বাংলা"
|
||||
headlineMisskey: "নোট ব্যাবহার করে সংযুক্ত নেটওয়ার্ক"
|
||||
introMisskey: "স্বাগতম! মিসকি একটি ওপেন সোর্স, ডিসেন্ট্রালাইজড মাইক্রোব্লগিং পরিষেবা। \n\"নোট\" তৈরির মাধ্যমে যা ঘটছে তা সবার সাথে শেয়ার করুন 📡\n\"রিঅ্যাকশন\" গুলির মাধ্যমে যেকোনো নোট সম্পর্কে আপনার অনুভূতি ব্যাক্ত করতে পারেন 👍\nএকটি নতুন দুনিয়া ঘুরে দেখুন 🚀\n"
|
||||
poweredByMisskeyDescription: "{name} হল ওপেন সোর্স প্ল্যাটফর্ম <b>Misskey</b>-এর সার্ভারগুলির একটি৷"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "খুঁজুন"
|
||||
notifications: "বিজ্ঞপ্তি"
|
||||
@@ -12,12 +13,14 @@ fetchingAsApObject: "ফেডিভার্স থেকে খবর আন
|
||||
ok: "ঠিক"
|
||||
gotIt: "বুঝেছি"
|
||||
cancel: "বাতিল"
|
||||
noThankYou: "না, ধন্যবাদ"
|
||||
enterUsername: "ইউজারনেম লিখুন"
|
||||
renotedBy: "{user} রিনোট করেছেন"
|
||||
noNotes: "কোন নোট নেই"
|
||||
noNotifications: "কোনো বিজ্ঞপ্তি নেই"
|
||||
instance: "ইন্সট্যান্স"
|
||||
settings: "সেটিংস"
|
||||
notificationSettings: "বিজ্ঞপ্তির সেটিংস"
|
||||
basicSettings: "সাধারণ সেটিংস"
|
||||
otherSettings: "অন্যান্য সেটিংস"
|
||||
openInWindow: "নতুন উইন্ডোতে খুলা"
|
||||
@@ -42,12 +45,20 @@ pin: "পিন করা"
|
||||
unpin: "পিন সরান"
|
||||
copyContent: "বিষয়বস্তু কপি করুন"
|
||||
copyLink: "লিঙ্ক কপি করুন"
|
||||
copyLinkRenote: "রিনোট লিঙ্ক কপি করুন"
|
||||
delete: "মুছুন"
|
||||
deleteAndEdit: "মুছুন এবং সম্পাদনা করুন"
|
||||
deleteAndEditConfirm: "আপনি কি এই নোটটি মুছে এটি সম্পাদনা করার বিষয়ে নিশ্চিত? আপনি এটির সমস্ত রিঅ্যাকশন, রিনোট এবং জবাব হারাবেন।"
|
||||
addToList: "লিস্ট এ যোগ করুন"
|
||||
addToAntenna: "অ্যান্টেনা এ যোগ করুন"
|
||||
sendMessage: "একটি বার্তা পাঠান"
|
||||
copyRSS: "RSS কপি করুন"
|
||||
copyUsername: "ব্যবহারকারীর নাম কপি করুন"
|
||||
copyUserId: "ব্যবহারকারীর ID কপি করুন"
|
||||
copyNoteId: "নোটের ID কপি করুন"
|
||||
copyFileId: "ফাইল ID কপি করুন"
|
||||
copyFolderId: "ফোল্ডার ID কপি করুন"
|
||||
copyProfileUrl: "প্রোফাইল URL কপি করুন"
|
||||
searchUser: "ব্যবহারকারী খুঁজুন..."
|
||||
reply: "জবাব"
|
||||
loadMore: "আরও দেখুন"
|
||||
@@ -100,6 +111,8 @@ renoted: "রিনোট করা হয়েছে"
|
||||
cantRenote: "এই নোটটি রিনোট করা যাবে না।"
|
||||
cantReRenote: "রিনোটকে রিনোট করা যাবে না।"
|
||||
quote: "উদ্ধৃতি"
|
||||
inChannelRenote: "চ্যানেলে রিনোট"
|
||||
inChannelQuote: "চ্যানেলে উদ্ধৃতি"
|
||||
pinnedNote: "পিন করা নোট"
|
||||
pinned: "পিন করা"
|
||||
you: "আপনি"
|
||||
@@ -108,7 +121,10 @@ sensitive: "সংবেদনশীল বিষয়বস্তু"
|
||||
add: "যুক্ত করুন"
|
||||
reaction: "প্রতিক্রিয়া"
|
||||
reactions: "প্রতিক্রিয়া"
|
||||
reactionSetting: "রিঅ্যাকশন পিকারে যেসকল প্রতিক্রিয়া দেখানো হবে"
|
||||
emojiPicker: "ইমোজি পিকার"
|
||||
pinnedEmojisForReactionSettingDescription: "রিঅ্যাকশন দেয়ার সময় আপনি ইমোজিটিকে পিন করা এবং প্রদর্শিত হওয়ার জন্য সেট করতে পারেন।"
|
||||
pinnedEmojisSettingDescription: "ইমোজি ইনপুট দেয়ার সময় আপনি ইমোজিটিকে পিন করা এবং প্রদর্শিত হওয়ার জন্য সেট করতে পারেন।"
|
||||
emojiPickerDisplay: "পিকার ডিসপ্লে"
|
||||
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে + টিপুন।"
|
||||
rememberNoteVisibility: "নোটের দৃশ্যমান্যতার সেটিংস মনে রাখুন"
|
||||
attachCancel: "অ্যাটাচমেন্ট সরান "
|
||||
@@ -323,7 +339,6 @@ enableLocalTimeline: "স্থানীয় টাইমলাইন চাল
|
||||
enableGlobalTimeline: "গ্লোবাল টাইমলাইন চালু করুন"
|
||||
disablingTimelinesInfo: "আপনি এই টাইমলাইনগুলি বন্ধ করলেও প্রশাসক এবং মডারেটররা এই টাইমলাইনগুলি ব্যাবহার করতে পারবে"
|
||||
registration: "নিবন্ধন"
|
||||
enableRegistration: "নতুন ব্যাবহারকারী নিবন্ধন চালু করুন"
|
||||
invite: "আমন্ত্রণ"
|
||||
driveCapacityPerLocalAccount: "প্রত্যেক স্থানীয় ব্যাবহারকারীর জন্য ড্রাইভের জায়গা"
|
||||
driveCapacityPerRemoteAccount: "প্রত্যেক রিমোট ব্যাবহারকারীর জন্য ড্রাইভের জায়গা"
|
||||
@@ -341,6 +356,8 @@ hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "hCaptcha চালু করুন"
|
||||
hcaptchaSiteKey: "সাইট কী"
|
||||
hcaptchaSecretKey: "সিক্রেট কী"
|
||||
mcaptchaSiteKey: "সাইট কী"
|
||||
mcaptchaSecretKey: "সিক্রেট কী"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "reCAPTCHA চালু করুন"
|
||||
recaptchaSiteKey: "সাইট কী"
|
||||
@@ -393,7 +410,6 @@ share: "শেয়ার"
|
||||
notFound: "পাওয়া যায়নি"
|
||||
notFoundDescription: "এই URL-এর সাথে সম্পর্কিত কোনো পৃষ্ঠা নেই।"
|
||||
uploadFolder: "আপলোডের জন্য ডিফল্ট ফোল্ডার"
|
||||
cacheClear: "ক্যাশ পরিষ্কার করুন"
|
||||
markAsReadAllNotifications: "সমস্ত বিজ্ঞপ্তিগুলি পঠিত হিসাবে চিহ্নিত করুন"
|
||||
markAsReadAllUnreadNotes: "সমস্ত নোটগুলি পঠিত হিসাবে চিহ্নিত করুন"
|
||||
markAsReadAllTalkMessages: "সমস্ত মেসেজ পঠিত হিসাবে চিহ্নিত করুন"
|
||||
@@ -434,7 +450,6 @@ or: "অথবা"
|
||||
language: "ভাষা"
|
||||
uiLanguage: "UI এর ভাষা"
|
||||
aboutX: "{x} সম্পর্কে"
|
||||
disableDrawer: "ড্রয়ার মেনু প্রদর্শন করবেন না"
|
||||
noHistory: "কোনো ইতিহাস নেই"
|
||||
signinHistory: "প্রবেশ করার ইতিহাস"
|
||||
doing: "প্রক্রিয়া করছে..."
|
||||
@@ -608,10 +623,7 @@ abuseReported: "আপনার অভিযোগটি দাখিল কর
|
||||
reporter: "অভিযোগকারী"
|
||||
reporteeOrigin: "অভিযোগটির উৎস"
|
||||
reporterOrigin: "অভিযোগকারীর উৎস"
|
||||
forwardReport: "রিমোট ইন্সত্যান্সে অভিযোগটি পাঠান"
|
||||
forwardReportIsAnonymous: "আপনার তথ্য রিমোট ইন্সত্যান্সে পাঠানো হবে না এবং একটি বেনামী সিস্টেম অ্যাকাউন্ট হিসাবে প্রদর্শিত হবে।"
|
||||
send: "পাঠান"
|
||||
abuseMarkAsResolved: "অভিযোগটিকে সমাধাকৃত হিসাবে চিহ্নিত করুন"
|
||||
openInNewTab: "নতুন ট্যাবে খুলুন"
|
||||
openInSideView: "সাইড ভিউতে খুলুন"
|
||||
defaultNavigationBehaviour: "ডিফল্ট নেভিগেশন"
|
||||
@@ -795,8 +807,6 @@ makeReactionsPublicDescription: "আপনার পূর্ববর্তী
|
||||
classic: "ক্লাসিক"
|
||||
muteThread: "থ্রেড মিউট করুন"
|
||||
unmuteThread: "থ্রেড আনমিউট করুন"
|
||||
ffVisibility: "অনুসরণ/অনুসরণকারীদের দৃশ্যমান্যতা"
|
||||
ffVisibilityDescription: "আপনি কাকে অনুসরণ করেন এবং কে আপনাকে অনুসরণ করে, সেটা কারা দেখতে পাবে তা নির্ধারণ করে।"
|
||||
continueThread: "আরো থ্রেড দেখুন"
|
||||
deleteAccountConfirm: "আপনার অ্যাকাউন্ট মুছে ফেলা হবে। ঠিক আছে?"
|
||||
incorrectPassword: "আপনার দেওয়া পাসওয়ার্ডটি ভুল।"
|
||||
@@ -840,6 +850,13 @@ youFollowing: "অনুসরণ করা হচ্ছে"
|
||||
icon: "প্রোফাইল ছবি"
|
||||
replies: "জবাব"
|
||||
renotes: "রিনোট"
|
||||
sourceCode: "সোর্স কোড"
|
||||
flip: "উল্টান"
|
||||
postForm: "নোট লিখুন"
|
||||
_delivery:
|
||||
stop: "স্থগিত করা হয়েছে"
|
||||
_type:
|
||||
none: "প্রকাশ করা হচ্ছে"
|
||||
_role:
|
||||
priority: "অগ্রাধিকার"
|
||||
_priority:
|
||||
@@ -1000,7 +1017,6 @@ _theme:
|
||||
buttonBg: "বাটনের পটভূমি"
|
||||
buttonHoverBg: "বাটনের পটভূমি (হভার)"
|
||||
inputBorder: "ইনপুট ফিল্ডের বর্ডার"
|
||||
listItemHoverBg: "লিস্ট আইটেমের পটভূমি (হোভার)"
|
||||
driveFolderBg: "ড্রাইভ ফোল্ডারের পটভূমি"
|
||||
wallpaperOverlay: "ওয়ালপেপার ওভারলে"
|
||||
badge: "ব্যাজ"
|
||||
@@ -1012,8 +1028,6 @@ _sfx:
|
||||
note: "নোটগুলি"
|
||||
noteMy: "নোট (আপনার)"
|
||||
notification: "বিজ্ঞপ্তি"
|
||||
antenna: "অ্যান্টেনাগুলি"
|
||||
channel: "চ্যানেলের বিজ্ঞপ্তি"
|
||||
_ago:
|
||||
future: "ভবিষ্যৎ"
|
||||
justNow: "এইমাত্র"
|
||||
@@ -1037,6 +1051,7 @@ _2fa:
|
||||
step3: "অ্যাপে প্রদর্শিত টোকেনটি লিখুন এবং আপনার কাজ শেষ।"
|
||||
step4: "আপনাকে এখন থেকে লগ ইন করার সময়, এইভাবে টোকেন লিখতে হবে।"
|
||||
securityKeyInfo: "আপনি একটি হার্ডওয়্যার সিকিউরিটি কী ব্যবহার করে লগ ইন করতে পারেন যা FIDO2 বা ডিভাইসের ফিঙ্গারপ্রিন্ট সেন্সর বা পিন সমর্থন করে৷"
|
||||
renewTOTPCancel: "না, ধন্যবাদ"
|
||||
_permissions:
|
||||
"read:account": "অ্যাকাউন্টের তথ্য দেখুন"
|
||||
"write:account": "অ্যাকাউন্টের তথ্য সম্পাদন করুন"
|
||||
@@ -1175,6 +1190,7 @@ _profile:
|
||||
changeBanner: "ব্যানার পরিবর্তন করুন"
|
||||
_exportOrImport:
|
||||
allNotes: "সকল নোট"
|
||||
clips: "ক্লিপ"
|
||||
followingList: "অনুসরণ করা হচ্ছে"
|
||||
muteList: "মিউট"
|
||||
blockingList: "ব্লক"
|
||||
@@ -1222,9 +1238,6 @@ _pages:
|
||||
newPage: "নতুন পৃষ্ঠা বানান"
|
||||
editPage: "পৃষ্ঠাটি সম্পাদনা করুন"
|
||||
readPage: "উৎস দেখছেন"
|
||||
created: "পৃষ্ঠা তৈরি করা হয়েছে"
|
||||
updated: "পৃষ্ঠা সম্পাদনা করা হয়েছে"
|
||||
deleted: "পৃষ্ঠা মুছে ফেলা হয়েছে"
|
||||
pageSetting: "পৃষ্ঠার সেটিংস"
|
||||
nameAlreadyExists: "পৃষ্ঠার URLটি ইতিমধ্যেই ব্যাবহার করা হয়েছে"
|
||||
invalidNameTitle: "পৃষ্ঠার URL অবৈধ"
|
||||
@@ -1293,6 +1306,7 @@ _notification:
|
||||
pollEnded: "পোল শেষ"
|
||||
receiveFollowRequest: "প্রাপ্ত অনুসরণের অনুরোধসমূহ"
|
||||
followRequestAccepted: "গৃহীত অনুসরণের অনুরোধসমূহ"
|
||||
login: "প্রবেশ করুন"
|
||||
app: "লিঙ্ক করা অ্যাপ থেকে বিজ্ঞপ্তি"
|
||||
_actions:
|
||||
followBack: "ফলো ব্যাক করেছে"
|
||||
@@ -1323,6 +1337,18 @@ _deck:
|
||||
_webhookSettings:
|
||||
name: "নাম"
|
||||
active: "চালু"
|
||||
_abuseReport:
|
||||
_notificationRecipient:
|
||||
_recipientType:
|
||||
mail: "ইমেইল"
|
||||
_moderationLogTypes:
|
||||
suspend: "স্থগিত করা"
|
||||
resetPassword: "পাসওয়ার্ড রিসেট করুন"
|
||||
_reversi:
|
||||
total: "মোট"
|
||||
_remoteLookupErrors:
|
||||
_noSuchObject:
|
||||
title: "পাওয়া যায়নি"
|
||||
_search:
|
||||
searchScopeAll: "সবগুলো"
|
||||
searchScopeLocal: "স্থানীয়"
|
||||
|
2573
locales/ca-ES.yml
2573
locales/ca-ES.yml
File diff suppressed because it is too large
Load Diff
@@ -5,6 +5,7 @@ introMisskey: "Vítejte! Misskey je otevřený a decentralizovaný microblogový
|
||||
poweredByMisskeyDescription: "{name} je jeden ze serverů využívající open source platformu <b>Misskey<b> (nazývaná \"Misskey instance\")."
|
||||
monthAndDay: "{day}. {month}."
|
||||
search: "Vyhledávání"
|
||||
reset: "Obnovit"
|
||||
notifications: "Oznámení"
|
||||
username: "Uživatelské jméno"
|
||||
password: "Heslo"
|
||||
@@ -120,7 +121,6 @@ sensitive: "NSFW"
|
||||
add: "Přidat"
|
||||
reaction: "Reakce"
|
||||
reactions: "Reakce"
|
||||
reactionSetting: "Reakce zobrazené ve výběru reakcí"
|
||||
reactionSettingDescription2: "Přetažením změníte pořadí, kliknutím smažete, zmáčkněte \"+\" k přidání"
|
||||
rememberNoteVisibility: "Zapamatovat nastavení zobrazení poznámky"
|
||||
attachCancel: "Odstranit přílohu"
|
||||
@@ -349,7 +349,6 @@ enableLocalTimeline: "Povolit lokální čas"
|
||||
enableGlobalTimeline: "Povolit globální čas"
|
||||
disablingTimelinesInfo: "Administrátoři a Moderátoři budou mít stálý přístup ke všem časovým osám i přes to že nejsou zapnuté."
|
||||
registration: "Registrace"
|
||||
enableRegistration: "Povolit registraci novým uživatelům"
|
||||
invite: "Pozvat"
|
||||
driveCapacityPerLocalAccount: "Kapacita disku na lokálního uživatele"
|
||||
driveCapacityPerRemoteAccount: "Kapacita disku na vzdáleného uživatele"
|
||||
@@ -367,6 +366,11 @@ hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Aktivovat hCaptchu"
|
||||
hcaptchaSiteKey: "Klíč stránky"
|
||||
hcaptchaSecretKey: "Tajný Klíč (Secret Key)"
|
||||
mcaptcha: "mCaptcha"
|
||||
enableMcaptcha: "Aktivovat mCaptchu"
|
||||
mcaptchaSiteKey: "Klíč stránky"
|
||||
mcaptchaSecretKey: "Tajný Klíč (Secret Key)"
|
||||
mcaptchaInstanceUrl: "URL mCaptcha serveru"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "Zapnout ReCAPTCHu"
|
||||
recaptchaSiteKey: "Klíč stránky"
|
||||
@@ -428,7 +432,6 @@ share: "Sdílet"
|
||||
notFound: "Nenalezeno"
|
||||
notFoundDescription: "Nebyla nalezená žádná stránka korespondující se zadanou URL."
|
||||
uploadFolder: "Výchozí lokace pro upload"
|
||||
cacheClear: "Vymazat cache"
|
||||
markAsReadAllNotifications: "Označit všechna oznámení za přečtená"
|
||||
markAsReadAllUnreadNotes: "Označit všechny příspěvky za přečtené"
|
||||
markAsReadAllTalkMessages: "Označit všechny zprávy za přečtené"
|
||||
@@ -471,7 +474,6 @@ uiLanguage: "Jazyk uživatelského rozhraní"
|
||||
aboutX: "O {x}"
|
||||
emojiStyle: "Styl emoji"
|
||||
native: "Výchozí"
|
||||
disableDrawer: "Nepoužívat šuplíkové menu"
|
||||
showNoteActionsOnlyHover: "Zobrazit akce poznámky jenom při naběhnutí myši"
|
||||
noHistory: "Žádná historie"
|
||||
signinHistory: "Historie přihlášení"
|
||||
@@ -658,10 +660,7 @@ abuseReported: "Nahlášení bylo odesláno. Děkujeme převelice."
|
||||
reporter: "Nahlásil"
|
||||
reporteeOrigin: "Původ nahlášení"
|
||||
reporterOrigin: "Původ nahlasovače"
|
||||
forwardReport: "Přeposlat nahlášení do vzdálené instance"
|
||||
forwardReportIsAnonymous: "Místo vašeho účtu se ve vzdálené instanci zobrazí anonymní systémový účet jako nahlašovač."
|
||||
send: "Odeslat"
|
||||
abuseMarkAsResolved: "Označit nahlášení jako vyřešené"
|
||||
openInNewTab: "Otevřít v nové kartě"
|
||||
openInSideView: "Otevřít v bočním panelu"
|
||||
defaultNavigationBehaviour: "Výchozí chování navigace"
|
||||
@@ -856,8 +855,6 @@ makeReactionsPublicDescription: "Tohle zviditelný seznam vašich předchozích
|
||||
classic: "Klasický"
|
||||
muteThread: "Ztlumit vlákno"
|
||||
unmuteThread: "Zrušit ztlumení vlákna"
|
||||
ffVisibility: "Viditelnost Sledovaných/Sledujících"
|
||||
ffVisibilityDescription: "Umožní vám nastavit kdo uvidí koho sledujete a kdo vás sleduje."
|
||||
continueThread: "Zobrazit pokračování vlákna"
|
||||
deleteAccountConfirm: "Tohle nenávratně smaže váš účet, chcete pokračovat?"
|
||||
incorrectPassword: "Nesprávné heslo."
|
||||
@@ -1007,6 +1004,7 @@ resetPasswordConfirm: "Opravdu chcete resetovat heslo?"
|
||||
sensitiveWords: "Citlivá slova"
|
||||
sensitiveWordsDescription: "Viditelnost všech poznámek obsahujících některé z nakonfigurovaných slov bude automaticky nastavena na \"Domů\". Můžete jich uvést více tak, že je oddělíte pomocí řádků."
|
||||
sensitiveWordsDescription2: "Použití mezer vytvoří výrazy AND a obklopení klíčových slov lomítky je změní na regulární výraz."
|
||||
prohibitedWordsDescription2: "Použití mezer vytvoří výrazy AND a obklopení klíčových slov lomítky je změní na regulární výraz."
|
||||
notesSearchNotAvailable: "Vyhledávání poznámek je nedostupné."
|
||||
license: "Licence"
|
||||
unfavoriteConfirm: "Opravdu chcete odstranit z oblíbených?"
|
||||
@@ -1096,6 +1094,15 @@ iHaveReadXCarefullyAndAgree: "Přečetl jsem si text \"{x}\" a souhlasím s ním
|
||||
icon: "Avatar"
|
||||
replies: "Odpovědět"
|
||||
renotes: "Přeposlat"
|
||||
sourceCode: "Zdrojový kód"
|
||||
flip: "Otočit"
|
||||
lastNDays: "Posledních {n} dnů"
|
||||
surrender: "Zrušit"
|
||||
postForm: "Formulář pro odeslání"
|
||||
_delivery:
|
||||
stop: "Suspendováno"
|
||||
_type:
|
||||
none: "Publikuji"
|
||||
_initialAccountSetting:
|
||||
accountCreated: "Váš účet byl úspěšně vytvořen!"
|
||||
letsStartAccountSetup: "Pro začátek si nastavte svůj profil."
|
||||
@@ -1108,7 +1115,6 @@ _initialAccountSetting:
|
||||
pushNotificationDescription: "Povolení push oznámení vám umožní přijímat oznámení od {name} přímo ve vašem zařízení."
|
||||
initialAccountSettingCompleted: "Nastavení profilu dokončeno!"
|
||||
haveFun: "Užívejte {name}!"
|
||||
ifYouNeedLearnMore: "Pokud se chcete dozvědět více o tom, jak používat {name} (Misskey), navštivte {link}."
|
||||
skipAreYouSure: "Opravdu chcete přeskočit nastavení profilu?"
|
||||
laterAreYouSure: "Opravdu chcete provést nastavení profilu později?"
|
||||
_serverRules:
|
||||
@@ -1627,7 +1633,6 @@ _theme:
|
||||
buttonBg: "Pozadí tlačítka"
|
||||
buttonHoverBg: "Pozadí tlačítka (Hover)"
|
||||
inputBorder: "Ohraničení vstupního pole"
|
||||
listItemHoverBg: "Pozadí položky seznamu (Hover)"
|
||||
driveFolderBg: "Pozadí složky disku"
|
||||
wallpaperOverlay: "Překrytí tapety"
|
||||
badge: "Odznak"
|
||||
@@ -1639,8 +1644,6 @@ _sfx:
|
||||
note: "Poznámky"
|
||||
noteMy: "Moje poznámka"
|
||||
notification: "Oznámení"
|
||||
antenna: "Antény"
|
||||
channel: "Oznámení kanálu"
|
||||
_ago:
|
||||
future: "Budoucí"
|
||||
justNow: "Teď"
|
||||
@@ -1657,22 +1660,11 @@ _time:
|
||||
minute: "Minut"
|
||||
hour: "Hodin"
|
||||
day: "Dnů"
|
||||
_timelineTutorial:
|
||||
title: "Jak používat Misskey"
|
||||
step1_1: "Toto je \"časová osa\". Zde se chronologicky zobrazují všechny \"poznámky\" odeslané na {name}."
|
||||
step1_2: "Existuje několik různých časových plánů. Například \"Domácí časová osa\" bude obsahovat poznámky uživatelů, které sledujete, a \"Místní časová osa\" bude obsahovat poznámky všech uživatelů {name}."
|
||||
step2_1: "Zkusme zveřejnit poznámku. Můžete tak učinit stisknutím tlačítka s ikonou tužky."
|
||||
step2_2: "Co takhle napsat sebepředstavení, nebo jen \"Ahoj {name}!\", pokud se vám nechce?"
|
||||
step3_1: "Dokončil jsi svou první poznámku?"
|
||||
step3_2: "Na časové ose by se nyní měla zobrazit vaše první poznámka."
|
||||
step4_1: "K poznámkám můžete také připojit \"Reakce\"."
|
||||
step4_2: "Chcete-li připojit reakci, stiskněte na poznámce znaménko \"+\" a vyberte emoji, kterým chcete reagovat."
|
||||
_2fa:
|
||||
alreadyRegistered: "Již jste zaregistrovali dvoufaktorové ověřovací zařízení."
|
||||
registerTOTP: "Registrovat aplikaci autentizátoru"
|
||||
step1: "Nejprve si do zařízení nainstalujte aplikaci pro ověřování (například {a} nebo {b})."
|
||||
step2: "Poté naskenujte QR kód zobrazený na této obrazovce."
|
||||
step2Click: "Kliknutím na tento QR kód můžete zaregistrovat 2FA do bezpečnostního klíče nebo aplikace autentizace telefonu."
|
||||
step3Title: "Zadejte ověřovací kód"
|
||||
step3: "Pro dokončení nastavení zadejte token poskytnutý vaší aplikací."
|
||||
step4: "Od této chvíle budou všechny budoucí pokusy o přihlášení vyžadovat tento přihlašovací token."
|
||||
@@ -1726,7 +1718,7 @@ _auth:
|
||||
shareAccessTitle: "Udělovat oprávnění k aplikacím"
|
||||
shareAccess: "Chcete autorizovat \"{name}\" pro přístup k tomuto účtu?"
|
||||
shareAccessAsk: "Opravdu chcete této aplikaci povolit přístup k vašemu účtu?"
|
||||
permission: "{jméno} požaduje tato oprávnění"
|
||||
permission: "{name} požaduje tato oprávnění"
|
||||
permissionAsk: "Tato aplikace požaduje následující oprávnění"
|
||||
pleaseGoBack: "Vraťte se prosím zpět do aplikace"
|
||||
callback: "Návrat k aplikaci"
|
||||
@@ -1839,6 +1831,7 @@ _profile:
|
||||
_exportOrImport:
|
||||
allNotes: "Všechny poznámky"
|
||||
favoritedNotes: "Oblíbené poznámky"
|
||||
clips: "Oříznout"
|
||||
followingList: "Sledovaní"
|
||||
muteList: "Ztlumit"
|
||||
blockingList: "Zablokovat"
|
||||
@@ -1895,9 +1888,6 @@ _pages:
|
||||
newPage: "Vytvořit novou stránku"
|
||||
editPage: "Upravit stránku"
|
||||
readPage: "Prohlížení zdroje této stránky"
|
||||
created: "Stránka byla úspěšně vytvořena"
|
||||
updated: "Stránka byla úspěšně aktualizována"
|
||||
deleted: "Stránka byla úspěšně smazána"
|
||||
pageSetting: "Nastavení stránky"
|
||||
nameAlreadyExists: "Zadaná adresa URL stránky již existuje"
|
||||
invalidNameTitle: "Zadaná adresa URL stránky je neplatná"
|
||||
@@ -1949,7 +1939,7 @@ _notification:
|
||||
youGotMention: "{name} vás zmínil"
|
||||
youGotReply: "{name} vám odpověděl"
|
||||
youGotQuote: "{name} vás citoval"
|
||||
youRenoted: "Poznámka od {jméno}"
|
||||
youRenoted: "Poznámka od {name}"
|
||||
youWereFollowed: "Máte nového následovníka"
|
||||
youReceivedFollowRequest: "Obdrželi jste žádost o sledování"
|
||||
yourFollowRequestAccepted: "Vaše žádost o sledování byla přijata"
|
||||
@@ -1969,6 +1959,7 @@ _notification:
|
||||
receiveFollowRequest: "Obdržené žádosti o sledování"
|
||||
followRequestAccepted: "Přijaté žádosti o sledování"
|
||||
achievementEarned: "Úspěch odemčen"
|
||||
login: "Přihlásit se"
|
||||
app: "Oznámení z propojených aplikací"
|
||||
_actions:
|
||||
followBack: "vás začal sledovat zpět"
|
||||
@@ -2016,7 +2007,6 @@ _webhookSettings:
|
||||
createWebhook: "Vytvořit Webhook"
|
||||
name: "Jméno"
|
||||
secret: "Tajné"
|
||||
events: "Události Webhook"
|
||||
active: "Zapnuto"
|
||||
_events:
|
||||
follow: "Při sledování uživatele"
|
||||
@@ -2026,7 +2016,20 @@ _webhookSettings:
|
||||
renote: "Při renotaci poznámky"
|
||||
reaction: "Při obdržení reakce"
|
||||
mention: "Při zmínce"
|
||||
_abuseReport:
|
||||
_notificationRecipient:
|
||||
_recipientType:
|
||||
mail: "Email"
|
||||
_moderationLogTypes:
|
||||
suspend: "Zmrazit"
|
||||
resetPassword: "Resetovat heslo"
|
||||
createInvitation: "Vygenerovat pozvánku"
|
||||
_reversi:
|
||||
total: "Celkem"
|
||||
_remoteLookupErrors:
|
||||
_noSuchObject:
|
||||
title: "Nenalezeno"
|
||||
_search:
|
||||
searchScopeAll: "Vše"
|
||||
searchScopeLocal: "Místní"
|
||||
searchScopeUser: "Upřesnit uživatele"
|
||||
|
@@ -1,2 +1,4 @@
|
||||
---
|
||||
_lang_: "Dansk"
|
||||
headlineMisskey: ""
|
||||
introMisskey: "ようこそ!Misskeyは、オープンソースの分散型マイクロブログサービスです。\n「ノート」を作成して、いま起こっていることを共有したり、あなたについて皆に発信しよう📡\n「リアクション」機能で、皆のノートに素早く反応を追加することもできます👍\n新しい世界を探検しよう🚀"
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -104,7 +104,6 @@ clickToShow: "Κάντε κλικ για εμφάνιση"
|
||||
add: "Προσθέστε"
|
||||
reaction: "Αντιδράσεις"
|
||||
reactions: "Αντιδράσεις"
|
||||
reactionSetting: "Αντιδράσεις για εμφάνιση στην επιλογή αντίδρασης"
|
||||
reactionSettingDescription2: "Σύρετε για να αλλάξετε τη σειρά, κάντε κλικ για να διαγράψετε, πατήστε \"+\" για να προσθέσετε."
|
||||
rememberNoteVisibility: "Θυμήσου τις ρυθμίσεις ορατότητας σημειώματος"
|
||||
attachCancel: "Διαγραφή αρχείου"
|
||||
@@ -228,7 +227,6 @@ userList: "Λίστες"
|
||||
about: "Πληροφορίες"
|
||||
moderator: "Συντονιστής"
|
||||
moderation: "Συντονισμός"
|
||||
cacheClear: "Εκκαθάριση προσωρινής μνήμης"
|
||||
markAsReadAllNotifications: "Όλες οι ειδοποιήσεις διαβάστηκαν"
|
||||
members: "Μέλη"
|
||||
transfer: "Μεταφορά"
|
||||
@@ -290,6 +288,7 @@ cannotUploadBecauseNoFreeSpace: "Το ανέβασμα απέτυχε λόγω
|
||||
icon: "Εικονίδιο"
|
||||
replies: "Απάντηση"
|
||||
renotes: "Κοινοποίηση σημειώματος"
|
||||
postForm: "Φόρμα δημοσίευσης"
|
||||
_email:
|
||||
_follow:
|
||||
title: "Έχετε ένα νέο ακόλουθο"
|
||||
@@ -303,8 +302,6 @@ _theme:
|
||||
_sfx:
|
||||
note: "Σημειώματα"
|
||||
notification: "Ειδοποιήσεις"
|
||||
antenna: "Αντένες"
|
||||
channel: "Ειδοποιήσεις καναλιών"
|
||||
_ago:
|
||||
future: "Μελλοντικό"
|
||||
justNow: "Μόλις τώρα"
|
||||
@@ -358,6 +355,7 @@ _profile:
|
||||
username: "Όνομα μέλους"
|
||||
_exportOrImport:
|
||||
allNotes: "Όλα τα σημειώματα"
|
||||
clips: "Κλιπ"
|
||||
followingList: "Ακολουθεί"
|
||||
muteList: "Μέλη σε σίγαση"
|
||||
blockingList: "Μπλοκαρισμένα μέλη"
|
||||
@@ -381,6 +379,7 @@ _notification:
|
||||
renote: "Κοινοποίηση σημειώματος"
|
||||
quote: "Παράθεση"
|
||||
reaction: "Αντιδράσεις"
|
||||
login: "Σύνδεση"
|
||||
_actions:
|
||||
reply: "Απάντηση"
|
||||
renote: "Κοινοποίηση σημειώματος"
|
||||
@@ -397,3 +396,7 @@ _webhookSettings:
|
||||
name: "Όνομα"
|
||||
_moderationLogTypes:
|
||||
suspend: "Αποβολή"
|
||||
_reversi:
|
||||
total: "Σύνολο"
|
||||
_search:
|
||||
searchScopeLocal: "Τοπικό"
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -5,13 +5,17 @@ introMisskey: "¡Bienvenido/a! Misskey es un servicio de microblogging descentra
|
||||
poweredByMisskeyDescription: "{name} es uno de los servicios (también llamado instancia) que usa la plataforma de código abierto <b>Misskey</b>"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Buscar"
|
||||
reset: "Reiniciar"
|
||||
notifications: "Notificaciones"
|
||||
username: "Nombre de usuario"
|
||||
password: "Contraseña"
|
||||
initialPasswordForSetup: "Contraseña para iniciar la inicialización"
|
||||
initialPasswordIsIncorrect: "La contraseña para iniciar la configuración inicial es incorrecta."
|
||||
initialPasswordForSetupDescription: "Si ha instalado Misskey usted mismo, utilice la contraseña introducida en el archivo de configuración.\nSi utiliza un servicio de alojamiento de Misskey o similar, utilice la contraseña proporcionada.\nSi no ha establecido una contraseña, déjela en blanco para continuar."
|
||||
forgotPassword: "Olvidé mi contraseña"
|
||||
fetchingAsApObject: "Buscando en el fediverso"
|
||||
ok: "OK"
|
||||
gotIt: "Entendido"
|
||||
gotIt: "¡Lo tengo!"
|
||||
cancel: "Cancelar"
|
||||
noThankYou: "No gracias"
|
||||
enterUsername: "Introduce el nombre de usuario"
|
||||
@@ -45,6 +49,7 @@ pin: "Fijar al perfil"
|
||||
unpin: "Desfijar"
|
||||
copyContent: "Copiar contenido"
|
||||
copyLink: "Copiar enlace"
|
||||
copyRemoteLink: "Copiar enlace remoto"
|
||||
copyLinkRenote: "Copiar enlace de renota"
|
||||
delete: "Borrar"
|
||||
deleteAndEdit: "Borrar y editar"
|
||||
@@ -60,6 +65,7 @@ copyFileId: "Copiar ID del archivo"
|
||||
copyFolderId: "Copiar ID de carpeta"
|
||||
copyProfileUrl: "Copiar la URL del perfil"
|
||||
searchUser: "Buscar un usuario"
|
||||
searchThisUsersNotes: ""
|
||||
reply: "Responder"
|
||||
loadMore: "Ver más"
|
||||
showMore: "Ver más"
|
||||
@@ -108,11 +114,14 @@ enterEmoji: "Ingresar emojis"
|
||||
renote: "Renotar"
|
||||
unrenote: "Quitar renota"
|
||||
renoted: "Renotado"
|
||||
renotedToX: "{name} usuarios han renotado。"
|
||||
cantRenote: "No se puede renotar este post"
|
||||
cantReRenote: "No se puede renotar una renota"
|
||||
quote: "Citar"
|
||||
inChannelRenote: "Renota sólo del canal"
|
||||
inChannelQuote: "Cita sólo del canal"
|
||||
renoteToChannel: "Renotar a otro canal"
|
||||
renoteToOtherChannel: "Renotar a otro canal"
|
||||
pinnedNote: "Nota fijada"
|
||||
pinned: "Fijar al perfil"
|
||||
you: "Tú"
|
||||
@@ -121,10 +130,16 @@ sensitive: "Marcado como sensible"
|
||||
add: "Agregar"
|
||||
reaction: "Reacción"
|
||||
reactions: "Reacción"
|
||||
reactionSetting: "Reacciones para mostrar en el menú de reacciones"
|
||||
emojiPicker: "Selector de emojis"
|
||||
pinnedEmojisForReactionSettingDescription: "Puedes seleccionar reacciones para fijarlos en el selector"
|
||||
pinnedEmojisSettingDescription: "Puedes seleccionar emojis para fijarlos en el selector"
|
||||
emojiPickerDisplay: "Mostrar el selector de emojis"
|
||||
overwriteFromPinnedEmojisForReaction: "Sobreescribir las reacciones fijadas"
|
||||
overwriteFromPinnedEmojis: "Sobreescribir los emojis fijados"
|
||||
reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir."
|
||||
rememberNoteVisibility: "Recordar visibilidad"
|
||||
attachCancel: "Quitar adjunto"
|
||||
deleteFile: "Archivo eliminado"
|
||||
markAsSensitive: "Marcar como sensible"
|
||||
unmarkAsSensitive: "Desmarcar como sensible"
|
||||
enterFileName: "Ingrese el nombre del archivo"
|
||||
@@ -145,6 +160,7 @@ editList: "Editar lista"
|
||||
selectChannel: "Seleccionar canal"
|
||||
selectAntenna: "Seleccionar antena"
|
||||
editAntenna: "Editar antena"
|
||||
createAntenna: "Crear una antena"
|
||||
selectWidget: "Seleccionar widget"
|
||||
editWidgets: "Editar widgets"
|
||||
editWidgetsExit: "Terminar edición"
|
||||
@@ -171,6 +187,10 @@ addAccount: "Agregar Cuenta"
|
||||
reloadAccountsList: "Recargar lista de cuentas"
|
||||
loginFailed: "Error al iniciar sesión."
|
||||
showOnRemote: "Ver en una instancia remota"
|
||||
continueOnRemote: "Ver en una instancia remota"
|
||||
chooseServerOnMisskeyHub: "Elegir un servidor en Misskey Hub"
|
||||
specifyServerHost: "Especifica una instancia directamente"
|
||||
inputHostName: "Introduzca el dominio"
|
||||
general: "General"
|
||||
wallpaper: "Fondo de pantalla"
|
||||
setWallpaper: "Establecer fondo de pantalla"
|
||||
@@ -181,6 +201,7 @@ followConfirm: "¿Desea seguir a {name}?"
|
||||
proxyAccount: "Cuenta proxy"
|
||||
proxyAccountDescription: "Una cuenta proxy es una cuenta que actúa como un seguidor remoto de un usuario bajo ciertas condiciones. Por ejemplo, cuando un usuario añade un usuario remoto a una lista, si ningún usuario local sigue al usuario agregado a la lista, la instancia no puede obtener su actividad. Así que la cuenta proxy sigue al usuario añadido a la lista"
|
||||
host: "Host"
|
||||
selectSelf: "Elígete a ti mismo"
|
||||
selectUser: "Elegir usuario"
|
||||
recipient: "Recipiente"
|
||||
annotation: "Anotación"
|
||||
@@ -196,6 +217,7 @@ perDay: "por día"
|
||||
stopActivityDelivery: "Dejar de enviar actividades"
|
||||
blockThisInstance: "Bloquear instancia"
|
||||
silenceThisInstance: "Silenciar esta instancia"
|
||||
mediaSilenceThisInstance: "Silencia la Multimedia(Imágenes,videos...) para este servidor"
|
||||
operations: "Operaciones"
|
||||
software: "Software"
|
||||
version: "Versión"
|
||||
@@ -217,6 +239,10 @@ blockedInstances: "Instancias bloqueadas"
|
||||
blockedInstancesDescription: "Seleccione los hosts de las instancias que desea bloquear, separadas por una linea nueva. Las instancias bloqueadas no podrán comunicarse con esta instancia."
|
||||
silencedInstances: "Instancias silenciadas"
|
||||
silencedInstancesDescription: "Listar los hostname de las instancias que quieres silenciar. Todas las cuentas de las instancias listadas serán tratadas como silenciadas, solo podrán hacer peticiones de seguimiento, y no podrán mencionar cuentas locales si no las siguen. Esto no afecta a las instancias bloqueadas."
|
||||
mediaSilencedInstances: "Servidores silenciados (Multimedia)"
|
||||
mediaSilencedInstancesDescription: "Listar las instancias que quieres silenciar. Todas las cuentas de las instancias listadas serán tratadas como silenciadas, solo podrán hacer peticiones de seguimiento, y no podrán mencionar cuentas locales si no las siguen. Esto no afecta a las instancias bloqueadas."
|
||||
federationAllowedHosts: "Servidores federados"
|
||||
federationAllowedHostsDescription: "Establezca los nombres de los servidores que pueden federarse, separados por una nueva línea."
|
||||
muteAndBlock: "Silenciar y bloquear"
|
||||
mutedUsers: "Usuarios silenciados"
|
||||
blockedUsers: "Usuarios bloqueados"
|
||||
@@ -229,7 +255,7 @@ done: "Terminado"
|
||||
processing: "Procesando"
|
||||
preview: "Vista previa"
|
||||
default: "Predeterminado"
|
||||
defaultValueIs: "Predeterminado"
|
||||
defaultValueIs: "Por defecto: {value}"
|
||||
noCustomEmojis: "No hay emojis personalizados"
|
||||
noJobs: "No hay trabajos"
|
||||
federating: "Federando"
|
||||
@@ -261,6 +287,7 @@ removed: "Borrado"
|
||||
removeAreYouSure: "¿Desea borrar \"{x}\"?"
|
||||
deleteAreYouSure: "¿Desea borrar \"{x}\"?"
|
||||
resetAreYouSure: "¿Desea reestablecer?"
|
||||
areYouSure: "¿Estás conforme?"
|
||||
saved: "Guardado"
|
||||
messaging: "Chat"
|
||||
upload: "Subir"
|
||||
@@ -295,7 +322,7 @@ location: "Lugar"
|
||||
theme: "Tema"
|
||||
themeForLightMode: "Tema para usar en Modo Linterna"
|
||||
themeForDarkMode: "Tema para usar en Modo Oscuro"
|
||||
light: "Linterna"
|
||||
light: "Claro"
|
||||
dark: "Oscuro"
|
||||
lightThemes: "Tema claro"
|
||||
darkThemes: "Tema oscuro"
|
||||
@@ -306,12 +333,15 @@ selectFile: "Elegir archivo"
|
||||
selectFiles: "Elegir archivos"
|
||||
selectFolder: "Seleccione una carpeta"
|
||||
selectFolders: "Seleccione carpetas"
|
||||
fileNotSelected: "Archivo no seleccionado."
|
||||
renameFile: "Renombrar archivo"
|
||||
folderName: "Nombre de la carpeta"
|
||||
createFolder: "Crear carpeta"
|
||||
renameFolder: "Renombrar carpeta"
|
||||
deleteFolder: "Borrar carpeta"
|
||||
folder: "Carpeta"
|
||||
addFile: "Agregar archivo"
|
||||
showFile: "Examinar archivos"
|
||||
emptyDrive: "El drive está vacío"
|
||||
emptyFolder: "La carpeta está vacía"
|
||||
unableToDelete: "No se puede borrar"
|
||||
@@ -354,7 +384,6 @@ enableLocalTimeline: "Habilitar linea de tiempo local"
|
||||
enableGlobalTimeline: "Habilitar linea de tiempo global"
|
||||
disablingTimelinesInfo: "Aunque se desactiven estas lineas de tiempo, por conveniencia el administrador y los moderadores pueden seguir usándolos"
|
||||
registration: "Registro"
|
||||
enableRegistration: "Permitir nuevos registros"
|
||||
invite: "Invitar"
|
||||
driveCapacityPerLocalAccount: "Capacidad del drive por usuario local"
|
||||
driveCapacityPerRemoteAccount: "Capacidad del drive por usuario remoto"
|
||||
@@ -372,6 +401,11 @@ hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Habilitar hCaptcha"
|
||||
hcaptchaSiteKey: "Clave del sitio"
|
||||
hcaptchaSecretKey: "Clave secreta"
|
||||
mcaptcha: "mCaptcha"
|
||||
enableMcaptcha: "Activar mCaptcha"
|
||||
mcaptchaSiteKey: "Clave del sitio"
|
||||
mcaptchaSecretKey: "Clave secreta"
|
||||
mcaptchaInstanceUrl: "URL del servidor mCaptcha"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "activar reCAPTCHA"
|
||||
recaptchaSiteKey: "Clave del sitio"
|
||||
@@ -387,6 +421,7 @@ name: "Nombre"
|
||||
antennaSource: "Origen de la antena"
|
||||
antennaKeywords: "Palabras clave para recibir"
|
||||
antennaExcludeKeywords: "Palabras clave para excluir"
|
||||
antennaExcludeBots: "Excluir bots"
|
||||
antennaKeywordsDescription: "Separar con espacios es una declaración AND, separar con una linea nueva es una declaración OR"
|
||||
notifyAntenna: "Notificar nueva nota"
|
||||
withFileAntenna: "Sólo notas con archivos adjuntados"
|
||||
@@ -420,6 +455,7 @@ totpDescription: "Ingresa una contaseña de un sólo uso usando la aplicación a
|
||||
moderator: "Moderador"
|
||||
moderation: "Moderación"
|
||||
moderationNote: "Nota de moderación"
|
||||
moderationNoteDescription: "Puedes rellenar notas que solo se comparten entre moderadores."
|
||||
addModerationNote: "Añadir nota de moderación"
|
||||
moderationLogs: "Log de moderación"
|
||||
nUsersMentioned: "{n} usuarios mencionados"
|
||||
@@ -437,7 +473,6 @@ share: "Compartir"
|
||||
notFound: "No se encuentra"
|
||||
notFoundDescription: "No se encontró la página correspondiente a la URL elegida"
|
||||
uploadFolder: "Carpeta de subidas por defecto"
|
||||
cacheClear: "Borrar caché"
|
||||
markAsReadAllNotifications: "Marcar todas las notificaciones como leídas"
|
||||
markAsReadAllUnreadNotes: "Marcar todas las notas como leídas"
|
||||
markAsReadAllTalkMessages: "Marcar todos los chats como leídos"
|
||||
@@ -455,10 +490,12 @@ retype: "Ingrese de nuevo"
|
||||
noteOf: "Notas de {user}"
|
||||
quoteAttached: "Cita añadida"
|
||||
quoteQuestion: "¿Quiere añadir una cita?"
|
||||
attachAsFileQuestion: "El texto del portapapeles es demasiado grande ¿Desea adjuntarlo como archivo de texto?"
|
||||
noMessagesYet: "Aún no hay chat"
|
||||
newMessageExists: "Tienes un mensaje nuevo"
|
||||
onlyOneFileCanBeAttached: "Solo se puede añadir un archivo al mensaje"
|
||||
signinRequired: "Iniciar sesión"
|
||||
signinOrContinueOnRemote: "Para continuar, tendrá que ir a su servidor o registrarse e iniciar sesión en este servidor"
|
||||
invitations: "Invitar"
|
||||
invitationCode: "Código de invitación"
|
||||
checking: "Comprobando"
|
||||
@@ -480,8 +517,12 @@ uiLanguage: "Idioma de visualización de la interfaz"
|
||||
aboutX: "Acerca de {x}"
|
||||
emojiStyle: "Estilo de emoji"
|
||||
native: "Nativo"
|
||||
disableDrawer: "No mostrar los menús en cajones"
|
||||
menuStyle: "Diseño del menú"
|
||||
style: "Diseño"
|
||||
drawer: "Cajón de Aplicaciones"
|
||||
popup: "Ventana emergente"
|
||||
showNoteActionsOnlyHover: "Mostrar acciones de la nota sólo al pasar el cursor"
|
||||
showReactionsCount: "Mostrar el número de reacciones en las notas"
|
||||
noHistory: "No hay datos en el historial"
|
||||
signinHistory: "Historial de ingresos"
|
||||
enableAdvancedMfm: "Habilitar MFM avanzado"
|
||||
@@ -544,7 +585,10 @@ showInPage: "Mostrar en la página"
|
||||
popout: "Popout"
|
||||
volume: "Volumen"
|
||||
masterVolume: "Volumen principal"
|
||||
notUseSound: "Sin sonido"
|
||||
useSoundOnlyWhenActive: "Sonar solo cuando Misskey esté activo"
|
||||
details: "Detalles"
|
||||
renoteDetails: "Detalles(Renota)"
|
||||
chooseEmoji: "Elije un emoji"
|
||||
unableToProcess: "La operación no se puede llevar a cabo"
|
||||
recentUsed: "Usado recientemente"
|
||||
@@ -560,10 +604,16 @@ ascendingOrder: "Ascendente"
|
||||
descendingOrder: "Descendente"
|
||||
scratchpad: "Scratch pad"
|
||||
scratchpadDescription: "Scratchpad proporciona un entorno experimental para AiScript. Puede escribir, ejecutar y verificar los resultados que interactúan con Misskey."
|
||||
uiInspector: "Inspector de UI"
|
||||
uiInspectorDescription: "Puedes visualizar una lista de elementos UI presentes en la memoria. Los componentes de la interfaz de usuario son generados por las funciones UI:C:"
|
||||
output: "Salida"
|
||||
script: "Script"
|
||||
disablePagesScript: "Deshabilitar AiScript en Páginas"
|
||||
updateRemoteUser: "Actualizar información de usuario remoto"
|
||||
unsetUserAvatar: "Quitar avatar"
|
||||
unsetUserAvatarConfirm: "¿Confirmas que quieres quitar tu avatar?"
|
||||
unsetUserBanner: "Quitar banner"
|
||||
unsetUserBannerConfirm: "¿Confirmas que quieres quitar tu banner?"
|
||||
deleteAllFiles: "Borrar todos los archivos"
|
||||
deleteAllFilesConfirm: "¿Desea borrar todos los archivos?"
|
||||
removeAllFollowing: "Retener todos los siguientes"
|
||||
@@ -614,6 +664,7 @@ medium: "Mediano"
|
||||
small: "Pequeño"
|
||||
generateAccessToken: "Generar token de acceso"
|
||||
permission: "Permisos"
|
||||
adminPermission: "Permiso de administrador"
|
||||
enableAll: "Activar todo"
|
||||
disableAll: "Desactivar todo"
|
||||
tokenRequested: "Permiso de acceso a la cuenta"
|
||||
@@ -635,10 +686,15 @@ smtpSecure: "Usar SSL/TLS implícito en la conexión SMTP"
|
||||
smtpSecureInfo: "Apagar cuando se use STARTTLS"
|
||||
testEmail: "Prueba de envío"
|
||||
wordMute: "Silenciar palabras"
|
||||
wordMuteDescription: "Minimiza las notas que contienen la palabra o frase especificada. Las notas minimizadas pueden visualizarse haciendo clic sobre ellas."
|
||||
hardWordMute: "Filtro de palabra fuerte"
|
||||
showMutedWord: "Mostrar palabras silenciadas."
|
||||
hardWordMuteDescription: "Oculta las notas que contienen la palabra o frase especificada. A diferencia de Silenciar palabra, la nota quedará completamente oculta a la vista."
|
||||
regexpError: "Error de la expresión regular"
|
||||
regexpErrorDescription: "Ocurrió un error en la expresión regular en la linea {line} de las palabras muteadas {tab}"
|
||||
instanceMute: "Instancias silenciadas"
|
||||
userSaysSomething: "{name} dijo algo"
|
||||
userSaysSomethingAbout: "{name} dijo algo sobre {word}"
|
||||
makeActive: "Activar"
|
||||
display: "Apariencia"
|
||||
copy: "Copiar"
|
||||
@@ -656,6 +712,7 @@ useGlobalSettingDesc: "Al activarse, se usará la configuración de notificacion
|
||||
other: "Otro"
|
||||
regenerateLoginToken: "Regenerar token de login"
|
||||
regenerateLoginTokenDescription: "Regenerar el token usado internamente durante el login. No siempre es necesario hacerlo. Al hacerlo de nuevo, se deslogueará en todos los dispositivos."
|
||||
theKeywordWhenSearchingForCustomEmoji: "Palabra clave para buscar el emoji personalizado."
|
||||
setMultipleBySeparatingWithSpace: "Puedes añadir mas de uno, separado por espacios."
|
||||
fileIdOrUrl: "Id del archivo o URL"
|
||||
behavior: "Comportamiento"
|
||||
@@ -669,10 +726,7 @@ abuseReported: "Se ha enviado el reporte. Muchas gracias."
|
||||
reporter: "Reportador"
|
||||
reporteeOrigin: "Reportar a"
|
||||
reporterOrigin: "Origen del reporte"
|
||||
forwardReport: "Transferir un informe a una instancia remota"
|
||||
forwardReportIsAnonymous: "No puede ver su información de la instancia remota y aparecerá como una cuenta anónima del sistema"
|
||||
send: "Enviar"
|
||||
abuseMarkAsResolved: "Marcar reporte como resuelto"
|
||||
openInNewTab: "Abrir en una Nueva Pestaña"
|
||||
openInSideView: "Abrir en una vista al costado"
|
||||
defaultNavigationBehaviour: "Navegación por defecto"
|
||||
@@ -809,6 +863,7 @@ administration: "Administrar"
|
||||
accounts: "Cuentas"
|
||||
switch: "Cambiar"
|
||||
noMaintainerInformationWarning: "No se ha establecido la información del administrador"
|
||||
noInquiryUrlWarning: "No se ha guardado la URL de consulta."
|
||||
noBotProtectionWarning: "La protección contra los bots no está configurada"
|
||||
configure: "Configurar"
|
||||
postToGallery: "Crear una nueva publicación en la galería"
|
||||
@@ -868,11 +923,12 @@ makeReactionsPublicDescription: "Todas las reacciones que hayas hecho serán pú
|
||||
classic: "Clásico"
|
||||
muteThread: "Silenciar hilo"
|
||||
unmuteThread: "Mostrar hilo"
|
||||
ffVisibility: "Visibilidad de seguidores y seguidos"
|
||||
ffVisibilityDescription: "Puedes configurar quien puede ver a quienes sigues y quienes te siguen"
|
||||
followingVisibility: "Visibilidad de seguidos"
|
||||
followersVisibility: "Visibilidad de seguidores"
|
||||
continueThread: "Ver la continuación del hilo"
|
||||
deleteAccountConfirm: "La cuenta será borrada. ¿Está seguro?"
|
||||
incorrectPassword: "La contraseña es incorrecta"
|
||||
incorrectTotp: "La contraseña de un solo uso es incorrecta o ha caducado."
|
||||
voteConfirm: "¿Confirma su voto a {choice}?"
|
||||
hide: "Ocultar"
|
||||
useDrawerReactionPickerForMobile: "Mostrar panel de reacciones en móviles"
|
||||
@@ -897,6 +953,9 @@ oneHour: "1 hora"
|
||||
oneDay: "1 día"
|
||||
oneWeek: "1 semana"
|
||||
oneMonth: "1 mes"
|
||||
threeMonths: "Tres meses"
|
||||
oneYear: "Un año"
|
||||
threeDays: "Tres días"
|
||||
reflectMayTakeTime: "Puede pasar un tiempo hasta que se reflejen los cambios"
|
||||
failedToFetchAccountInformation: "No se pudo obtener información de la cuenta"
|
||||
rateLimitExceeded: "Se excedió el límite de peticiones"
|
||||
@@ -970,6 +1029,7 @@ neverShow: "No mostrar de nuevo"
|
||||
remindMeLater: "Recordar después"
|
||||
didYouLikeMisskey: "¿Te gusta Misskey?"
|
||||
pleaseDonate: "{host} usa el software gratuito Misskey. Por favor ¡Considera donar al proyecto principal para que podamos continuar!"
|
||||
correspondingSourceIsAvailable: "El código fuente correspondiente se encuentra disponible en {anchor}"
|
||||
roles: "Roles"
|
||||
role: "Rol"
|
||||
noRole: "Rol no encontrado"
|
||||
@@ -979,6 +1039,7 @@ assign: "Asignar"
|
||||
unassign: "Quitar"
|
||||
color: "Color"
|
||||
manageCustomEmojis: "Administrar emojis personalizados"
|
||||
manageAvatarDecorations: "Administrar decoraciones de avatar"
|
||||
youCannotCreateAnymore: "Has llegado al límite de creaciones."
|
||||
cannotPerformTemporary: "Temporalmente no disponible"
|
||||
cannotPerformTemporaryDescription: "Esta acción no se puede realizar porque se excedió el límite de ejecución. Espera un poco y prueba de nuevo."
|
||||
@@ -996,6 +1057,7 @@ thisPostMayBeAnnoyingHome: "Publicar en línea de tiempo 'Inicio'"
|
||||
thisPostMayBeAnnoyingCancel: "detener"
|
||||
thisPostMayBeAnnoyingIgnore: "Publicar de todos modos"
|
||||
collapseRenotes: "Colapsar renotas que ya hayas visto"
|
||||
collapseRenotesDescription: "Contrae notas a las que ya has reaccionado o renotado "
|
||||
internalServerError: "Error interno del servidor"
|
||||
internalServerErrorDescription: "El servidor tuvo un error inesperado."
|
||||
copyErrorInfo: "Copiar detalles del error"
|
||||
@@ -1019,6 +1081,11 @@ resetPasswordConfirm: "¿Realmente quieres cambiar la contraseña?"
|
||||
sensitiveWords: "Palabras sensibles"
|
||||
sensitiveWordsDescription: "La visibilidad de todas las notas que contienen cualquiera de las palabras configuradas serán puestas en \"Inicio\" automáticamente. Puedes enumerás varias separándolas con saltos de línea"
|
||||
sensitiveWordsDescription2: "Si se usan espacios se crearán expresiones AND y las palabras subsecuentes con barras inclinadas se convertirán en expresiones regulares."
|
||||
prohibitedWords: "Palabras explícitas"
|
||||
prohibitedWordsDescription: "Activa un error cuando se intenta publicar una nota que contiene una o varias palabras prohibidas. Se pueden establecer varias palabras, una por línea."
|
||||
prohibitedWordsDescription2: "Si se usan espacios se crearán expresiones AND y las palabras subsecuentes con barras inclinadas se convertirán en expresiones regulares."
|
||||
hiddenTags: "Hashtags ocultos"
|
||||
hiddenTagsDescription: "Selecciona las etiquetas que no se mostrarán en tendencias. Una etiqueta por línea."
|
||||
notesSearchNotAvailable: "No se puede buscar una nota"
|
||||
license: "Licencia"
|
||||
unfavoriteConfirm: "¿Desea quitar de favoritos?"
|
||||
@@ -1029,11 +1096,15 @@ retryAllQueuesConfirmTitle: "Desea ¿reintentar inmediatamente todas las colas?"
|
||||
retryAllQueuesConfirmText: "La carga del servidor está incrementándose temporalmente "
|
||||
enableChartsForRemoteUser: "Generar gráficas de usuarios remotos."
|
||||
enableChartsForFederatedInstances: "Generar gráficos de servidores remotos"
|
||||
enableStatsForFederatedInstances: "Activar las estadísticas de las instancias remotas federadas"
|
||||
showClipButtonInNoteFooter: "Añadir \"Clip\" al menú de notas"
|
||||
reactionsDisplaySize: "Tamaño de las reacciones"
|
||||
limitWidthOfReaction: "Limitar ancho de las reacciones"
|
||||
noteIdOrUrl: "ID o URL de la nota"
|
||||
video: "Video"
|
||||
videos: "Video"
|
||||
audio: "Sonido"
|
||||
audioFiles: "Sonido"
|
||||
dataSaver: "Ahorro de datos"
|
||||
accountMigration: "Migración de cuenta"
|
||||
accountMoved: "Este usuario se movió a una nueva cuenta:"
|
||||
@@ -1061,6 +1132,8 @@ preservedUsernames: "Nombre de usuario reservado"
|
||||
preservedUsernamesDescription: "La lista de nombres de usuario para reservar tienen que separarse con saltos de línea.\nEstos estarán indisponibles durante la creación de cuentas, pero pueden ser usados para que los administradores puedan crear esas cuentas manualmente. Las cuentas existentes con esos nombres de usuario no se verán afectadas."
|
||||
createNoteFromTheFile: "Componer una nota desde éste archivo"
|
||||
archive: "Archivo"
|
||||
archived: "Archivado"
|
||||
unarchive: "Desarchivar"
|
||||
channelArchiveConfirmTitle: "¿Seguro de archivar {name}?"
|
||||
channelArchiveConfirmDescription: "Un canal archivado no aparecerá en la lista de canales ni en los resultados. Las nuevas publicaciones tampoco serán añadidas."
|
||||
thisChannelArchived: "El canal ha sido archivado."
|
||||
@@ -1071,6 +1144,9 @@ preventAiLearning: "Rechazar el uso en el Aprendizaje de Máquinas. (IA Generati
|
||||
preventAiLearningDescription: "Pedirle a las arañas (crawlers) no usar los textos publicados o imágenes en el aprendizaje automático (IA Predictiva / Generativa). Ésto se logra añadiendo una marca respuesta HTML con la cadena \"noai\" al cantenido. Una prevención total no podría lograrse sólo usando ésta marca, ya que puede ser simplemente ignorada."
|
||||
options: "Opción"
|
||||
specifyUser: "Especificar usuario"
|
||||
lookupConfirm: "¿Quiere informarse?"
|
||||
openTagPageConfirm: "¿Quieres abrir la página de etiquetas?"
|
||||
specifyHost: "Especificar Host"
|
||||
failedToPreviewUrl: "No se pudo generar la vista previa"
|
||||
update: "Actualizar"
|
||||
rolesThatCanBeUsedThisEmojiAsReaction: "Roles que pueden usar este emoji como reacción"
|
||||
@@ -1129,16 +1205,128 @@ showRenotes: "Mostrar renotas"
|
||||
edited: "Editado"
|
||||
notificationRecieveConfig: "Ajustes de Notificaciones"
|
||||
mutualFollow: "Os seguís mutuamente"
|
||||
followingOrFollower: "Siguiendo o seguidor"
|
||||
fileAttachedOnly: "Solo notas con archivos"
|
||||
showRepliesToOthersInTimeline: "Mostrar respuestas a otros en la línea de tiempo"
|
||||
hideRepliesToOthersInTimeline: "Ocultar respuestas a otros en la línea de tiempo"
|
||||
showRepliesToOthersInTimelineAll: "Muestra tus respuestas a otros usuarios que sigues en la línea de tiempo"
|
||||
hideRepliesToOthersInTimelineAll: "Ocultar tus respuestas a otros usuarios que sigues en la línea de tiempo"
|
||||
confirmShowRepliesAll: "Esta operación es irreversible. ¿Confirmas que quieres mostrar tus respuestas a otros usuarios que sigues en tu línea de tiempo?"
|
||||
confirmHideRepliesAll: "Esta operación es irreversible. ¿Confirmas que quieres ocultar tus respuestas a otros usuarios que sigues en tu línea de tiempo?"
|
||||
externalServices: "Servicios Externos"
|
||||
sourceCode: "Código fuente"
|
||||
sourceCodeIsNotYetProvided: "El código fuente aún no está disponible. Contacta con el administrador para solucionarlo."
|
||||
repositoryUrl: "URL del repositorio"
|
||||
repositoryUrlDescription: "Si estás usando Misskey tal cual (sin cambios en el código fuente), entra en https://github.com/misskey-dev/misskey"
|
||||
repositoryUrlOrTarballRequired: "Si no has publicado un repositorio aún, deberás publicar un tarball en su lugar. Mira el archivo .config/example.yml para más información."
|
||||
feedback: "Comentarios"
|
||||
feedbackUrl: "URL de comentarios"
|
||||
impressum: "Impressum"
|
||||
impressumUrl: "Impressum URL"
|
||||
impressumDescription: "En algunos países, como Alemania, la inclusión del operador de datos (el Impressum) es requerido legalmente para sitios web comerciales."
|
||||
privacyPolicy: "Política de Privacidad"
|
||||
privacyPolicyUrl: "URL de la Política de Privacidad"
|
||||
tosAndPrivacyPolicy: "Condiciones de Uso y Política de Privacidad"
|
||||
avatarDecorations: "Decoraciones de avatar"
|
||||
attach: "Acoplar"
|
||||
detach: "Quitar"
|
||||
detachAll: "Quitar todo"
|
||||
angle: "Ángulo"
|
||||
flip: "Echar de un capirotazo"
|
||||
showAvatarDecorations: "Mostrar decoraciones de avatar"
|
||||
releaseToRefresh: "Soltar para recargar"
|
||||
refreshing: "Recargando..."
|
||||
pullDownToRefresh: "Tira hacia abajo para recargar"
|
||||
disableStreamingTimeline: "Desactivar actualizaciones en tiempo real de la línea de tiempo"
|
||||
useGroupedNotifications: "Mostrar notificaciones agrupadas"
|
||||
signupPendingError: "Ha habido un problema al verificar tu dirección de correo electrónico. Es posible que el enlace haya caducado."
|
||||
cwNotationRequired: "Si se ha activado \"ocultar contenido\", es necesario proporcionar una descripción."
|
||||
doReaction: "Añadir reacción"
|
||||
code: "Código"
|
||||
reloadRequiredToApplySettings: "Es necesario recargar para que se aplique la configuración."
|
||||
remainingN: "Faltan: {n}"
|
||||
overwriteContentConfirm: "¿Quieres sustituir todo el contenido actual?"
|
||||
seasonalScreenEffect: "Efectos de pantalla asociados a estaciones"
|
||||
decorate: "Decorar"
|
||||
addMfmFunction: "Añadir función MFM"
|
||||
enableQuickAddMfmFunction: "Activar acceso rápido para añadir funciones MFM"
|
||||
bubbleGame: "Bubble Game"
|
||||
sfx: "Efectos de sonido"
|
||||
soundWillBePlayed: "Se reproducirán efectos sonoros"
|
||||
showReplay: "Ver reproducción"
|
||||
replay: "Reproducir"
|
||||
replaying: "Reproduciendo"
|
||||
endReplay: "Terminar reproducción"
|
||||
copyReplayData: "Copiar datos de reproducción"
|
||||
ranking: "Clasificación"
|
||||
lastNDays: "Últimos {n} días"
|
||||
backToTitle: "Regresar al inicio"
|
||||
hemisphere: "Región"
|
||||
withSensitive: "Mostrar notas que contengan material sensible"
|
||||
userSaysSomethingSensitive: "La publicación de {name} contiene material sensible"
|
||||
enableHorizontalSwipe: "Deslice para cambiar de pestaña"
|
||||
loading: "Cargando"
|
||||
surrender: "detener"
|
||||
gameRetry: "Reintentar"
|
||||
notUsePleaseLeaveBlank: "Dejar en blanco si no se usa"
|
||||
useTotp: "Introduce la contraseña de un solo uso"
|
||||
useBackupCode: "Usar códigos de respaldo"
|
||||
launchApp: "Ejecutar la app"
|
||||
useNativeUIForVideoAudioPlayer: "Usar la interfaz del navegador cuando se reproduce audio y vídeo"
|
||||
keepOriginalFilename: "Mantener el nombre original del archivo"
|
||||
keepOriginalFilenameDescription: "Si desactivas esta opción, los nombres de los archivos serán remplazados por una cadena de caracteres aleatoria cuando subas los archivos."
|
||||
noDescription: "No hay descripción"
|
||||
alwaysConfirmFollow: "Confirmar siempre cuando se sigue a alguien"
|
||||
inquiry: "Contacto"
|
||||
tryAgain: "Por favor , inténtalo de nuevo"
|
||||
confirmWhenRevealingSensitiveMedia: "Confirmación cuando se revele contenido sensible"
|
||||
sensitiveMediaRevealConfirm: "Esto puede contener contenido sensible. ¿Estás seguro/a de querer mostrarlo?"
|
||||
createdLists: "Listas creadas"
|
||||
createdAntennas: "Antenas creadas"
|
||||
fromX: "De {x}"
|
||||
genEmbedCode: "Obtener el código para incrustar"
|
||||
noteOfThisUser: "Notas de este usuario"
|
||||
clipNoteLimitExceeded: "No se pueden añadir más notas a este clip."
|
||||
performance: "Rendimiento"
|
||||
modified: "Modificado"
|
||||
discard: "Descartar"
|
||||
thereAreNChanges: "Hay {n} cambio(s)"
|
||||
signinWithPasskey: "Iniciar sesión con clave de acceso"
|
||||
unknownWebAuthnKey: "Esto no se ha registrado llave maestra."
|
||||
passkeyVerificationFailed: "La verificación de la clave de acceso ha fallado."
|
||||
passkeyVerificationSucceededButPasswordlessLoginDisabled: "La verificación de la clave de acceso ha sido satisfactoria pero se ha deshabilitado el inicio de sesión sin contraseña."
|
||||
messageToFollower: "Mensaje a seguidores"
|
||||
target: "Para"
|
||||
federationSpecified: "Este servidor opera en una federación de listas blancas. No puede interactuar con otros servidores que no sean los especificados por el administrador."
|
||||
federationDisabled: "La federación está desactivada en este servidor. No puede interactuar con usuarios de otros servidores"
|
||||
postForm: "Formulario"
|
||||
_settings:
|
||||
webhook: "Webhook"
|
||||
_accountSettings:
|
||||
requireSigninToViewContents: "Se requiere iniciar sesión para ver el contenido"
|
||||
requireSigninToViewContentsDescription1: "Requiere iniciar sesión para ver todas las notas y otros contenidos que hayas creado. Se espera que esto evite que los rastreadores recopilen información."
|
||||
_abuseUserReport:
|
||||
accept: "Acepte"
|
||||
reject: "repudio"
|
||||
_delivery:
|
||||
stop: "Suspendido"
|
||||
_type:
|
||||
none: "Publicando"
|
||||
_bubbleGame:
|
||||
howToPlay: "Cómo jugar"
|
||||
hold: "Mantener"
|
||||
_score:
|
||||
score: "Puntos"
|
||||
scoreYen: "Cantidad de dinero ganada"
|
||||
highScore: "Puntuación más alta"
|
||||
maxChain: "Número máximo de cadenas"
|
||||
yen: "{yen} Yenes"
|
||||
estimatedQty: "{qty} Piezas"
|
||||
scoreSweets: "{onigiriQtyWithUnit} Onigiris"
|
||||
_howToPlay:
|
||||
section1: "Ajuste la posición y deje caer el objeto en la caja"
|
||||
section2: "Cuando dos objetos del mismo tipo se tocan, cambian a otro tipo y consigues puntos"
|
||||
section3: "El juego termina cuando la caja se desborda de objetos. ¡Intenta conseguir una puntuación alta al juntar objetos mientras evitas desbordar la caja!"
|
||||
_announcement:
|
||||
forExistingUsers: "Solo para usuarios registrados"
|
||||
forExistingUsersDescription: "Este anuncio solo se mostrará a aquellos usuarios registrados en el momento de su publicación. Si se deshabilita esta opción, aquellos usuarios que se registren tras su publicación también lo verán."
|
||||
@@ -1148,6 +1336,10 @@ _announcement:
|
||||
tooManyActiveAnnouncementDescription: "Tener demasiados anuncios activos empeora la experiencia de usuario. Por favor, considera archivar aquellos anuncios que hayan quedado obsoletos."
|
||||
readConfirmTitle: "¿Marcar como leído?"
|
||||
readConfirmText: "Esto marcará el contenido de \"{title}\" como leído."
|
||||
shouldNotBeUsedToPresentPermanentInfo: "Dado que puede impactar en la experiencia de usuario de forma significativa, es recomendable usar notificaciones en el flujo de información en vez de información persistente."
|
||||
dialogAnnouncementUxWarn: "Mostrar dos o más notificaciones en formato diálogo a la vez puede impactar en la experiencia de usuario de forma significativa, úsalos con cuidado."
|
||||
silence: "Silenciar notificaciones"
|
||||
silenceDescription: "Si lo activas, no enviarás notificación sobre este anuncio y el usuario no tendrá que leerlo."
|
||||
_initialAccountSetting:
|
||||
accountCreated: "¡La cuenta ha sido creada!"
|
||||
letsStartAccountSetup: "Para empezar, creemos tu perfil."
|
||||
@@ -1160,9 +1352,77 @@ _initialAccountSetting:
|
||||
pushNotificationDescription: "Habilitar las notificaciones push te permitirá recibir notificaciones de {name} directamente en tu dispositivo."
|
||||
initialAccountSettingCompleted: "¡Configuración del perfil completada!"
|
||||
haveFun: "¡Disfruta de {name}!"
|
||||
ifYouNeedLearnMore: "Si quieres aprender cómo usar {name} (Misskey), por favor, visita {link}."
|
||||
youCanContinueTutorial: "Puedes proceder a un tutorial sobre cómo usar {name} (Misskey) o puedes terminar la instalación aquí y empezar a usarlo ya mismo."
|
||||
startTutorial: "Comenzar tutorial"
|
||||
skipAreYouSure: "¿Realmente quieres saltarte la configuración del perfil?"
|
||||
laterAreYouSure: "¿Realmente quieres configurar tu perfil después?"
|
||||
_initialTutorial:
|
||||
launchTutorial: "Comenzar tutorial"
|
||||
title: "Tutorial"
|
||||
wellDone: "¡Bien hecho!"
|
||||
skipAreYouSure: "¿Salir del tutorial?"
|
||||
_landing:
|
||||
title: "Bienvenid@ al tutorial"
|
||||
description: "Aquí podrás aprender las nociones básicas sobre cómo usar Misskey y sus funciones."
|
||||
_note:
|
||||
title: "¿Qué es una nota?"
|
||||
description: "Las publicaciones en Misskey se llaman 'Notas'. Las notas se ordenan de forma cronológica en la línea de tiempo y se actualizan en tiempo real."
|
||||
reply: "Pulsa en este botón para contestar a un mensaje. También es posible contestar a otras contestaciones, continuando así la conversación como un hilo."
|
||||
renote: "Puedes compartir esa nota en tu propia línea de tiempo. También puedes añadir una cita con tus comentarios."
|
||||
reaction: "Puedes añadir reacciones a la Nota. Se explicarán más detalles en la siguiente página."
|
||||
menu: "Puedes ver los detalles de la Nota, copiar enlaces, y realizar otras acciones."
|
||||
_reaction:
|
||||
title: "¿Qué son las reacciones?"
|
||||
description: "Se puede reaccionar a las Notas con diferentes emojis. Las reacciones te permiten expresar matices que no se pueden transmitir con un simple 'me gusta'."
|
||||
letsTryReacting: "Puedes añadir reacciones pulsando en el botón '+' de la nota. ¡Intenta reaccionar a esta nota de ejemplo!"
|
||||
reactToContinue: "Añade una reacción para continuar."
|
||||
reactNotification: "Recibirás notificaciones en tiempo real cuando alguien reaccione a tu nota."
|
||||
reactDone: "Puedes deshacer una reacción pulsando en el botón '-'."
|
||||
_timeline:
|
||||
title: "El concepto de Línea de tiempo"
|
||||
description1: "Misskey proporciona múltiples líneas de tiempo basadas en su uso (algunas pueden no estar disponibles dependiendo de las políticas de la instancia)."
|
||||
home: "Puedes ver los posts de las cuentas que sigues."
|
||||
local: "Puedes ver los posts de todos los usuarios de este servidor."
|
||||
social: "Se ven los posts de la línea de tiempo de inicio junto con los de la línea de tiempo local."
|
||||
global: "Puedes ver notas de todos los servidores conectados."
|
||||
description2: "Puedes cambiar la línea de tiempo en la parte superior de la pantalla cuando quieras."
|
||||
description3: "Además, hay listas de líneas de tiempo y listas de canales. Para más detalle, por favor visita este enlace: {link}"
|
||||
_postNote:
|
||||
title: "Ajustes de publicación de nota"
|
||||
description1: "Cuando publicas una nota en Misskey, hay varias opciones disponibles. El formulario tiene este aspecto."
|
||||
_visibility:
|
||||
description: "Puedes limitar quién puede ver tu nota."
|
||||
public: "Tu nota será visible para todos los usuarios."
|
||||
home: "Publicar solo en la línea de tiempo de Inicio. La nota se verá en tu perfil, la verán tus seguidores y también cuando sea renotada."
|
||||
followers: "Visible solo para seguidores. Sólo tus seguidores podrán ver la nota, y no podrá ser renotada por otras personas."
|
||||
direct: "Visible sólo para usuarios específicos, y el destinatario será notificado. Puede usarse como alternativa a la mensajería directa."
|
||||
doNotSendConfidencialOnDirect1: "¡Ten cuidado cuando vayas a enviar información sensible!"
|
||||
doNotSendConfidencialOnDirect2: "Los administradores del servidor pueden leer lo que escribes. Ten cuidado cuando envíes información sensible en notas directas en servidores no confiables."
|
||||
localOnly: "Publicando con esta opción seleccionada, la nota no se federará hacia otros servidores. Los usuarios de otros servidores no podrán ver estas notas directamente, sin importar los ajustes seleccionados más arriba."
|
||||
_cw:
|
||||
title: "Alerta de contenido (CW)"
|
||||
description: "En lugar de mostrarse el contenido de la nota, se mostrará lo que escribas en el campo \"comentarios\". Pulsando en \"leer más\" desplegará el contenido de la nota."
|
||||
_exampleNote:
|
||||
cw: "¡Esto te hará tener hambre!"
|
||||
note: "Acabo de comerme un donut de chocolate glaseado 🍩😋"
|
||||
useCases: "Esto se usa cuando las normas del servidor lo requieren, o para ocultar spoilers o contenido sensible."
|
||||
_howToMakeAttachmentsSensitive:
|
||||
title: "¿Cómo puedo marcar adjuntos como contenido sensible?"
|
||||
description: "Cuando las normas del servidor lo requieran, o el contenido lo requiera, marca la opción de \"contenido sensible\" para el adjunto."
|
||||
tryThisFile: "¡Prueba a marcar la imagen adjunta como contenido sensible!"
|
||||
_exampleNote:
|
||||
note: "Ups, la he liado al abrir la tapa del natto..."
|
||||
method: "Para marcar un adjunto como sensible, haz clic en la miniatura, abre el menú, y haz clic en \"Marcar como sensible\"."
|
||||
sensitiveSucceeded: "Cuando adjuntes archivos, por favor, ten en cuenta las normas del servidor para marcarlos como contenido sensible."
|
||||
doItToContinue: "Marca el archivo adjunto como sensible para continuar."
|
||||
_done:
|
||||
title: "¡Has completado el tutorial! 🎉"
|
||||
description: "Las funciones que mostramos aquí son sólo una pequeña parte. Para más detalles sobre el funcionamiento de Misskey, pulsa en este enlace: {link}"
|
||||
_timelineDescription:
|
||||
home: "En la línea de tiempo de Inicio puedes ver las notas de las cuentas a las que sigues."
|
||||
local: "En la línea de tiempo Local puedes ver las notas de todos los usuarios del servidor."
|
||||
social: "En la línea de tiempo Social verás las notas de Inicio y Local a la vez."
|
||||
global: "En la línea de tiempo Global verás las notas de todos los servidores conectados."
|
||||
_serverRules:
|
||||
description: "Un conjunto de reglas que serán mostradas antes del registro. Configurar un sumario de términos de servicio es recomendado."
|
||||
_serverSettings:
|
||||
@@ -1174,10 +1434,13 @@ _serverSettings:
|
||||
manifestJsonOverride: "Sobreescribir manifest.json"
|
||||
shortName: "Nombre corto"
|
||||
shortNameDescription: "Forma corta del nombre de la instancia que puede mostrarse si el nombre completo es demasiado largo."
|
||||
fanoutTimelineDescription: "Incrementa el rendimiento de forma significativa cuando se obtienen las líneas de tiempo y reduce la carga en la base de datos. A cambio, el uso de la memoria en Redis incrementará. Considera desactivar esta opción en caso de que tu servidor tenga poca memoria o detectes inestabilidad."
|
||||
fanoutTimelineDbFallback: "Cargar desde la base de datos"
|
||||
fanoutTimelineDbFallbackDescription: "Cuando esta opción está habilitada, la carga de peticiones adicionales de la línea de tiempo se hará desde la base de datos cuando éstas no se encuentren en la caché. Al deshabilitar esta opción se reduce la carga del servidor, pero limita el número de líneas de tiempo que pueden obtenerse."
|
||||
_accountMigration:
|
||||
moveFrom: "Trasladar de otra cuenta a ésta"
|
||||
moveFromSub: "Crear un alias para otra cuenta."
|
||||
moveFromLabel: "Cuenta desde la que se realiza el traslado:"
|
||||
moveFromLabel: "Cuenta desde la que se realiza el traslado #{n}"
|
||||
moveFromDescription: "Si quieres transferir seguidores de otra cuenta a esta cuenta y trasladarlos, tendrás que crear un alias aquí. Asegúrate de crearlo antes de realizar el traslado. Introduce la cuenta desde la que estás moviendo los seguidores así: @person@instance.com"
|
||||
moveTo: "Mover esta cuenta a una nueva"
|
||||
moveToLabel: "Cuenta destino:"
|
||||
@@ -1431,6 +1694,16 @@ _achievements:
|
||||
_smashTestNotificationButton:
|
||||
title: "Sobrecarga de pruebas"
|
||||
description: "Envía muchas notificaciones de prueba en un corto espacio de tiempo"
|
||||
_tutorialCompleted:
|
||||
title: "Diploma del Curso Básico de Misskey"
|
||||
description: "Tutorial completado"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
description: "El objeto más grande en el juego de burbujas"
|
||||
_bubbleGameDoubleExplodingHead:
|
||||
title: "Doble 🤯"
|
||||
description: "Dos de los objetos más grandes en el juego de burbujas al mismo tiempo"
|
||||
flavor: "Puedes llenar el bento un poco de esta forma 🤯 🤯."
|
||||
_role:
|
||||
new: "Crear rol"
|
||||
edit: "Editar rol"
|
||||
@@ -1441,7 +1714,9 @@ _role:
|
||||
assignTarget: "Asignar objetivo"
|
||||
descriptionOfAssignTarget: "<b>Manual</b> Para cambiar manualmente lo que se incluye en este rol.\n<b>Condicional</b> configura una condición, y los usuarios que cumplan la condición serán incluídos automáticamente."
|
||||
manual: "manual"
|
||||
manualRoles: "Roles manuales"
|
||||
conditional: "condicional"
|
||||
conditionalRoles: "Roles condicionales"
|
||||
condition: "condición"
|
||||
isConditionalRole: "Esto es un rol condicional"
|
||||
isPublic: "Publicar rol"
|
||||
@@ -1469,11 +1744,13 @@ _role:
|
||||
gtlAvailable: "Explorar la línea de tiempo global"
|
||||
ltlAvailable: "Explorar la línea de tiempo local"
|
||||
canPublicNote: "Permitir la publicación"
|
||||
mentionMax: "Número máximo de menciones en una nota"
|
||||
canInvite: "Puede crear códigos de invitación"
|
||||
inviteLimit: "Límite de invitaciones"
|
||||
inviteLimitCycle: "Enfriamiento del límite de invitaciones"
|
||||
inviteExpirationTime: "Intervalo de caducidad de invitaciones"
|
||||
canManageCustomEmojis: "Administrar emojis personalizados"
|
||||
canManageAvatarDecorations: "Administrar decoraciones de avatar"
|
||||
driveCapacity: "Capacidad del drive"
|
||||
alwaysMarkNsfw: "Siempre marcar archivos como NSFW"
|
||||
pinMax: "Máximo de notas fijadas"
|
||||
@@ -1489,9 +1766,15 @@ _role:
|
||||
canHideAds: "Puede ocultar anuncios"
|
||||
canSearchNotes: "Uso de la búsqueda de notas"
|
||||
canUseTranslator: "Uso de traductor"
|
||||
avatarDecorationLimit: "Número máximo de decoraciones de avatar"
|
||||
_condition:
|
||||
roleAssignedTo: "Asignado a roles manuales"
|
||||
isLocal: "Usuario local"
|
||||
isRemote: "Usuario remoto"
|
||||
isCat: "Usuarios Gato"
|
||||
isBot: "Usuarios Bot"
|
||||
isSuspended: "Usuario suspendido"
|
||||
isLocked: "Cuentas privadas"
|
||||
createdLessThan: "Menos de X han pasado desde la creación de la cuenta"
|
||||
createdMoreThan: "Más de X han pasado desde la creación de la cuenta"
|
||||
followersLessThanOrEq: "Tiene X o menos seguidores"
|
||||
@@ -1517,6 +1800,7 @@ _emailUnavailable:
|
||||
disposable: "No es un correo reutilizable"
|
||||
mx: "Servidor de correo inválido"
|
||||
smtp: "Servidor de correo no disponible"
|
||||
banned: "Email no disponible"
|
||||
_ffVisibility:
|
||||
public: "Publicar"
|
||||
followers: "Visible solo para seguidores"
|
||||
@@ -1560,6 +1844,7 @@ _plugin:
|
||||
installWarn: "Por favor no instale plugins que no son de confianza"
|
||||
manage: "Gestionar plugins"
|
||||
viewSource: "Ver la fuente"
|
||||
viewLog: "Ver log"
|
||||
_preferencesBackups:
|
||||
list: "Respaldos creados"
|
||||
saveNew: "Guardar nuevo respaldo"
|
||||
@@ -1589,10 +1874,13 @@ _aboutMisskey:
|
||||
contributors: "Principales colaboradores"
|
||||
allContributors: "Todos los colaboradores"
|
||||
source: "Código fuente"
|
||||
original: "Original"
|
||||
thisIsModifiedVersion: "{name} usa una versión modificada de Misskey."
|
||||
translation: "Traducir Misskey"
|
||||
donate: "Donar a Misskey"
|
||||
morePatrons: "Muchas más personas nos apoyan. Muchas gracias🥰"
|
||||
patrons: "Patrocinadores"
|
||||
projectMembers: "Miembros del proyecto"
|
||||
_displayOfSensitiveMedia:
|
||||
respect: "Esconder medios marcados como sensibles"
|
||||
ignore: "Mostrar medios marcados como sensibles"
|
||||
@@ -1617,6 +1905,7 @@ _channel:
|
||||
notesCount: "{n} notas"
|
||||
nameAndDescription: "Nombre y descripción"
|
||||
nameOnly: "Sólo nombre"
|
||||
allowRenoteToExternal: "Permitir renotas y menciones fuera del canal"
|
||||
_menuDisplay:
|
||||
sideFull: "Horizontal"
|
||||
sideIcon: "Horizontal (ícono)"
|
||||
@@ -1694,7 +1983,6 @@ _theme:
|
||||
buttonBg: "Fondo de botón"
|
||||
buttonHoverBg: "Fondo de botón (hover)"
|
||||
inputBorder: "Borde de los campos de entrada"
|
||||
listItemHoverBg: "Fondo de elemento de listas (hover)"
|
||||
driveFolderBg: "Fondo de capeta del drive"
|
||||
wallpaperOverlay: "Transparencia del fondo de pantalla"
|
||||
badge: "Medalla"
|
||||
@@ -1706,8 +1994,14 @@ _sfx:
|
||||
note: "Notas"
|
||||
noteMy: "Nota (a mí mismo)"
|
||||
notification: "Notificaciones"
|
||||
antenna: "Antena receptora"
|
||||
channel: "Notificaciones del canal"
|
||||
reaction: "Al seleccionar una reacción"
|
||||
_soundSettings:
|
||||
driveFile: "Usar un archivo de audio en Drive"
|
||||
driveFileWarn: "Selecciona un archivo de audio en Drive."
|
||||
driveFileTypeWarn: "Este archivo es incompatible"
|
||||
driveFileTypeWarnDescription: "Selecciona un archivo de audio"
|
||||
driveFileDurationWarn: "La duración del audio es demasiado larga."
|
||||
driveFileDurationWarnDescription: "Usar un audio de larga duración puede llegar a molestar mientras usas Misskey. ¿Quieres continuar?"
|
||||
_ago:
|
||||
future: "Futuro"
|
||||
justNow: "Justo ahora"
|
||||
@@ -1719,27 +2013,24 @@ _ago:
|
||||
monthsAgo: "Hace {n} meses"
|
||||
yearsAgo: "Hace {n} años"
|
||||
invalid: "No hay nada que ver aqui"
|
||||
_timeIn:
|
||||
seconds: "En {n} segundos"
|
||||
minutes: "En {n}m"
|
||||
hours: "En {n}h"
|
||||
days: "En {n}d"
|
||||
weeks: "En {n}sem."
|
||||
months: "En {n}M"
|
||||
years: "En {n} años"
|
||||
_time:
|
||||
second: "Segundos"
|
||||
minute: "Minutos"
|
||||
hour: "Horas"
|
||||
day: "Días"
|
||||
_timelineTutorial:
|
||||
title: "Cómo usar Misskey"
|
||||
step1_1: "Ésta es la \"línea de tiempo\". Todas las \"notas\" que sean publicadas en {name} serán mostradas cronológicamente aquí."
|
||||
step1_2: "Hay varias líneas de tiempo. Por ejemplo, la línea temporal \"Inicio\" contiene las notas de otros usuarios que sigues, y la línea \"Local\" contandrá las notas de todos los usuarios de {name}."
|
||||
step2_1: "Ahora probemos publicar una nota. Puedes hacerlo presionando el botón que tiene un ícono de lápiz."
|
||||
step2_2: "¿Qué tal si escribimos una introducción? o sólo un \"¡Hola {name}!\" ¿No te apetece?"
|
||||
step3_1: "¿Terminaste de publicar tu primera nota?"
|
||||
step3_2: "Tu primera nota ahora se mostrará en tu línea de tiempo."
|
||||
step4_1: "También puedes añadir \"Reacciones\" a notas."
|
||||
step4_2: "Para añadir una reacción selecciona el botón \"+\" en la nota y escoge el emoji que quieras para reaccionar."
|
||||
_2fa:
|
||||
alreadyRegistered: "Ya has completado la configuración."
|
||||
registerTOTP: "Registrar aplicación autenticadora"
|
||||
step1: "Primero, instale en su dispositivo la aplicación de autenticación {a} o {b} u otra."
|
||||
step2: "Luego, escanee con la aplicación el código QR mostrado en pantalla."
|
||||
step2Click: "Clicking on this QR code will allow you to register 2FA to your security key or phone authenticator app.\nTocar este código QR te permitirá registrar la autenticación 2FA a tu llave de seguridad o aplicación autenticadora."
|
||||
step2Uri: "Si usas una aplicación de escritorio, introduce en ella la siguiente URL."
|
||||
step3Title: "Ingresa un código de autenticación"
|
||||
step3: "Para terminar, ingrese el token mostrado en la aplicación."
|
||||
@@ -1763,6 +2054,7 @@ _2fa:
|
||||
backupCodesDescription: "En caso de que no puedas usar tu aplicación de autenticación, podrás usar los códigos de respaldo que figuran abajo para acceder a tu cuenta. Asegúrate de guardar en lugar seguro los códigos de respaldo. Cada uno de los códigos de respaldo es de un solo uso."
|
||||
backupCodeUsedWarning: "Has usado todos los códigos de respaldo. Si dejas de tener acceso a tu aplicación de autenticación, no podrás volver a iniciar sesión en tu cuenta. Por favor, reconfigura tu aplicación de autenticación lo antes posible."
|
||||
backupCodesExhaustedWarning: "Has usado todos los códigos de respaldo. Si dejas de tener acceso a tu aplicación de autenticación, no podrás volver a iniciar sesión en la cuenta que figura arriba. Por favor, reconfigura tu aplicación de autenticación lo antes posible."
|
||||
moreDetailedGuideHere: "Guía detallada"
|
||||
_permissions:
|
||||
"read:account": "Ver información de la cuenta"
|
||||
"write:account": "Editar información de la cuenta"
|
||||
@@ -1800,6 +2092,54 @@ _permissions:
|
||||
"write:flash": "Editar Plays"
|
||||
"read:flash-likes": "Ver los Play que me gustan"
|
||||
"write:flash-likes": "Editar lista de Play que me gustan"
|
||||
"read:admin:abuse-user-reports": "Ver reportes de usuarios"
|
||||
"write:admin:delete-account": "Eliminar cuentas de usuario"
|
||||
"write:admin:delete-all-files-of-a-user": "Eliminar todos los archivos de un usuario"
|
||||
"read:admin:index-stats": "Ver datos indexados"
|
||||
"read:admin:table-stats": "Ver estadísticas de las tablas de la base de datos"
|
||||
"read:admin:user-ips": "Ver dirección IP de usuario"
|
||||
"read:admin:meta": "Ver metadatos de la instancia"
|
||||
"write:admin:reset-password": "Restablecer contraseñas de usuario"
|
||||
"write:admin:resolve-abuse-user-report": "Resolución de reportes de usuario"
|
||||
"write:admin:send-email": "Enviar email"
|
||||
"read:admin:server-info": "Ver información del servidor"
|
||||
"read:admin:show-moderation-log": "Ver log de moderación"
|
||||
"read:admin:show-user": "Ver información privada de usuario"
|
||||
"write:admin:suspend-user": "Suspender cuentas de usuario"
|
||||
"write:admin:unset-user-avatar": "Quitar avatares de usuario"
|
||||
"write:admin:unset-user-banner": "Quitar banner de usuarios"
|
||||
"write:admin:unsuspend-user": "Quitar suspensión de cuentas de usuario"
|
||||
"write:admin:meta": "Edición de metadatos de la instancia"
|
||||
"write:admin:user-note": "Moderación de notas"
|
||||
"write:admin:roles": "Edición de roles de usuario"
|
||||
"read:admin:roles": "Ver roles de usuario"
|
||||
"write:admin:relays": "Edición de relays"
|
||||
"read:admin:relays": "Ver relays"
|
||||
"write:admin:invite-codes": "Edición de códigos de invitación"
|
||||
"read:admin:invite-codes": "Ver códigos de invitación"
|
||||
"write:admin:announcements": "Edición de anuncios"
|
||||
"read:admin:announcements": "Ver anuncios"
|
||||
"write:admin:avatar-decorations": "Edición de decoración de avatares"
|
||||
"read:admin:avatar-decorations": "Ver decoraciones de avatar"
|
||||
"write:admin:federation": "Edición de federación de instancias"
|
||||
"write:admin:account": "Edición de cuentas de usuario"
|
||||
"read:admin:account": "Ver cuentas de usuario"
|
||||
"write:admin:emoji": "Edición de emojis"
|
||||
"read:admin:emoji": "Ver emojis"
|
||||
"write:admin:queue": "Edición de cola de tareas"
|
||||
"read:admin:queue": "Ver cola de tareas"
|
||||
"write:admin:promo": "Edición de promociones"
|
||||
"write:admin:drive": "Edición de Drive de usuarios"
|
||||
"read:admin:drive": "Ver Drive de usuarios"
|
||||
"read:admin:stream": "Usar la API de Websocket para administradores"
|
||||
"write:admin:ad": "Edición de anuncios"
|
||||
"read:admin:ad": "Ver anuncios"
|
||||
"write:invite-codes": "Crear códigos de invitación"
|
||||
"read:invite-codes": "Ver códigos de invitación"
|
||||
"write:clip-favorite": "Marcar me gusta en clips"
|
||||
"read:clip-favorite": "Ver los clips que me gustan"
|
||||
"read:federation": "Ver instancias federadas"
|
||||
"write:report-abuse": "Crear reportes de usuario"
|
||||
_auth:
|
||||
shareAccessTitle: "Permisos de la aplicación"
|
||||
shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?"
|
||||
@@ -1854,6 +2194,7 @@ _widgets:
|
||||
_userList:
|
||||
chooseList: "Seleccione una lista"
|
||||
clicker: "Cliqueador"
|
||||
birthdayFollowings: "Hoy cumplen años"
|
||||
_cw:
|
||||
hide: "Ocultar"
|
||||
show: "Ver más"
|
||||
@@ -1916,9 +2257,11 @@ _profile:
|
||||
changeAvatar: "Cambiar avatar"
|
||||
changeBanner: "Cambiar banner"
|
||||
verifiedLinkDescription: "Introduciendo una URL que contiene un enlace a tu perfil, se puede mostrar un icono de verificación de propiedad al lado del campo."
|
||||
avatarDecorationMax: "Puedes añadir un máximo de {max} decoraciones de avatar."
|
||||
_exportOrImport:
|
||||
allNotes: "Todas las notas"
|
||||
favoritedNotes: "Notas favoritas"
|
||||
clips: "Clip"
|
||||
followingList: "Siguiendo"
|
||||
muteList: "Silenciados"
|
||||
blockingList: "Bloqueados"
|
||||
@@ -1972,13 +2315,11 @@ _play:
|
||||
title: "Título"
|
||||
script: "Script"
|
||||
summary: "Descripción"
|
||||
visibilityDescription: "Poniéndola como privada significa que no será visible en tu perfil, pero cualquiera que tenga la URL aún podrá acceder a ella."
|
||||
_pages:
|
||||
newPage: "Crear página"
|
||||
editPage: "Editar página"
|
||||
readPage: "Viendo la fuente"
|
||||
created: "La página fue creada"
|
||||
updated: "La página fue actualizada"
|
||||
deleted: "La página borrada"
|
||||
pageSetting: "Configurar página"
|
||||
nameAlreadyExists: "La URL de la página especificada ya existe"
|
||||
invalidNameTitle: "URL inválida"
|
||||
@@ -2016,6 +2357,8 @@ _pages:
|
||||
section: "Sección"
|
||||
image: "Imagen"
|
||||
button: "Botón"
|
||||
dynamic: "Bloques Dinámicos"
|
||||
dynamicDescription: "Los bloques dinámicos están obsoletos. A partir de ahora, utiliza {play} por favor."
|
||||
note: "Nota embebida"
|
||||
_note:
|
||||
id: "Id de la nota"
|
||||
@@ -2037,12 +2380,16 @@ _notification:
|
||||
pollEnded: "Estan disponibles los resultados de la encuesta"
|
||||
newNote: "Nueva nota"
|
||||
unreadAntennaNote: "Antena {name}"
|
||||
roleAssigned: "Rol asignado"
|
||||
emptyPushNotificationMessage: "Se han actualizado las notificaciones push"
|
||||
achievementEarned: "Logro desbloqueado"
|
||||
testNotification: "Notificación de prueba"
|
||||
checkNotificationBehavior: "Comprobar comportamiento de la notificación"
|
||||
sendTestNotification: "Enviar notificación de prueba"
|
||||
notificationWillBeDisplayedLikeThis: "Las notificaciones tendrán este aspecto"
|
||||
reactedBySomeUsers: "{n} usuarios han reaccionado"
|
||||
renotedBySomeUsers: "{n} usuarios han renotado"
|
||||
followedBySomeUsers: "Seguido por {n} usuarios"
|
||||
_types:
|
||||
all: "Todo"
|
||||
note: "Nuevas notas"
|
||||
@@ -2055,7 +2402,10 @@ _notification:
|
||||
pollEnded: "La encuesta terminó"
|
||||
receiveFollowRequest: "Recibió una solicitud de seguimiento"
|
||||
followRequestAccepted: "El seguimiento fue aceptado"
|
||||
roleAssigned: "Rol asignado"
|
||||
achievementEarned: "Logro desbloqueado"
|
||||
login: "Iniciar sesión"
|
||||
test: "Pruebas de nofiticaciones"
|
||||
app: "Notificaciones desde aplicaciones"
|
||||
_actions:
|
||||
followBack: "Te sigue de vuelta"
|
||||
@@ -2105,7 +2455,6 @@ _webhookSettings:
|
||||
createWebhook: "Crear Webhook"
|
||||
name: "Nombre"
|
||||
secret: "Secreto"
|
||||
events: "Eventos de webhook"
|
||||
active: "Activado"
|
||||
_events:
|
||||
follow: "Cuando se sigue a alguien"
|
||||
@@ -2115,6 +2464,14 @@ _webhookSettings:
|
||||
renote: "Cuando reciba un \"re-note\""
|
||||
reaction: "Cuando se recibe una reacción"
|
||||
mention: "Cuando hay una mención"
|
||||
_systemEvents:
|
||||
userCreated: "Cuando se crea el usuario."
|
||||
_abuseReport:
|
||||
_notificationRecipient:
|
||||
_recipientType:
|
||||
mail: "Correo"
|
||||
webhook: "Webhook"
|
||||
keywords: "Palabras Clave"
|
||||
_moderationLogTypes:
|
||||
createRole: "Rol creado"
|
||||
deleteRole: "Rol eliminado"
|
||||
@@ -2146,6 +2503,11 @@ _moderationLogTypes:
|
||||
createAd: "Anuncio creado"
|
||||
deleteAd: "Anuncio eliminado"
|
||||
updateAd: "Anuncio actualizado"
|
||||
createAvatarDecoration: "Decoración de avatar creada"
|
||||
updateAvatarDecoration: "Decoración de avatar actualizada"
|
||||
deleteAvatarDecoration: "Decoración de avatar eliminada"
|
||||
unsetUserAvatar: "Quitar decoración de avatar de este usuario"
|
||||
unsetUserBanner: "Quitar banner de este usuario"
|
||||
_fileViewer:
|
||||
title: "Detalles del archivo"
|
||||
type: "Tipo de archivo"
|
||||
@@ -2154,3 +2516,83 @@ _fileViewer:
|
||||
uploadedAt: "Subido el"
|
||||
attachedNotes: "Notas adjuntas"
|
||||
thisPageCanBeSeenFromTheAuthor: "Esta página solo puede ser vista por el autor."
|
||||
_externalResourceInstaller:
|
||||
title: "Instalar desde sitio externo"
|
||||
checkVendorBeforeInstall: "Asegúrate de que el distribuidor de este recurso es de confianza antes de proceder a la instalación."
|
||||
_plugin:
|
||||
title: "¿Quieres instalar este plugin?"
|
||||
metaTitle: "Información del plugin"
|
||||
_theme:
|
||||
title: "¿Quieres instalar este tema?"
|
||||
metaTitle: "Información del tema"
|
||||
_meta:
|
||||
base: "Esquema de color base"
|
||||
_vendorInfo:
|
||||
title: "Información del distribuidor"
|
||||
endpoint: "Terminal referenciada"
|
||||
hashVerify: "Verificación de hash"
|
||||
_errors:
|
||||
_invalidParams:
|
||||
title: "Parámetros inválidos"
|
||||
description: "No hay información suficiente para cargar datos de un sitio externo. Por favor, confirma la URL introducida."
|
||||
_resourceTypeNotSupported:
|
||||
title: "Este recurso externo no es compatible"
|
||||
description: "El tipo de este recurso externo no es compatible. Por favor, contacta con el administrador del sitio."
|
||||
_failedToFetch:
|
||||
title: "No se pudo obtener los datos"
|
||||
fetchErrorDescription: "Ha ocurrido un error al comunicarse con el sitio externo. Si no se soluciona tras intentarlo otra vez, por favor, contacta con el administrador del sitio."
|
||||
parseErrorDescription: "Ha ocurrido un error al procesar los datos obtenidos del sitio externo. Por favor, contacta con el administrador del sitio."
|
||||
_hashUnmatched:
|
||||
title: "Verificación de datos fallida"
|
||||
description: "Ha ocurrido un error al verificar la integridad de los datos obtenidos. Por seguridad, la instalación no se puede realizar. Por favor, contacta con el administrador del sitio."
|
||||
_pluginParseFailed:
|
||||
title: "Error de AiScript"
|
||||
description: "Los datos se han obtenido correctamente, pero ha ocurrido un error de AiScript al procesarlos. Por favor, contacta con el autor del plugin. Se pueden ver más detalles del error en la consola de Javascript."
|
||||
_pluginInstallFailed:
|
||||
title: "Instalación del plugin fallida."
|
||||
description: "Ha ocurrido un problema al instalar el plugin. Por favor, inténtalo de nuevo. Se pueden ver más detalles del error en la consola de Javascript."
|
||||
_themeParseFailed:
|
||||
title: "Análisis del tema fallido"
|
||||
description: "Los datos se han obtenido correctamente, pero ha ocurrido un error al analizar el tema. Por favor, contacta con el autor. Se pueden ver más detalles del error en la consola de Javascript."
|
||||
_themeInstallFailed:
|
||||
title: "Instalación de tema fallida"
|
||||
description: "Ha ocurrido un problema al instalar el tema. Por favor, inténtalo de nuevo. Se pueden ver más detalles del error en la consola de Javascript."
|
||||
_dataSaver:
|
||||
_media:
|
||||
title: "Cargando Multimedia"
|
||||
description: "Desactiva la carga automática de imágenes y vídeos. Tendrás que tocar en las imágenes y vídeos ocultos para cargarlos."
|
||||
_avatar:
|
||||
title: "Avatares animados"
|
||||
description: "Desactiva la animación de los avatares. Las imágenes animadas pueden llegar a ser de mayor tamaño que las normales, por lo que al desactivarlas puedes reducir el consumo de datos."
|
||||
_urlPreview:
|
||||
title: "Vista previa de URLs"
|
||||
description: "Desactiva la carga de vistas previas de las URLs."
|
||||
_code:
|
||||
title: "Resaltar código"
|
||||
description: "Si se usa resaltado de código en MFM, etc., no se cargará hasta pulsar en ello. El resaltado de sintaxis requiere la descarga de archivos de definición para cada lenguaje de programación. Debido a esto, al deshabilitar la carga automática de estos archivos reducirás el consumo de datos."
|
||||
_hemisphere:
|
||||
N: "Hemisferio norte"
|
||||
S: "Hemisferio sur"
|
||||
_reversi:
|
||||
reversi: "Reversi"
|
||||
rules: "Reglas"
|
||||
won: "{name} ha ganado"
|
||||
total: "Total"
|
||||
_urlPreviewSetting:
|
||||
timeout: "Timeout de la carga de vista previa de las URLs (ms)"
|
||||
maximumContentLength: "Content-Length Máximo (bytes)"
|
||||
userAgent: "User-Agent"
|
||||
_mediaControls:
|
||||
pip: "Picture in Picture"
|
||||
playbackRate: "Velocidad de reproducción"
|
||||
loop: "Reproducción en bucle"
|
||||
_followRequest:
|
||||
recieved: "Petición de seguimiento recibida"
|
||||
sent: "Petición de seguimiento enviada"
|
||||
_remoteLookupErrors:
|
||||
_noSuchObject:
|
||||
title: "No se encuentra"
|
||||
_search:
|
||||
searchScopeAll: "Todo"
|
||||
searchScopeLocal: "Local"
|
||||
searchScopeUser: "Especificar usuario"
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -6,68 +6,225 @@ import ts from 'typescript';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
const parameterRegExp = /\{(\w+)\}/g;
|
||||
|
||||
function createMemberType(item) {
|
||||
if (typeof item !== 'string') {
|
||||
return ts.factory.createTypeLiteralNode(createMembers(item));
|
||||
}
|
||||
const parameters = Array.from(
|
||||
item.matchAll(parameterRegExp),
|
||||
([, parameter]) => parameter,
|
||||
);
|
||||
return parameters.length
|
||||
? ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('ParameterizedString'),
|
||||
[
|
||||
ts.factory.createUnionTypeNode(
|
||||
parameters.map((parameter) =>
|
||||
ts.factory.createStringLiteral(parameter),
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
: ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);
|
||||
}
|
||||
|
||||
function createMembers(record) {
|
||||
return Object.entries(record)
|
||||
.map(([k, v]) => ts.factory.createPropertySignature(
|
||||
return Object.entries(record).map(([k, v]) => {
|
||||
const node = ts.factory.createPropertySignature(
|
||||
undefined,
|
||||
ts.factory.createStringLiteral(k),
|
||||
undefined,
|
||||
typeof v === 'string'
|
||||
? ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)
|
||||
: ts.factory.createTypeLiteralNode(createMembers(v)),
|
||||
));
|
||||
createMemberType(v),
|
||||
);
|
||||
if (typeof v === 'string') {
|
||||
ts.addSyntheticLeadingComment(
|
||||
node,
|
||||
ts.SyntaxKind.MultiLineCommentTrivia,
|
||||
`*
|
||||
* ${v.replace(/\n/g, '\n * ')}
|
||||
`,
|
||||
true,
|
||||
);
|
||||
}
|
||||
return node;
|
||||
});
|
||||
}
|
||||
|
||||
export default function generateDTS() {
|
||||
const locale = yaml.load(fs.readFileSync(`${__dirname}/ja-JP.yml`, 'utf-8'));
|
||||
const members = createMembers(locale);
|
||||
const elements = [
|
||||
ts.factory.createVariableStatement(
|
||||
[ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)],
|
||||
ts.factory.createVariableDeclarationList(
|
||||
[
|
||||
ts.factory.createVariableDeclaration(
|
||||
ts.factory.createIdentifier('kParameters'),
|
||||
undefined,
|
||||
ts.factory.createTypeOperatorNode(
|
||||
ts.SyntaxKind.UniqueKeyword,
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.SymbolKeyword),
|
||||
),
|
||||
undefined,
|
||||
),
|
||||
],
|
||||
ts.NodeFlags.Const,
|
||||
),
|
||||
),
|
||||
ts.factory.createInterfaceDeclaration(
|
||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
||||
ts.factory.createIdentifier('ParameterizedString'),
|
||||
[
|
||||
ts.factory.createTypeParameterDeclaration(
|
||||
undefined,
|
||||
ts.factory.createIdentifier('T'),
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||
),
|
||||
],
|
||||
undefined,
|
||||
[
|
||||
ts.factory.createPropertySignature(
|
||||
undefined,
|
||||
ts.factory.createComputedPropertyName(
|
||||
ts.factory.createIdentifier('kParameters'),
|
||||
),
|
||||
undefined,
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('T'),
|
||||
undefined,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
ts.factory.createInterfaceDeclaration(
|
||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
||||
ts.factory.createIdentifier('ILocale'),
|
||||
undefined,
|
||||
undefined,
|
||||
[
|
||||
ts.factory.createIndexSignature(
|
||||
undefined,
|
||||
[
|
||||
ts.factory.createParameterDeclaration(
|
||||
undefined,
|
||||
undefined,
|
||||
ts.factory.createIdentifier('_'),
|
||||
undefined,
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||
undefined,
|
||||
),
|
||||
],
|
||||
ts.factory.createUnionTypeNode([
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('ParameterizedString'),
|
||||
),
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('ILocale'),
|
||||
undefined,
|
||||
),
|
||||
]),
|
||||
),
|
||||
],
|
||||
),
|
||||
ts.factory.createInterfaceDeclaration(
|
||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
||||
ts.factory.createIdentifier('Locale'),
|
||||
undefined,
|
||||
undefined,
|
||||
[
|
||||
ts.factory.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [
|
||||
ts.factory.createExpressionWithTypeArguments(
|
||||
ts.factory.createIdentifier('ILocale'),
|
||||
undefined,
|
||||
),
|
||||
]),
|
||||
],
|
||||
members,
|
||||
),
|
||||
ts.factory.createVariableStatement(
|
||||
[ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)],
|
||||
ts.factory.createVariableDeclarationList(
|
||||
[ts.factory.createVariableDeclaration(
|
||||
ts.factory.createIdentifier('locales'),
|
||||
undefined,
|
||||
ts.factory.createTypeLiteralNode([ts.factory.createIndexSignature(
|
||||
[
|
||||
ts.factory.createVariableDeclaration(
|
||||
ts.factory.createIdentifier('locales'),
|
||||
undefined,
|
||||
[ts.factory.createParameterDeclaration(
|
||||
undefined,
|
||||
undefined,
|
||||
ts.factory.createIdentifier('lang'),
|
||||
undefined,
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||
undefined,
|
||||
)],
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('Locale'),
|
||||
undefined,
|
||||
),
|
||||
)]),
|
||||
undefined,
|
||||
)],
|
||||
ts.NodeFlags.Const | ts.NodeFlags.Ambient | ts.NodeFlags.ContextFlags,
|
||||
ts.factory.createTypeLiteralNode([
|
||||
ts.factory.createIndexSignature(
|
||||
undefined,
|
||||
[
|
||||
ts.factory.createParameterDeclaration(
|
||||
undefined,
|
||||
undefined,
|
||||
ts.factory.createIdentifier('lang'),
|
||||
undefined,
|
||||
ts.factory.createKeywordTypeNode(
|
||||
ts.SyntaxKind.StringKeyword,
|
||||
),
|
||||
undefined,
|
||||
),
|
||||
],
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('Locale'),
|
||||
undefined,
|
||||
),
|
||||
),
|
||||
]),
|
||||
undefined,
|
||||
),
|
||||
],
|
||||
ts.NodeFlags.Const,
|
||||
),
|
||||
),
|
||||
ts.factory.createFunctionDeclaration(
|
||||
[ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
|
||||
undefined,
|
||||
ts.factory.createIdentifier('build'),
|
||||
undefined,
|
||||
[],
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('Locale'),
|
||||
undefined,
|
||||
),
|
||||
undefined,
|
||||
),
|
||||
ts.factory.createExportDefault(ts.factory.createIdentifier('locales')),
|
||||
];
|
||||
const printed = ts.createPrinter({
|
||||
newLine: ts.NewLineKind.LineFeed,
|
||||
}).printList(
|
||||
ts.ListFormat.MultiLine,
|
||||
ts.factory.createNodeArray(elements),
|
||||
ts.createSourceFile('index.d.ts', '', ts.ScriptTarget.ESNext, true, ts.ScriptKind.TS),
|
||||
ts.addSyntheticLeadingComment(
|
||||
elements[0],
|
||||
ts.SyntaxKind.MultiLineCommentTrivia,
|
||||
' eslint-disable ',
|
||||
true,
|
||||
);
|
||||
ts.addSyntheticLeadingComment(
|
||||
elements[0],
|
||||
ts.SyntaxKind.SingleLineCommentTrivia,
|
||||
' This file is generated by locales/generateDTS.js',
|
||||
true,
|
||||
);
|
||||
ts.addSyntheticLeadingComment(
|
||||
elements[0],
|
||||
ts.SyntaxKind.SingleLineCommentTrivia,
|
||||
' Do not edit this file directly.',
|
||||
true,
|
||||
);
|
||||
const printed = ts
|
||||
.createPrinter({
|
||||
newLine: ts.NewLineKind.LineFeed,
|
||||
})
|
||||
.printList(
|
||||
ts.ListFormat.MultiLine,
|
||||
ts.factory.createNodeArray(elements),
|
||||
ts.createSourceFile(
|
||||
'index.d.ts',
|
||||
'',
|
||||
ts.ScriptTarget.ESNext,
|
||||
true,
|
||||
ts.ScriptKind.TS,
|
||||
),
|
||||
);
|
||||
|
||||
fs.writeFileSync(`${__dirname}/index.d.ts`, `/* eslint-disable */
|
||||
// This file is generated by locales/generateDTS.js
|
||||
// Do not edit this file directly.
|
||||
${printed}`, 'utf-8');
|
||||
fs.writeFileSync(`${__dirname}/index.d.ts`, printed, 'utf-8');
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
_lang_: "Japán"
|
||||
_lang_: "Magyar"
|
||||
monthAndDay: "{month}.{day}."
|
||||
search: "Keresés"
|
||||
notifications: "Értesítések"
|
||||
@@ -96,6 +96,7 @@ _notification:
|
||||
renote: "Renote"
|
||||
quote: "Idézet"
|
||||
reaction: "Reakciók"
|
||||
login: "Bejelentkezés"
|
||||
_actions:
|
||||
renote: "Renote"
|
||||
_deck:
|
||||
|
File diff suppressed because it is too large
Load Diff
9147
locales/index.d.ts
vendored
9147
locales/index.d.ts
vendored
File diff suppressed because it is too large
Load Diff
@@ -15,6 +15,7 @@ const merge = (...args) => args.reduce((a, c) => ({
|
||||
|
||||
const languages = [
|
||||
'ar-SA',
|
||||
'ca-ES',
|
||||
'cs-CZ',
|
||||
'da-DK',
|
||||
'de-DE',
|
||||
@@ -51,20 +52,41 @@ const primaries = {
|
||||
// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
|
||||
const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
|
||||
|
||||
const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, import.meta.url), 'utf-8'))) || {}, a), {});
|
||||
export function build() {
|
||||
// vitestの挙動を調整するため、一度ローカル変数化する必要がある
|
||||
// https://github.com/vitest-dev/vitest/issues/3988#issuecomment-1686599577
|
||||
// https://github.com/misskey-dev/misskey/pull/14057#issuecomment-2192833785
|
||||
const metaUrl = import.meta.url;
|
||||
const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, metaUrl), 'utf-8'))) || {}, a), {});
|
||||
|
||||
export default Object.entries(locales)
|
||||
.reduce((a, [k ,v]) => (a[k] = (() => {
|
||||
const [lang] = k.split('-');
|
||||
switch (k) {
|
||||
case 'ja-JP': return v;
|
||||
case 'ja-KS':
|
||||
case 'en-US': return merge(locales['ja-JP'], v);
|
||||
default: return merge(
|
||||
locales['ja-JP'],
|
||||
locales['en-US'],
|
||||
locales[`${lang}-${primaries[lang]}`] || {},
|
||||
v
|
||||
);
|
||||
// 空文字列が入ることがあり、フォールバックが動作しなくなるのでプロパティごと消す
|
||||
const removeEmpty = (obj) => {
|
||||
for (const [k, v] of Object.entries(obj)) {
|
||||
if (v === '') {
|
||||
delete obj[k];
|
||||
} else if (typeof v === 'object') {
|
||||
removeEmpty(v);
|
||||
}
|
||||
}
|
||||
})(), a), {});
|
||||
return obj;
|
||||
};
|
||||
removeEmpty(locales);
|
||||
|
||||
return Object.entries(locales)
|
||||
.reduce((a, [k, v]) => (a[k] = (() => {
|
||||
const [lang] = k.split('-');
|
||||
switch (k) {
|
||||
case 'ja-JP': return v;
|
||||
case 'ja-KS':
|
||||
case 'en-US': return merge(locales['ja-JP'], v);
|
||||
default: return merge(
|
||||
locales['ja-JP'],
|
||||
locales['en-US'],
|
||||
locales[`${lang}-${primaries[lang]}`] ?? {},
|
||||
v
|
||||
);
|
||||
}
|
||||
})(), a), {});
|
||||
}
|
||||
|
||||
export default build();
|
||||
|
1098
locales/it-IT.yml
1098
locales/it-IT.yml
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1195
locales/ja-KS.yml
1195
locales/ja-KS.yml
File diff suppressed because it is too large
Load Diff
@@ -104,3 +104,7 @@ _deck:
|
||||
_columns:
|
||||
notifications: "Ilɣuyen"
|
||||
list: "Tibdarin"
|
||||
_abuseReport:
|
||||
_notificationRecipient:
|
||||
_recipientType:
|
||||
mail: "Imayl"
|
||||
|
@@ -77,6 +77,8 @@ _profile:
|
||||
username: "ಬಳಕೆಹೆಸರು"
|
||||
_notification:
|
||||
youWereFollowed: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||
_types:
|
||||
login: "ಪ್ರವೇಶ"
|
||||
_actions:
|
||||
reply: "ಉತ್ತರಿಸು"
|
||||
_deck:
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user