Compare commits
2 Commits
renovate/n
...
12.119.2
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a5a74f4434 | ||
![]() |
993110d114 |
@@ -1,229 +0,0 @@
|
|||||||
#âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
|
|
||||||
# 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,11 +1,4 @@
|
|||||||
# misskey settings
|
|
||||||
# MISSKEY_URL=https://example.tld/
|
|
||||||
|
|
||||||
# db settings
|
# db settings
|
||||||
POSTGRES_PASSWORD=example-misskey-pass
|
POSTGRES_PASSWORD=example-misskey-pass
|
||||||
# DATABASE_PASSWORD=${POSTGRES_PASSWORD}
|
|
||||||
POSTGRES_USER=example-misskey-user
|
POSTGRES_USER=example-misskey-user
|
||||||
# DATABASE_USER=${POSTGRES_USER}
|
|
||||||
POSTGRES_DB=misskey
|
POSTGRES_DB=misskey
|
||||||
# DATABASE_DB=${POSTGRES_DB}
|
|
||||||
DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}"
|
|
||||||
|
@@ -1,254 +0,0 @@
|
|||||||
#âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
|
|
||||||
# Misskey configuration
|
|
||||||
#âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
|
|
||||||
|
|
||||||
# âââââââ
|
|
||||||
#ââââ 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
|
|
||||||
# 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: 3000
|
|
||||||
|
|
||||||
# ââââââââââââââââââââââââââââ
|
|
||||||
#ââââ PostgreSQL configuration âââââââââââââââââââââââââââââââââ
|
|
||||||
|
|
||||||
db:
|
|
||||||
host: 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
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
# âââââââââââââââââââââââââââââââââ
|
|
||||||
#ââââ 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
|
|
||||||
# port: 7700
|
|
||||||
# apiKey: ''
|
|
||||||
# ssl: true
|
|
||||||
# index: ''
|
|
||||||
# scope: local
|
|
||||||
|
|
||||||
# âââââââââââââââââ
|
|
||||||
#ââââ 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
|
|
||||||
|
|
||||||
# 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,77 +2,6 @@
|
|||||||
# Misskey configuration
|
# 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 ââââââââââââââââââââââââââââââââââââââââââââââââââââââ
|
#ââââ URL ââââââââââââââââââââââââââââââââââââââââââââââââââââââ
|
||||||
|
|
||||||
@@ -101,10 +30,6 @@ url: https://example.tld/
|
|||||||
# The port that your Misskey server should listen on.
|
# The port that your Misskey server should listen on.
|
||||||
port: 3000
|
port: 3000
|
||||||
|
|
||||||
# You can also use UNIX domain socket.
|
|
||||||
# socket: /path/to/misskey.sock
|
|
||||||
# chmodSocket: '777'
|
|
||||||
|
|
||||||
# ââââââââââââââââââââââââââââ
|
# ââââââââââââââââââââââââââââ
|
||||||
#ââââ PostgreSQL configuration âââââââââââââââââââââââââââââââââ
|
#ââââ PostgreSQL configuration âââââââââââââââââââââââââââââââââ
|
||||||
|
|
||||||
@@ -126,23 +51,6 @@ db:
|
|||||||
#extra:
|
#extra:
|
||||||
# ssl: true
|
# 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 configuration ââââââââââââââââââââââââââââââââââââââ
|
||||||
|
|
||||||
@@ -153,80 +61,16 @@ redis:
|
|||||||
#pass: example-pass
|
#pass: example-pass
|
||||||
#prefix: example-prefix
|
#prefix: example-prefix
|
||||||
#db: 1
|
#db: 1
|
||||||
# You can specify more ioredis options...
|
|
||||||
#username: example-username
|
|
||||||
|
|
||||||
#redisForPubsub:
|
# âââââââââââââââââââââââââââââââ
|
||||||
|
#ââââ Elasticsearch configuration ââââââââââââââââââââââââââââââ
|
||||||
|
|
||||||
|
#elasticsearch:
|
||||||
# host: localhost
|
# host: localhost
|
||||||
# port: 6379
|
# port: 9200
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
# ssl: false
|
||||||
# #pass: example-pass
|
# user:
|
||||||
# #prefix: example-prefix
|
# pass:
|
||||||
# #db: 1
|
|
||||||
# # You can specify more ioredis options...
|
|
||||||
# #username: example-username
|
|
||||||
|
|
||||||
#redisForJobQueue:
|
|
||||||
# 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
|
|
||||||
|
|
||||||
#redisForTimelines:
|
|
||||||
# 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
|
|
||||||
|
|
||||||
#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
|
|
||||||
# port: 7700
|
|
||||||
# apiKey: ''
|
|
||||||
# ssl: true
|
|
||||||
# index: ''
|
|
||||||
# scope: local
|
|
||||||
|
|
||||||
# âââââââââââââââââ
|
# âââââââââââââââââ
|
||||||
#ââââ ID generation ââââââââââââââââââââââââââââââââââââââââââââ
|
#ââââ ID generation ââââââââââââââââââââââââââââââââââââââââââââ
|
||||||
@@ -237,7 +81,6 @@ fulltextSearch:
|
|||||||
|
|
||||||
# Available methods:
|
# Available methods:
|
||||||
# aid ... Short, Millisecond accuracy
|
# aid ... Short, Millisecond accuracy
|
||||||
# aidx ... Millisecond accuracy
|
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||||
# ulid ... Millisecond accuracy
|
# ulid ... Millisecond accuracy
|
||||||
# objectid ... This is left for backward compatibility
|
# objectid ... This is left for backward compatibility
|
||||||
@@ -245,22 +88,7 @@ fulltextSearch:
|
|||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
# ID SETTINGS AFTER THAT!
|
# ID SETTINGS AFTER THAT!
|
||||||
|
|
||||||
id: 'aidx'
|
id: 'aid'
|
||||||
|
|
||||||
# ââââââââââââââââââ
|
|
||||||
#ââââ 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 ââââââââââââââââââââââââââââââââââââââ
|
#ââââ Other configuration ââââââââââââââââââââââââââââââââââââââ
|
||||||
@@ -274,34 +102,30 @@ id: 'aidx'
|
|||||||
# Job concurrency per worker
|
# Job concurrency per worker
|
||||||
# deliverJobConcurrency: 128
|
# deliverJobConcurrency: 128
|
||||||
# inboxJobConcurrency: 16
|
# inboxJobConcurrency: 16
|
||||||
#relationshipJobConcurrency: 16
|
|
||||||
# What's relationshipJob?:
|
|
||||||
# Follow, unfollow, block and unblock(ings) while following-imports, etc. or account migrations.
|
|
||||||
|
|
||||||
# Job rate limiter
|
# Job rate limiter
|
||||||
# deliverJobPerSec: 128
|
# deliverJobPerSec: 128
|
||||||
#inboxJobPerSec: 32
|
# inboxJobPerSec: 16
|
||||||
#relationshipJobPerSec: 64
|
|
||||||
|
|
||||||
# Job attempts
|
# Job attempts
|
||||||
# deliverJobMaxAttempts: 12
|
# deliverJobMaxAttempts: 12
|
||||||
# inboxJobMaxAttempts: 8
|
# inboxJobMaxAttempts: 8
|
||||||
|
|
||||||
# Local address used for outgoing requests
|
|
||||||
#outgoingAddress: 127.0.0.1
|
|
||||||
|
|
||||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||||
#outgoingAddressFamily: ipv4
|
#outgoingAddressFamily: ipv4
|
||||||
|
|
||||||
|
# Syslog option
|
||||||
|
#syslog:
|
||||||
|
# host: localhost
|
||||||
|
# port: 514
|
||||||
|
|
||||||
# Proxy for HTTP/HTTPS
|
# Proxy for HTTP/HTTPS
|
||||||
#proxy: http://127.0.0.1:3128
|
#proxy: http://127.0.0.1:3128
|
||||||
|
|
||||||
proxyBypassHosts:
|
#proxyBypassHosts: [
|
||||||
- api.deepl.com
|
# 'example.com',
|
||||||
- api-free.deepl.com
|
# '192.0.2.8'
|
||||||
- www.recaptcha.net
|
#]
|
||||||
- hcaptcha.com
|
|
||||||
- challenges.cloudflare.com
|
|
||||||
|
|
||||||
# Proxy for SMTP/SMTPS
|
# Proxy for SMTP/SMTPS
|
||||||
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
||||||
@@ -309,48 +133,17 @@ proxyBypassHosts:
|
|||||||
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
||||||
|
|
||||||
# Media Proxy
|
# Media Proxy
|
||||||
# Reference Implementation: https://github.com/misskey-dev/media-proxy
|
|
||||||
# * Deliver a common cache between instances
|
|
||||||
# * Perform image compression (on a different server resource than the main process)
|
|
||||||
#mediaProxy: https://example.com/proxy
|
#mediaProxy: https://example.com/proxy
|
||||||
|
|
||||||
# Proxy remote files (default: true)
|
# Proxy remote files (default: false)
|
||||||
# Proxy remote files by this instance or mediaProxy to prevent remote files from running in remote domains.
|
#proxyRemoteFiles: true
|
||||||
proxyRemoteFiles: true
|
|
||||||
|
|
||||||
# Movie Thumbnail Generation URL
|
# Sign to ActivityPub GET request (default: false)
|
||||||
# There is no reference implementation.
|
#signToActivityPubGet: true
|
||||||
# For example, Misskey will point to the following URL:
|
|
||||||
# https://example.com/thumbnail.webp?thumbnail=1&url=https%3A%2F%2Fstorage.example.com%2Fpath%2Fto%2Fvideo.mp4
|
|
||||||
#videoThumbnailGenerator: https://example.com
|
|
||||||
|
|
||||||
# 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: [
|
#allowedPrivateNetworks: [
|
||||||
# '127.0.0.1/32'
|
# '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)
|
# Upload or download file size limits (bytes)
|
||||||
#maxFileSize: 262144000
|
#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 +0,0 @@
|
|||||||
FROM mcr.microsoft.com/devcontainers/javascript-node:0-18
|
|
@@ -1,53 +0,0 @@
|
|||||||
services:
|
|
||||||
app:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
- ../:/workspace:cached
|
|
||||||
- node_modules:/workspace/node_modules
|
|
||||||
|
|
||||||
command: sleep infinity
|
|
||||||
|
|
||||||
networks:
|
|
||||||
- internal_network
|
|
||||||
- external_network
|
|
||||||
|
|
||||||
redis:
|
|
||||||
restart: unless-stopped
|
|
||||||
image: redis:7-alpine
|
|
||||||
networks:
|
|
||||||
- internal_network
|
|
||||||
volumes:
|
|
||||||
- redis-data:/data
|
|
||||||
healthcheck:
|
|
||||||
test: "redis-cli ping"
|
|
||||||
interval: 5s
|
|
||||||
retries: 20
|
|
||||||
|
|
||||||
db:
|
|
||||||
restart: unless-stopped
|
|
||||||
image: postgres:15-alpine
|
|
||||||
networks:
|
|
||||||
- internal_network
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
POSTGRES_DB: misskey
|
|
||||||
volumes:
|
|
||||||
- postgres-data:/var/lib/postgresql/data
|
|
||||||
healthcheck:
|
|
||||||
test: "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"
|
|
||||||
interval: 5s
|
|
||||||
retries: 20
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
postgres-data:
|
|
||||||
redis-data:
|
|
||||||
node_modules:
|
|
||||||
|
|
||||||
networks:
|
|
||||||
internal_network:
|
|
||||||
internal: true
|
|
||||||
external_network:
|
|
@@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Misskey",
|
|
||||||
"dockerComposeFile": "compose.yml",
|
|
||||||
"service": "app",
|
|
||||||
"workspaceFolder": "/workspace",
|
|
||||||
"features": {
|
|
||||||
"ghcr.io/devcontainers/features/node:1": {
|
|
||||||
"version": "22.14.0"
|
|
||||||
},
|
|
||||||
"ghcr.io/devcontainers-extra/features/corepack:1": {
|
|
||||||
"version": "0.31.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"forwardPorts": [3000],
|
|
||||||
"postCreateCommand": "/bin/bash .devcontainer/init.sh",
|
|
||||||
"customizations": {
|
|
||||||
"vscode": {
|
|
||||||
"extensions": [
|
|
||||||
"editorconfig.editorconfig",
|
|
||||||
"dbaeumer.vscode-eslint",
|
|
||||||
"Vue.volar",
|
|
||||||
"Orta.vscode-jest",
|
|
||||||
"dbaeumer.vscode-eslint",
|
|
||||||
"mrmlnc.vscode-json5"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,211 +0,0 @@
|
|||||||
#âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
|
|
||||||
# Misskey configuration
|
|
||||||
#âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
|
|
||||||
|
|
||||||
# âââââââ
|
|
||||||
#ââââ URL ââââââââââââââââââââââââââââââââââââââââââââââââââââââ
|
|
||||||
|
|
||||||
# Final accessible URL seen by a user.
|
|
||||||
url: http://127.0.0.1:3000/
|
|
||||||
|
|
||||||
# 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: 3000
|
|
||||||
|
|
||||||
# ââââââââââââââââââââââââââââ
|
|
||||||
#ââââ 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'
|
|
||||||
]
|
|
||||||
|
|
||||||
# Upload or download file size limits (bytes)
|
|
||||||
#maxFileSize: 262144000
|
|
@@ -1,17 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
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
|
|
||||||
corepack install
|
|
||||||
corepack enable
|
|
||||||
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,24 +7,9 @@ Dockerfile
|
|||||||
build/
|
build/
|
||||||
built/
|
built/
|
||||||
db/
|
db/
|
||||||
.devcontainer/compose.yml
|
docker-compose.yml
|
||||||
|
elasticsearch/
|
||||||
node_modules/
|
node_modules/
|
||||||
packages/*/node_modules
|
|
||||||
redis/
|
redis/
|
||||||
files/
|
files/
|
||||||
fluent-emojis/
|
misskey-assets/
|
||||||
.pnp.*
|
|
||||||
|
|
||||||
# .yarnéĸéŖ
|
|
||||||
.yarn/*
|
|
||||||
!.yarn/patches
|
|
||||||
!.yarn/plugins
|
|
||||||
!.yarn/releases
|
|
||||||
!.yarn/sdks
|
|
||||||
!.yarn/versions
|
|
||||||
|
|
||||||
.pnpm-store
|
|
||||||
|
|
||||||
.idea/
|
|
||||||
packages/*/.vscode/
|
|
||||||
packages/backend/test/compose.yml
|
|
||||||
|
@@ -1,3 +0,0 @@
|
|||||||
DKL-DI-0005
|
|
||||||
DKL-DI-0006
|
|
||||||
DKL-LI-0003
|
|
@@ -5,11 +5,6 @@ indent_style = tab
|
|||||||
indent_size = 2
|
indent_size = 2
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
end_of_line = lf
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
|
|
||||||
[*.md]
|
[*.yml]
|
||||||
trim_trailing_whitespace = false
|
|
||||||
|
|
||||||
[*.{yml,yaml}]
|
|
||||||
indent_style = space
|
indent_style = space
|
||||||
|
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -5,4 +5,3 @@
|
|||||||
*.glb -diff -text
|
*.glb -diff -text
|
||||||
*.blend -diff -text
|
*.blend -diff -text
|
||||||
*.afdesign -diff -text
|
*.afdesign -diff -text
|
||||||
* text=auto eol=lf
|
|
||||||
|
3
.github/FUNDING.yml
vendored
Normal file
3
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
patreon: syuilo
|
42
.github/ISSUE_TEMPLATE/01_bug-report.md
vendored
Normal file
42
.github/ISSUE_TEMPLATE/01_bug-report.md
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## đĄ 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 -->
|
||||||
|
|
||||||
|
Misskey version:
|
||||||
|
Your OS:
|
||||||
|
Your browser:
|
97
.github/ISSUE_TEMPLATE/01_bug-report.yml
vendored
97
.github/ISSUE_TEMPLATE/01_bug-report.yml
vendored
@@ -1,97 +0,0 @@
|
|||||||
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
Normal file
12
.github/ISSUE_TEMPLATE/02_feature-request.md
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
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
22
.github/ISSUE_TEMPLATE/02_feature-request.yml
vendored
@@ -1,22 +0,0 @@
|
|||||||
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
|
|
7
.github/ISSUE_TEMPLATE/config.yml
vendored
7
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,8 +1,7 @@
|
|||||||
contact_links:
|
contact_links:
|
||||||
|
- name: đĒ Misskey Forum
|
||||||
|
url: https://forum.misskey.io/
|
||||||
|
about: Ask questions and share knowledge
|
||||||
- name: đŦ Misskey official Discord
|
- name: đŦ Misskey official Discord
|
||||||
url: https://discord.gg/Wp8gVStHW3
|
url: https://discord.gg/Wp8gVStHW3
|
||||||
about: Chat freely about Misskey
|
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
|
|
||||||
|
17
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
17
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<!-- âš ãčĒãŋãã ãã / README
|
||||||
|
PRãããã¨ãããããžãīŧ PRãäŊæããåãĢããŗãŗããĒããĨãŧãˇã§ãŗãŦã¤ãããįĸēčĒãã ãã:
|
||||||
|
Thank you for your PR! Before creating a PR, please check the contribution guide:
|
||||||
|
https://github.com/misskey-dev/misskey/blob/develop/CONTRIBUTING.md
|
||||||
|
-->
|
||||||
|
|
||||||
|
# What
|
||||||
|
<!-- ããŽPRã§äŊããããŽãīŧ ãŠãå¤ãããŽãīŧ -->
|
||||||
|
<!-- What did you do with this PR? How will it change things? -->
|
||||||
|
|
||||||
|
# Why
|
||||||
|
<!-- ãĒããããããŽãīŧ ãŠãããæåŗãĒãŽãīŧ äŊãå°ãŖãĻãããŽãīŧ -->
|
||||||
|
<!-- Why do you do it? What are your intentions? What is the problem? -->
|
||||||
|
|
||||||
|
# Additional info (optional)
|
||||||
|
<!-- ããšãčĻŗįšãĒ㊠-->
|
||||||
|
<!-- Test perspective, etc -->
|
23
.github/PULL_REQUEST_TEMPLATE/01_bug.md
vendored
23
.github/PULL_REQUEST_TEMPLATE/01_bug.md
vendored
@@ -1,23 +0,0 @@
|
|||||||
<!-- âš ãčĒãŋãã ãã / README
|
|
||||||
PRãããã¨ãããããžãīŧ PRãäŊæããåãĢããŗãŗããĒããĨãŧãˇã§ãŗãŦã¤ãããįĸēčĒãã ãã:
|
|
||||||
Thank you for your PR! Before creating a PR, please check the contribution guide:
|
|
||||||
https://github.com/misskey-dev/misskey/blob/develop/CONTRIBUTING.md
|
|
||||||
-->
|
|
||||||
|
|
||||||
## What
|
|
||||||
<!-- ããŽPRã§äŊããããŽãīŧ ãŠãå¤ãããŽãīŧ -->
|
|
||||||
<!-- What did you do with this PR? How will it change things? -->
|
|
||||||
|
|
||||||
## Why
|
|
||||||
<!-- ãĒããããããŽãīŧ ãŠãããæåŗãĒãŽãīŧ äŊãå°ãŖãĻãããŽãīŧ -->
|
|
||||||
<!-- Why do you do it? What are your intentions? What is the problem? -->
|
|
||||||
|
|
||||||
## Additional info (optional)
|
|
||||||
<!-- ããšãčĻŗįšãĒ㊠-->
|
|
||||||
<!-- Test perspective, etc -->
|
|
||||||
|
|
||||||
## Checklist
|
|
||||||
- [ ] Read the [contribution guide](https://github.com/misskey-dev/misskey/blob/develop/CONTRIBUTING.md)
|
|
||||||
- [ ] Test working in a local environment
|
|
||||||
- [ ] (If needed) Update CHANGELOG.md
|
|
||||||
- [ ] (If possible) Add tests
|
|
23
.github/PULL_REQUEST_TEMPLATE/02_enhance.md
vendored
23
.github/PULL_REQUEST_TEMPLATE/02_enhance.md
vendored
@@ -1,23 +0,0 @@
|
|||||||
<!-- âš ãčĒãŋãã ãã / README
|
|
||||||
PRãããã¨ãããããžãīŧ PRãäŊæããåãĢããŗãŗããĒããĨãŧãˇã§ãŗãŦã¤ãããįĸēčĒãã ãã:
|
|
||||||
Thank you for your PR! Before creating a PR, please check the contribution guide:
|
|
||||||
https://github.com/misskey-dev/misskey/blob/develop/CONTRIBUTING.md
|
|
||||||
-->
|
|
||||||
|
|
||||||
## What
|
|
||||||
<!-- ããŽPRã§äŊããããŽãīŧ ãŠãå¤ãããŽãīŧ -->
|
|
||||||
<!-- What did you do with this PR? How will it change things? -->
|
|
||||||
|
|
||||||
## Why
|
|
||||||
<!-- ãĒããããããŽãīŧ ãŠãããæåŗãĒãŽãīŧ äŊãå°ãŖãĻãããŽãīŧ -->
|
|
||||||
<!-- Why do you do it? What are your intentions? What is the problem? -->
|
|
||||||
|
|
||||||
## Additional info (optional)
|
|
||||||
<!-- ããšãčĻŗįšãĒ㊠-->
|
|
||||||
<!-- Test perspective, etc -->
|
|
||||||
|
|
||||||
## Checklist
|
|
||||||
- [ ] Read the [contribution guide](https://github.com/misskey-dev/misskey/blob/develop/CONTRIBUTING.md)
|
|
||||||
- [ ] Test working in a local environment
|
|
||||||
- [ ] (If needed) Update CHANGELOG.md
|
|
||||||
- [ ] (If possible) Add tests
|
|
20
.github/PULL_REQUEST_TEMPLATE/03_release.md
vendored
20
.github/PULL_REQUEST_TEMPLATE/03_release.md
vendored
@@ -1,20 +0,0 @@
|
|||||||
## Summary
|
|
||||||
This is a release PR.
|
|
||||||
|
|
||||||
For more information on the release instructions, please see:
|
|
||||||
https://github.com/misskey-dev/misskey/blob/develop/CONTRIBUTING.md#release
|
|
||||||
|
|
||||||
## For reviewers
|
|
||||||
- CHANGELOGãĢæãæŧãã¯įĄãã
|
|
||||||
- ããŧã¸ã§ãŗãŽä¸ãæšã¯éŠåã
|
|
||||||
- äģãĢããŽãĒãĒãŧãšãĢåĢããĒããã°ãĒããĒã夿´ã¯įĄãã
|
|
||||||
- å
¨äŊįãĒ夿´å
厚ãäŋ¯į°ãåéĄã¯įĄãã
|
|
||||||
- ãŦããĨãŧãããĻããĒããŗããããããå ´åã¯ããããåéĄãĒãã
|
|
||||||
- æįĩįãĒåäŊįĸēčĒãčĄãåéĄã¯įĄãã
|
|
||||||
|
|
||||||
ãĒãŠãįĸēčĒãããĒãĒãŧãšããæēåãæ´ãŖãĻããã¨æãããå ´å㯠approve ããĻãã ããã
|
|
||||||
|
|
||||||
## Checklist
|
|
||||||
- [ ] package.jsonãŽããŧã¸ã§ãŗãæŖããæ´æ°ãããĻãã
|
|
||||||
- [ ] CHANGELOGãéä¸čļŗįĄãæ´æ°ãããĻãã
|
|
||||||
- [ ] CIãå
¨ãĻéãŖãĻãã
|
|
46
.github/dependabot.yml
vendored
46
.github/dependabot.yml
vendored
@@ -5,44 +5,18 @@
|
|||||||
|
|
||||||
version: 2
|
version: 2
|
||||||
updates:
|
updates:
|
||||||
- package-ecosystem: github-actions
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: daily
|
|
||||||
open-pull-requests-limit: 0
|
|
||||||
|
|
||||||
# Add only the root, not each workspace item
|
|
||||||
# https://github.com/dependabot/dependabot-core/issues/4993#issuecomment-1289133027
|
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/"
|
directory: "/"
|
||||||
schedule:
|
schedule:
|
||||||
interval: daily
|
interval: daily
|
||||||
open-pull-requests-limit: 0
|
open-pull-requests-limit: 0
|
||||||
# List dependencies required to be updated together, sharing the same version numbers.
|
- package-ecosystem: npm
|
||||||
# Those who simply have the common owner (e.g. @fastify) don't need to be listed.
|
directory: "/packages/backend"
|
||||||
groups:
|
schedule:
|
||||||
aws-sdk:
|
interval: daily
|
||||||
patterns:
|
open-pull-requests-limit: 0
|
||||||
- "@aws-sdk/*"
|
- package-ecosystem: npm
|
||||||
bull-board:
|
directory: "/packages/client"
|
||||||
patterns:
|
schedule:
|
||||||
- "@bull-board/*"
|
interval: daily
|
||||||
nestjs:
|
open-pull-requests-limit: 0
|
||||||
patterns:
|
|
||||||
- "@nestjs/*"
|
|
||||||
slacc:
|
|
||||||
patterns:
|
|
||||||
- "slacc-*"
|
|
||||||
storybook:
|
|
||||||
patterns:
|
|
||||||
- "storybook*"
|
|
||||||
- "@storybook/*"
|
|
||||||
swc-core:
|
|
||||||
patterns:
|
|
||||||
- "@swc/core*"
|
|
||||||
typescript-eslint:
|
|
||||||
patterns:
|
|
||||||
- "@typescript-eslint/*"
|
|
||||||
tensorflow:
|
|
||||||
patterns:
|
|
||||||
- "@tensorflow/*"
|
|
||||||
|
40
.github/labeler.yml
vendored
40
.github/labeler.yml
vendored
@@ -1,34 +1,12 @@
|
|||||||
'packages/backend':
|
'âī¸Server':
|
||||||
- any:
|
- packages/backend/**/*
|
||||||
- changed-files:
|
|
||||||
- any-glob-to-any-file: ['packages/backend/**/*']
|
|
||||||
|
|
||||||
'packages/backend:test':
|
'đĨī¸Client':
|
||||||
- any:
|
- packages/client/**/*
|
||||||
- changed-files:
|
|
||||||
- any-glob-to-any-file: ['packages/backend/test/**/*', 'packages/backend/test-federation/**/*']
|
|
||||||
|
|
||||||
'packages/frontend':
|
'đ§ĒTest':
|
||||||
- any:
|
- cypress/**/*
|
||||||
- changed-files:
|
- packages/backend/test/**/*
|
||||||
- any-glob-to-any-file: ['packages/frontend/**/*']
|
|
||||||
|
|
||||||
'packages/frontend:test':
|
'âŧī¸ wrong locales':
|
||||||
- any:
|
- any: ['locales/*.yml', '!locales/ja-JP.yml']
|
||||||
- changed-files:
|
|
||||||
- any-glob-to-any-file: ['cypress/**/*']
|
|
||||||
|
|
||||||
'packages/sw':
|
|
||||||
- any:
|
|
||||||
- changed-files:
|
|
||||||
- any-glob-to-any-file: ['packages/sw/**/*']
|
|
||||||
|
|
||||||
'packages/misskey-js':
|
|
||||||
- any:
|
|
||||||
- changed-files:
|
|
||||||
- any-glob-to-any-file: ['packages/misskey-js/**/*']
|
|
||||||
|
|
||||||
'packages/misskey-js:test':
|
|
||||||
- any:
|
|
||||||
- changed-files:
|
|
||||||
- any-glob-to-any-file: ['packages/misskey-js/test/**/*', 'packages/misskey-js/test-d/**/*']
|
|
||||||
|
8
.github/misskey/test.yml
vendored
8
.github/misskey/test.yml
vendored
@@ -1,17 +1,15 @@
|
|||||||
url: 'http://misskey.local'
|
url: 'http://misskey.local'
|
||||||
|
|
||||||
setupPassword: example_password_please_change_this_or_you_will_get_hacked
|
|
||||||
|
|
||||||
# ããŧãĢãĢã§ããšãããã¨ããĢããŧããčĸĢããĒããããĢãããããããŠãĢããŽããŽã¨ã¯å¤ãã(äģĨä¸åã)
|
# ããŧãĢãĢã§ããšãããã¨ããĢããŧããčĸĢããĒããããĢãããããããŠãĢããŽããŽã¨ã¯å¤ãã(äģĨä¸åã)
|
||||||
port: 61812
|
port: 61812
|
||||||
|
|
||||||
db:
|
db:
|
||||||
host: 127.0.0.1
|
host: localhost
|
||||||
port: 54312
|
port: 54312
|
||||||
db: test-misskey
|
db: test-misskey
|
||||||
user: postgres
|
user: postgres
|
||||||
pass: ''
|
pass: ''
|
||||||
redis:
|
redis:
|
||||||
host: 127.0.0.1
|
host: localhost
|
||||||
port: 56312
|
port: 56312
|
||||||
id: aidx
|
id: aid
|
||||||
|
24
.github/pull_request_template.md
vendored
24
.github/pull_request_template.md
vendored
@@ -1,24 +0,0 @@
|
|||||||
<!-- âš ãčĒãŋãã ãã / README
|
|
||||||
PRãããã¨ãããããžãīŧ PRãäŊæããåãĢããŗãŗããĒããĨãŧãˇã§ãŗãŦã¤ãããįĸēčĒãã ãã:
|
|
||||||
Thank you for your PR! Before creating a PR, please check the contribution guide:
|
|
||||||
https://github.com/misskey-dev/misskey/blob/develop/CONTRIBUTING.md
|
|
||||||
-->
|
|
||||||
|
|
||||||
## What
|
|
||||||
<!-- ããŽPRã§äŊããããŽãīŧ ãŠãå¤ãããŽãīŧ -->
|
|
||||||
<!-- What did you do with this PR? How will it change things? -->
|
|
||||||
|
|
||||||
## Why
|
|
||||||
<!-- ãĒããããããŽãīŧ ãŠãããæåŗãĒãŽãīŧ äŊãå°ãŖãĻãããŽãīŧ -->
|
|
||||||
<!-- Why do you do it? What are your intentions? What is the problem? -->
|
|
||||||
|
|
||||||
## Additional info (optional)
|
|
||||||
<!-- ããšãčĻŗįšãĒ㊠-->
|
|
||||||
<!-- Test perspective, etc -->
|
|
||||||
|
|
||||||
## Checklist
|
|
||||||
- [ ] Read the [contribution guide](https://github.com/misskey-dev/misskey/blob/develop/CONTRIBUTING.md)
|
|
||||||
- [ ] Test working in a local environment
|
|
||||||
- [ ] (If needed) Add story of storybook
|
|
||||||
- [ ] (If needed) Update CHANGELOG.md
|
|
||||||
- [ ] (If possible) Add tests
|
|
47
.github/workflows/api-misskey-js.yml
vendored
47
.github/workflows/api-misskey-js.yml
vendored
@@ -1,47 +0,0 @@
|
|||||||
name: API report (misskey.js)
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- packages/misskey-js/**
|
|
||||||
- .github/workflows/api-misskey-js.yml
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- packages/misskey-js/**
|
|
||||||
- .github/workflows/api-misskey-js.yml
|
|
||||||
|
|
||||||
env:
|
|
||||||
COREPACK_DEFAULT_TO_LATEST: 0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
report:
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.2.2
|
|
||||||
|
|
||||||
- run: corepack enable
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v4.2.0
|
|
||||||
with:
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
cache: 'pnpm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm i --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: pnpm --filter misskey-js build
|
|
||||||
|
|
||||||
- name: Check files
|
|
||||||
run: ls packages/misskey-js/built
|
|
||||||
|
|
||||||
- name: API report
|
|
||||||
run: pnpm --filter misskey-js api-prod
|
|
||||||
|
|
||||||
- name: Show report
|
|
||||||
if: always()
|
|
||||||
run: cat packages/misskey-js/temp/misskey-js.api.md
|
|
43
.github/workflows/changelog-check.yml
vendored
43
.github/workflows/changelog-check.yml
vendored
@@ -1,43 +0,0 @@
|
|||||||
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
139
.github/workflows/check-misskey-js-autogen.yml
vendored
@@ -1,139 +0,0 @@
|
|||||||
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
29
.github/workflows/check-misskey-js-version.yml
vendored
@@ -1,29 +0,0 @@
|
|||||||
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
79
.github/workflows/check-spdx-license-id.yml
vendored
@@ -1,79 +0,0 @@
|
|||||||
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
|
|
18
.github/workflows/check_copyright_year.yml
vendored
18
.github/workflows/check_copyright_year.yml
vendored
@@ -1,18 +0,0 @@
|
|||||||
name: Check copyright year
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- develop
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check_copyright_year:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- 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!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
84
.github/workflows/deploy-test-environment.yml
vendored
84
.github/workflows/deploy-test-environment.yml
vendored
@@ -1,84 +0,0 @@
|
|||||||
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 }}
|
|
81
.github/workflows/docker-develop.yml
vendored
81
.github/workflows/docker-develop.yml
vendored
@@ -6,83 +6,28 @@ on:
|
|||||||
- develop
|
- develop
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
|
||||||
REGISTRY_IMAGE: misskey/misskey
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# see https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners
|
push_to_registry:
|
||||||
build:
|
name: Push Docker image to Docker Hub
|
||||||
name: Build
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
platform:
|
|
||||||
- linux/amd64
|
|
||||||
- linux/arm64
|
|
||||||
if: github.repository == 'misskey-dev/misskey'
|
|
||||||
steps:
|
steps:
|
||||||
- name: Prepare
|
|
||||||
run: |
|
|
||||||
platform=${{ matrix.platform }}
|
|
||||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
|
||||||
- name: Check out the repo
|
- name: Check out the repo
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v2
|
||||||
- name: Set up Docker Buildx
|
- name: Docker meta
|
||||||
uses: docker/setup-buildx-action@v3
|
id: meta
|
||||||
|
uses: docker/metadata-action@v3
|
||||||
|
with:
|
||||||
|
images: misskey/misskey
|
||||||
- name: Log in to Docker Hub
|
- name: Log in to Docker Hub
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v1
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
- name: Build and push by digest
|
- name: Build and Push to Docker Hub
|
||||||
id: build
|
uses: docker/build-push-action@v2
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
platforms: ${{ matrix.platform }}
|
tags: misskey/misskey:develop
|
||||||
provenance: false
|
|
||||||
labels: 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
|
|
||||||
|
91
.github/workflows/docker.yml
vendored
91
.github/workflows/docker.yml
vendored
@@ -5,101 +5,28 @@ on:
|
|||||||
types: [published]
|
types: [published]
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
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:
|
jobs:
|
||||||
# see https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners
|
push_to_registry:
|
||||||
build:
|
name: Push Docker image to Docker Hub
|
||||||
name: Build
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
platform:
|
|
||||||
- linux/amd64
|
|
||||||
- linux/arm64
|
|
||||||
steps:
|
steps:
|
||||||
- name: Prepare
|
|
||||||
run: |
|
|
||||||
platform=${{ matrix.platform }}
|
|
||||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
|
||||||
- name: Check out the repo
|
- name: Check out the repo
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v2
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
- name: Docker meta
|
- name: Docker meta
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@v5
|
uses: docker/metadata-action@v3
|
||||||
with:
|
with:
|
||||||
images: ${{ env.REGISTRY_IMAGE }}
|
images: misskey/misskey
|
||||||
tags: ${{ env.TAGS }}
|
|
||||||
- name: Log in to Docker Hub
|
- name: Log in to Docker Hub
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v1
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
- name: Build and Push to Docker Hub
|
- name: Build and Push to Docker Hub
|
||||||
id: build
|
uses: docker/build-push-action@v2
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
platforms: ${{ matrix.platform }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
provenance: false
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
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 }}
|
|
||||||
|
32
.github/workflows/dockle.yml
vendored
32
.github/workflows/dockle.yml
vendored
@@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
name: Dockle
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- develop
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
dockle:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
DOCKER_CONTENT_TRUST: 1
|
|
||||||
DOCKLE_VERSION: 0.4.14
|
|
||||||
steps:
|
|
||||||
- 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 ./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
|
|
||||||
- run: |
|
|
||||||
cmd="dockle --exit-code 1 misskey-web:latest ${image_name}"
|
|
||||||
echo "> ${cmd}"
|
|
||||||
eval "${cmd}"
|
|
73
.github/workflows/get-api-diff.yml
vendored
73
.github/workflows/get-api-diff.yml
vendored
@@ -1,73 +0,0 @@
|
|||||||
# 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
|
|
||||||
|
|
||||||
env:
|
|
||||||
COREPACK_DEFAULT_TO_LATEST: 0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
get-from-misskey:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [22.14.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.2.2
|
|
||||||
with:
|
|
||||||
ref: ${{ matrix.ref }}
|
|
||||||
submodules: true
|
|
||||||
- name: Install pnpm
|
|
||||||
uses: pnpm/action-setup@v4
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
|
||||||
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
|
|
||||||
- name: Copy Configure
|
|
||||||
run: cp .config/example.yml .config/default.yml
|
|
||||||
- name: Build
|
|
||||||
run: pnpm build
|
|
||||||
- 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@v4
|
|
||||||
with:
|
|
||||||
name: api-artifact-${{ matrix.api-json-name }}
|
|
||||||
path: ${{ matrix.api-json-name }}
|
|
||||||
|
|
||||||
save-pr-number:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Save PR number
|
|
||||||
env:
|
|
||||||
PR_NUMBER: ${{ github.event.number }}
|
|
||||||
run: |
|
|
||||||
echo "$PR_NUMBER" > ./pr_number
|
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
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
|
pull-requests: write
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/labeler@v5
|
- uses: actions/labeler@v4
|
||||||
with:
|
with:
|
||||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
112
.github/workflows/lint.yml
vendored
112
.github/workflows/lint.yml
vendored
@@ -5,111 +5,35 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
- develop
|
- 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:
|
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
|
|
||||||
|
|
||||||
env:
|
|
||||||
COREPACK_DEFAULT_TO_LATEST: 0
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pnpm_install:
|
backend:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
|
||||||
submodules: true
|
submodules: true
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: actions/setup-node@v3
|
||||||
- uses: actions/setup-node@v4.2.0
|
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version: 18.x
|
||||||
cache: 'pnpm'
|
cache: 'yarn'
|
||||||
- run: corepack enable
|
cache-dependency-path: |
|
||||||
- run: pnpm i --frozen-lockfile
|
packages/backend/yarn.lock
|
||||||
|
- run: yarn install
|
||||||
|
- run: yarn --cwd ./packages/backend lint
|
||||||
|
|
||||||
lint:
|
client:
|
||||||
needs: [pnpm_install]
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
continue-on-error: true
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
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:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
|
||||||
submodules: true
|
submodules: true
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: actions/setup-node@v3
|
||||||
- uses: actions/setup-node@v4.2.0
|
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version: 18.x
|
||||||
cache: 'pnpm'
|
cache: 'yarn'
|
||||||
- run: corepack enable
|
cache-dependency-path: |
|
||||||
- run: pnpm i --frozen-lockfile
|
packages/client/yarn.lock
|
||||||
- name: Restore eslint cache
|
- run: yarn install
|
||||||
uses: actions/cache@v4.2.2
|
- run: yarn --cwd ./packages/client lint
|
||||||
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]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
continue-on-error: true
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
workspace:
|
|
||||||
- backend
|
|
||||||
- sw
|
|
||||||
- misskey-js
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4.2.2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: true
|
|
||||||
- uses: pnpm/action-setup@v4
|
|
||||||
- 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
|
|
||||||
|
32
.github/workflows/locale.yml
vendored
32
.github/workflows/locale.yml
vendored
@@ -1,32 +0,0 @@
|
|||||||
name: Lint
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- locales/**
|
|
||||||
- .github/workflows/locale.yml
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- locales/**
|
|
||||||
- .github/workflows/locale.yml
|
|
||||||
|
|
||||||
env:
|
|
||||||
COREPACK_DEFAULT_TO_LATEST: 0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
locale_verify:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
continue-on-error: true
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4.2.2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: true
|
|
||||||
- uses: pnpm/action-setup@v4
|
|
||||||
- uses: actions/setup-node@v4.2.0
|
|
||||||
with:
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
cache: 'pnpm'
|
|
||||||
- run: corepack enable
|
|
||||||
- run: pnpm i --frozen-lockfile
|
|
||||||
- run: cd locales && node verify.js
|
|
36
.github/workflows/ok-to-test.yml
vendored
Normal file
36
.github/workflows/ok-to-test.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# 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@v1
|
||||||
|
with:
|
||||||
|
app_id: ${{ secrets.DEPLOYBOT_APP_ID }}
|
||||||
|
private_key: ${{ secrets.DEPLOYBOT_PRIVATE_KEY }}
|
||||||
|
|
||||||
|
- name: Slash Command Dispatch
|
||||||
|
uses: peter-evans/slash-command-dispatch@v1
|
||||||
|
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
|
45
.github/workflows/on-release-created.yml
vendored
45
.github/workflows/on-release-created.yml
vendored
@@ -1,45 +0,0 @@
|
|||||||
name: On Release Created (Publish misskey-js)
|
|
||||||
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [created]
|
|
||||||
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
COREPACK_DEFAULT_TO_LATEST: 0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish-misskey-js:
|
|
||||||
name: Publish misskey-js
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
id-token: write
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [22.14.0]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4.2.2
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
- name: Install pnpm
|
|
||||||
uses: pnpm/action-setup@v4
|
|
||||||
- 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: |
|
|
||||||
corepack enable
|
|
||||||
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 }}
|
|
95
.github/workflows/pr-preview-deploy.yml
vendored
Normal file
95
.github/workflows/pr-preview-deploy.yml
vendored
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
# Run secret-dependent integration tests only after /deploy approval
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, reopened, synchronize]
|
||||||
|
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_name == 'repository_dispatch' &&
|
||||||
|
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@v5
|
||||||
|
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@v5
|
||||||
|
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@v2
|
||||||
|
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@v5
|
||||||
|
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;
|
21
.github/workflows/pr-preview-destroy.yml
vendored
Normal file
21
.github/workflows/pr-preview-destroy.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# file: .github/workflows/preview-closed.yaml
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- closed
|
||||||
|
|
||||||
|
name: Destroy preview environment
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
destroy-preview-environment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Context
|
||||||
|
uses: okteto/context@latest
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.OKTETO_TOKEN }}
|
||||||
|
|
||||||
|
- name: Destroy preview environment
|
||||||
|
uses: okteto/destroy-preview@latest
|
||||||
|
with:
|
||||||
|
name: pr-${{ github.event.number }}-syuilo
|
48
.github/workflows/release-edit-with-push.yml
vendored
48
.github/workflows/release-edit-with-push.yml
vendored
@@ -1,48 +0,0 @@
|
|||||||
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
136
.github/workflows/release-with-dispatch.yml
vendored
@@ -1,136 +0,0 @@
|
|||||||
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
104
.github/workflows/report-api-diff.yml
vendored
@@ -1,104 +0,0 @@
|
|||||||
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 }})ãįĸēčĒããĻãã ããã
|
|
121
.github/workflows/storybook.yml
vendored
121
.github/workflows/storybook.yml
vendored
@@ -1,121 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
||||||
env:
|
|
||||||
COREPACK_DEFAULT_TO_LATEST: 0
|
|
||||||
|
|
||||||
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: Install pnpm
|
|
||||||
uses: pnpm/action-setup@v4
|
|
||||||
- name: Use Node.js 20.x
|
|
||||||
uses: actions/setup-node@v4.2.0
|
|
||||||
with:
|
|
||||||
node-version-file: '.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: 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
|
|
135
.github/workflows/test-backend.yml
vendored
135
.github/workflows/test-backend.yml
vendored
@@ -1,135 +0,0 @@
|
|||||||
name: Test (backend)
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
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
|
|
||||||
|
|
||||||
env:
|
|
||||||
COREPACK_DEFAULT_TO_LATEST: 0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
unit:
|
|
||||||
name: Unit tests (backend)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [22.14.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: Install pnpm
|
|
||||||
uses: pnpm/action-setup@v4
|
|
||||||
- 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'
|
|
||||||
- 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 .github/misskey/test.yml .config
|
|
||||||
- name: Build
|
|
||||||
run: pnpm build
|
|
||||||
- name: Test
|
|
||||||
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.14.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: Install pnpm
|
|
||||||
uses: pnpm/action-setup@v4
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
|
||||||
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
|
|
||||||
- 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
|
|
92
.github/workflows/test-federation.yml
vendored
92
.github/workflows/test-federation.yml
vendored
@@ -1,92 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
||||||
env:
|
|
||||||
COREPACK_DEFAULT_TO_LATEST: 0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
name: Federation test
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [22.14.0]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
- name: Install pnpm
|
|
||||||
uses: pnpm/action-setup@v4
|
|
||||||
- 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: |
|
|
||||||
corepack enable && corepack prepare
|
|
||||||
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
|
|
136
.github/workflows/test-frontend.yml
vendored
136
.github/workflows/test-frontend.yml
vendored
@@ -1,136 +0,0 @@
|
|||||||
name: Test (frontend)
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
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
|
|
||||||
|
|
||||||
env:
|
|
||||||
COREPACK_DEFAULT_TO_LATEST: 0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
vitest:
|
|
||||||
name: Unit tests (frontend)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [22.14.0]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4.2.2
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
- name: Install pnpm
|
|
||||||
uses: pnpm/action-setup@v4
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
|
||||||
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
|
|
||||||
- name: Copy Configure
|
|
||||||
run: cp .github/misskey/test.yml .config
|
|
||||||
- name: Build
|
|
||||||
run: pnpm build
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter frontend test-and-coverage
|
|
||||||
- name: Upload Coverage
|
|
||||||
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: [22.14.0]
|
|
||||||
browser: [chrome]
|
|
||||||
|
|
||||||
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
|
|
||||||
# https://github.com/cypress-io/cypress-docker-images/issues/150
|
|
||||||
#- name: Install mplayer for FireFox
|
|
||||||
# run: sudo apt install mplayer -y
|
|
||||||
# if: ${{ matrix.browser == 'firefox' }}
|
|
||||||
#- uses: browser-actions/setup-firefox@latest
|
|
||||||
# if: ${{ matrix.browser == 'firefox' }}
|
|
||||||
- name: Install pnpm
|
|
||||||
uses: pnpm/action-setup@v4
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
|
||||||
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
|
|
||||||
- name: Build
|
|
||||||
run: pnpm build
|
|
||||||
# https://github.com/cypress-io/cypress/issues/4351#issuecomment-559489091
|
|
||||||
- name: ALSA Env
|
|
||||||
run: echo -e 'pcm.!default {\n type hw\n card 0\n}\n\nctl.!default {\n type hw\n card 0\n}' > ~/.asoundrc
|
|
||||||
# XXX: This tries reinstalling Cypress if the binary is not cached
|
|
||||||
# Remove this when the cache issue is fixed
|
|
||||||
- name: Cypress install
|
|
||||||
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@v4
|
|
||||||
if: failure()
|
|
||||||
with:
|
|
||||||
name: ${{ matrix.browser }}-cypress-screenshots
|
|
||||||
path: cypress/screenshots
|
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
if: always()
|
|
||||||
with:
|
|
||||||
name: ${{ matrix.browser }}-cypress-videos
|
|
||||||
path: cypress/videos
|
|
62
.github/workflows/test-misskey-js.yml
vendored
62
.github/workflows/test-misskey-js.yml
vendored
@@ -1,62 +0,0 @@
|
|||||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
|
||||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
env:
|
|
||||||
COREPACK_DEFAULT_TO_LATEST: 0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
name: Unit tests (misskey.js)
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [22.14.0]
|
|
||||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.2.2
|
|
||||||
|
|
||||||
- run: corepack enable
|
|
||||||
|
|
||||||
- name: Setup Node.js ${{ matrix.node-version }}
|
|
||||||
uses: actions/setup-node@v4.2.0
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node-version }}
|
|
||||||
cache: 'pnpm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm i --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Check pnpm-lock.yaml
|
|
||||||
run: git diff --exit-code pnpm-lock.yaml
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: pnpm --filter misskey-js build
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter misskey-js test
|
|
||||||
env:
|
|
||||||
CI: true
|
|
||||||
|
|
||||||
- name: Upload Coverage
|
|
||||||
uses: codecov/codecov-action@v5
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
|
||||||
files: ./packages/misskey-js/coverage/coverage-final.json
|
|
41
.github/workflows/test-production.yml
vendored
41
.github/workflows/test-production.yml
vendored
@@ -1,41 +0,0 @@
|
|||||||
name: Test (production install and build)
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- develop
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
env:
|
|
||||||
NODE_ENV: production
|
|
||||||
COREPACK_DEFAULT_TO_LATEST: 0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
production:
|
|
||||||
name: Production build
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [22.14.0]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4.2.2
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
- name: Install pnpm
|
|
||||||
uses: pnpm/action-setup@v4
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
|
||||||
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
|
|
||||||
- name: Copy Configure
|
|
||||||
run: cp .github/misskey/test.yml .config/default.yml
|
|
||||||
- name: Build
|
|
||||||
run: pnpm build
|
|
122
.github/workflows/test.yml
vendored
Normal file
122
.github/workflows/test.yml
vendored
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
name: Test
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- develop
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
mocha:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [18.x]
|
||||||
|
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:13
|
||||||
|
ports:
|
||||||
|
- 54312:5432
|
||||||
|
env:
|
||||||
|
POSTGRES_DB: test-misskey
|
||||||
|
POSTGRES_HOST_AUTH_METHOD: trust
|
||||||
|
redis:
|
||||||
|
image: redis:6
|
||||||
|
ports:
|
||||||
|
- 56312:6379
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
cache: 'yarn'
|
||||||
|
cache-dependency-path: |
|
||||||
|
packages/backend/yarn.lock
|
||||||
|
packages/client/yarn.lock
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn install
|
||||||
|
- name: Check yarn.lock
|
||||||
|
run: git diff --exit-code yarn.lock
|
||||||
|
- name: Copy Configure
|
||||||
|
run: cp .github/misskey/test.yml .config
|
||||||
|
- name: Build
|
||||||
|
run: yarn build
|
||||||
|
- name: Test
|
||||||
|
run: yarn mocha
|
||||||
|
|
||||||
|
e2e:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
node-version: [18.x]
|
||||||
|
browser: [chrome]
|
||||||
|
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:13
|
||||||
|
ports:
|
||||||
|
- 54312:5432
|
||||||
|
env:
|
||||||
|
POSTGRES_DB: test-misskey
|
||||||
|
POSTGRES_HOST_AUTH_METHOD: trust
|
||||||
|
redis:
|
||||||
|
image: redis:6
|
||||||
|
ports:
|
||||||
|
- 56312:6379
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
# https://github.com/cypress-io/cypress-docker-images/issues/150
|
||||||
|
#- name: Install mplayer for FireFox
|
||||||
|
# run: sudo apt install mplayer -y
|
||||||
|
# if: ${{ matrix.browser == 'firefox' }}
|
||||||
|
#- uses: browser-actions/setup-firefox@latest
|
||||||
|
# if: ${{ matrix.browser == 'firefox' }}
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
cache: 'yarn'
|
||||||
|
cache-dependency-path: |
|
||||||
|
packages/backend/yarn.lock
|
||||||
|
packages/client/yarn.lock
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn install
|
||||||
|
- name: Check yarn.lock
|
||||||
|
run: git diff --exit-code yarn.lock
|
||||||
|
- name: Copy Configure
|
||||||
|
run: cp .github/misskey/test.yml .config
|
||||||
|
- name: Build
|
||||||
|
run: yarn build
|
||||||
|
# https://github.com/cypress-io/cypress/issues/4351#issuecomment-559489091
|
||||||
|
- name: ALSA Env
|
||||||
|
run: echo -e 'pcm.!default {\n type hw\n card 0\n}\n\nctl.!default {\n type hw\n card 0\n}' > ~/.asoundrc
|
||||||
|
- name: Cypress run
|
||||||
|
uses: cypress-io/github-action@v4
|
||||||
|
with:
|
||||||
|
install: false
|
||||||
|
start: npm run start:test
|
||||||
|
wait-on: 'http://localhost:61812'
|
||||||
|
headless: false
|
||||||
|
browser: ${{ matrix.browser }}
|
||||||
|
- uses: actions/upload-artifact@v2
|
||||||
|
if: failure()
|
||||||
|
with:
|
||||||
|
name: ${{ matrix.browser }}-cypress-screenshots
|
||||||
|
path: cypress/screenshots
|
||||||
|
- uses: actions/upload-artifact@v2
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: ${{ matrix.browser }}-cypress-videos
|
||||||
|
path: cypress/videos
|
49
.github/workflows/validate-api-json.yml
vendored
49
.github/workflows/validate-api-json.yml
vendored
@@ -1,49 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
||||||
env:
|
|
||||||
COREPACK_DEFAULT_TO_LATEST: 0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
validate-api-json:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [22.14.0]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4.2.2
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
- name: Install pnpm
|
|
||||||
uses: pnpm/action-setup@v4
|
|
||||||
- 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: 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 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
|
|
37
.gitignore
vendored
37
.gitignore
vendored
@@ -9,20 +9,6 @@
|
|||||||
node_modules
|
node_modules
|
||||||
report.*.json
|
report.*.json
|
||||||
|
|
||||||
# Yarn
|
|
||||||
.yarn/*
|
|
||||||
!.yarn/patches
|
|
||||||
!.yarn/plugins
|
|
||||||
!.yarn/releases
|
|
||||||
!.yarn/sdks
|
|
||||||
!.yarn/versions
|
|
||||||
packages/frontend/.yarn/cache
|
|
||||||
packages/backend/.yarn/cache
|
|
||||||
packages/sw/.yarn/cache
|
|
||||||
|
|
||||||
# pnpm
|
|
||||||
.pnpm-store
|
|
||||||
|
|
||||||
# Cypress
|
# Cypress
|
||||||
cypress/screenshots
|
cypress/screenshots
|
||||||
cypress/videos
|
cypress/videos
|
||||||
@@ -33,23 +19,15 @@ coverage
|
|||||||
# config
|
# config
|
||||||
/.config/*
|
/.config/*
|
||||||
!/.config/example.yml
|
!/.config/example.yml
|
||||||
!/.config/docker_example.yml
|
|
||||||
!/.config/docker_example.env
|
!/.config/docker_example.env
|
||||||
!/.config/cypress-devcontainer.yml
|
|
||||||
docker-compose.yml
|
|
||||||
./compose.yml
|
|
||||||
.devcontainer/compose.yml
|
|
||||||
!/.devcontainer/compose.yml
|
|
||||||
|
|
||||||
# misskey
|
# misskey
|
||||||
/build
|
/build
|
||||||
built
|
built
|
||||||
built-test
|
|
||||||
js-built
|
|
||||||
/data
|
/data
|
||||||
/.cache-loader
|
/.cache-loader
|
||||||
/db
|
/db
|
||||||
/meili_data
|
/elasticsearch
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
*.pem
|
*.pem
|
||||||
run.bat
|
run.bat
|
||||||
@@ -60,16 +38,6 @@ api-docs.json
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
/files
|
/files
|
||||||
ormconfig.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
|
# blender backups
|
||||||
*.blend1
|
*.blend1
|
||||||
@@ -77,6 +45,3 @@ vite.config.local-dev.ts.timestamp-*
|
|||||||
*.blend3
|
*.blend3
|
||||||
*.blend4
|
*.blend4
|
||||||
*.blend5
|
*.blend5
|
||||||
|
|
||||||
# VSCode addon
|
|
||||||
.favorites.json
|
|
||||||
|
6
.gitmodules
vendored
6
.gitmodules
vendored
@@ -1,3 +1,3 @@
|
|||||||
[submodule "fluent-emojis"]
|
[submodule "misskey-assets"]
|
||||||
path = fluent-emojis
|
path = misskey-assets
|
||||||
url = https://github.com/misskey-dev/emojis.git
|
url = https://github.com/misskey-dev/assets.git
|
||||||
|
@@ -1 +1 @@
|
|||||||
22.14.0
|
v16.15.0
|
||||||
|
4
.vscode/extensions.json
vendored
4
.vscode/extensions.json
vendored
@@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"recommendations": [
|
"recommendations": [
|
||||||
"editorconfig.editorconfig",
|
"editorconfig.editorconfig",
|
||||||
|
"eg2.vscode-npm-script",
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"Vue.volar",
|
"Vue.volar",
|
||||||
"Orta.vscode-jest",
|
"Vue.vscode-typescript-vue-plugin"
|
||||||
"mrmlnc.vscode-json5"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
15
.vscode/settings.json
vendored
15
.vscode/settings.json
vendored
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"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
|
|
||||||
}
|
|
2187
CHANGELOG.md
2187
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
@@ -2,131 +2,45 @@
|
|||||||
|
|
||||||
## Our Pledge
|
## Our Pledge
|
||||||
|
|
||||||
We as members, contributors, and leaders pledge to make participation in our
|
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.
|
||||||
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
|
## Our Standards
|
||||||
|
|
||||||
Examples of behavior that contributes to a positive environment for our
|
Examples of behavior that contributes to creating a positive environment include:
|
||||||
community include:
|
|
||||||
|
|
||||||
* Demonstrating empathy and kindness toward other people
|
* Using welcoming and inclusive language
|
||||||
* Being respectful of differing opinions, viewpoints, and experiences
|
* Being respectful of differing viewpoints and experiences
|
||||||
* Giving and gracefully accepting constructive feedback
|
* Gracefully accepting constructive criticism
|
||||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
* Focusing on what is best for the community
|
||||||
and learning from the experience
|
* Showing empathy towards other community members
|
||||||
* Focusing on what is best not just for us as individuals, but for the overall
|
|
||||||
community
|
|
||||||
|
|
||||||
Examples of unacceptable behavior include:
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
* The use of sexualized language or imagery, and sexual attention or advances of
|
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||||
any kind
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
|
||||||
* Public or private harassment
|
* Public or private harassment
|
||||||
* Publishing others' private information, such as a physical or email address,
|
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||||
without their explicit permission
|
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||||
* Other conduct which could reasonably be considered inappropriate in a
|
|
||||||
professional setting
|
|
||||||
|
|
||||||
## Enforcement Responsibilities
|
## Our Responsibilities
|
||||||
|
|
||||||
Community leaders are responsible for clarifying and enforcing our standards of
|
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.
|
||||||
acceptable behavior and will take appropriate and fair corrective action in
|
|
||||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
|
||||||
or harmful.
|
|
||||||
|
|
||||||
Community leaders have the right and responsibility to remove, edit, or reject
|
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.
|
||||||
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
|
## Scope
|
||||||
|
|
||||||
This Code of Conduct applies within all community spaces, and also applies when
|
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.
|
||||||
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
|
## Enforcement
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
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.
|
||||||
reported to the community leaders responsible for enforcement at
|
|
||||||
<syuilotan@yahoo.co.jp>.
|
|
||||||
All complaints will be reviewed and investigated promptly and fairly.
|
|
||||||
|
|
||||||
All community leaders are obligated to respect the privacy and security of the
|
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.
|
||||||
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
|
## Attribution
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
version 2.1, available at
|
|
||||||
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
|
||||||
|
|
||||||
Community Impact Guidelines were inspired by
|
[homepage]: http://contributor-covenant.org
|
||||||
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
[version]: http://contributor-covenant.org/version/1/4/
|
||||||
|
|
||||||
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
|
|
||||||
|
438
CONTRIBUTING.md
438
CONTRIBUTING.md
@@ -1,7 +1,7 @@
|
|||||||
# Contribution guide
|
# 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.
|
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.**
|
> 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.\
|
> 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.
|
> 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,33 +15,18 @@ Before creating an issue, please check the following:
|
|||||||
- To avoid duplication, please search for similar issues before creating a new issue.
|
- To avoid duplication, please search for similar issues before creating a new issue.
|
||||||
- Do not use Issues to ask questions or troubleshooting.
|
- Do not use Issues to ask questions or troubleshooting.
|
||||||
- Issues should only be used to feature requests, suggestions, and bug tracking.
|
- Issues should only be used to feature requests, suggestions, and bug tracking.
|
||||||
- Please ask questions or troubleshooting in [GitHub Discussions](https://github.com/misskey-dev/misskey/discussions) or [Discord](https://discord.gg/Wp8gVStHW3).
|
- Please ask questions or troubleshooting in the [Misskey Forum](https://forum.misskey.io/) 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.
|
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
|
||||||
|
|
||||||
### Recommended discussing before implementation
|
## 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.
|
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.
|
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.
|
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 Committer to assign you).
|
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.
|
||||||
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
|
## Well-known branches
|
||||||
- **`master`** branch is tracking the latest release and used for production purposes.
|
- **`master`** branch is tracking the latest release and used for production purposes.
|
||||||
@@ -59,34 +44,14 @@ Thank you for your PR! Before creating a PR, please check the following:
|
|||||||
- Check if there are any documents that need to be created or updated due to this change.
|
- 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.
|
- 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.
|
- 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 `npm run test` and `npm run lint`. [See more info](#testing)
|
||||||
- If this PR includes UI changes, please attach a screenshot in the text.
|
- If this PR includes UI changes, please attach a screenshot in the text.
|
||||||
|
|
||||||
Thanks for your cooperation đ¤
|
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
|
## Reviewers guide
|
||||||
Be willing to comment on the good points and not just the things you want fixed đ¯
|
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
|
### Review perspective
|
||||||
- Scope
|
- Scope
|
||||||
- Are the goals of the PR clear?
|
- Are the goals of the PR clear?
|
||||||
@@ -101,22 +66,6 @@ Be willing to comment on the good points and not just the things you want fixed
|
|||||||
- Are there any omissions or gaps?
|
- Are there any omissions or gaps?
|
||||||
- Does it check for anomalies?
|
- 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
|
## Deploy
|
||||||
The `/deploy` command by issue comment can be used to deploy the contents of a PR to the preview environment.
|
The `/deploy` command by issue comment can be used to deploy the contents of a PR to the preview environment.
|
||||||
```
|
```
|
||||||
@@ -128,125 +77,58 @@ An actual domain will be assigned so you can test the federation.
|
|||||||
|
|
||||||
## Release
|
## Release
|
||||||
### Release Instructions
|
### Release Instructions
|
||||||
1. Commit version changes in the `develop` branch ([package.json](package.json))
|
1. Commit version changes in the `develop` branch ([package.json](https://github.com/misskey-dev/misskey/blob/develop/package.json))
|
||||||
2. Create a release PR.
|
2. Create a release PR.
|
||||||
- Into `master` from `develop` branch.
|
- Into `master` from `develop` branch.
|
||||||
- The title must be in the format `Release: x.y.z`.
|
- The title must be in the format `Release: x.y.z`.
|
||||||
- `x.y.z` is the new version you are trying to release.
|
- `x.y.z` is the new version you are trying to release.
|
||||||
3. Deploy and perform a simple QA check. Also verify that the tests passed.
|
3. Deploy and perform a simple QA check. Also verify that the tests passed.
|
||||||
4. Merge it. (Do not squash commit)
|
4. Merge it.
|
||||||
5. Create a [release of GitHub](https://github.com/misskey-dev/misskey/releases)
|
5. Create a [release of GitHub](https://github.com/misskey-dev/misskey/releases)
|
||||||
- The target branch must be `master`
|
- The target branch must be `master`
|
||||||
- The tag name must be the version
|
- The tag name must be the version
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> Why this instruction is necessary:
|
|
||||||
> - To perform final QA checks
|
|
||||||
> - To distribute responsibility
|
|
||||||
> - To check direct commits to develop
|
|
||||||
> - To celebrate the release together đ
|
|
||||||
|
|
||||||
## Localization (l10n)
|
## Localization (l10n)
|
||||||
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
|
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
|
||||||
You can improve our translations with your Crowdin account.
|
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.
|
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.
|
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. We will add it to Crowdin.
|
If your language is not listed in Crowdin, please open an issue.
|
||||||
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
|
## Development
|
||||||
### Setup
|
During development, it is useful to use the `npm run dev` command.
|
||||||
Before developing, you have to set up environment. Misskey requires Redis, PostgreSQL, and FFmpeg.
|
This command monitors the server-side and client-side source files and automatically builds them if they are modified.
|
||||||
|
In addition, it will also automatically start the Misskey server process.
|
||||||
You would want to install Meilisearch to experiment related features. Technically, meilisearch is not strict requirement, but some features and tests require it.
|
|
||||||
|
|
||||||
There are a few ways to proceed.
|
|
||||||
|
|
||||||
#### 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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
**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.
|
|
||||||
``` bash
|
|
||||||
git submodule update --init
|
|
||||||
pnpm install --frozen-lockfile
|
|
||||||
cp .devcontainer/devcontainer.yml .config/default.yml
|
|
||||||
pnpm build
|
|
||||||
pnpm migrate
|
|
||||||
```
|
|
||||||
|
|
||||||
After finishing the migration, you can proceed.
|
|
||||||
|
|
||||||
### 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
|
## Testing
|
||||||
You can run non-backend tests by executing following commands:
|
- Test codes are located in [`/test`](/test).
|
||||||
```sh
|
|
||||||
pnpm --filter frontend test
|
### Run test
|
||||||
pnpm --filter misskey-js test
|
Create a config file.
|
||||||
|
```
|
||||||
|
cp test/test.yml .config/
|
||||||
|
```
|
||||||
|
Prepare DB/Redis for testing.
|
||||||
|
```
|
||||||
|
docker-compose -f test/docker-compose.yml up
|
||||||
|
```
|
||||||
|
Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
|
||||||
|
|
||||||
|
Run all test.
|
||||||
|
```
|
||||||
|
npm run test
|
||||||
```
|
```
|
||||||
|
|
||||||
Backend tests require manual preparation of servers. See the next section for more on this.
|
#### Run specify test
|
||||||
|
```
|
||||||
### Backend
|
npx cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT="./test/tsconfig.json" npx mocha test/foo.ts --require ts-node/register
|
||||||
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/
|
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Start DB and Redis servers for testing:
|
### e2e tests
|
||||||
```sh
|
TODO
|
||||||
docker compose -f packages/backend/test/compose.yml up
|
|
||||||
```
|
|
||||||
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
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Running Multiple-server E2E Tests
|
|
||||||
See [`/packages/backend/test-federation/README.md`](/packages/backend/test-federation/README.md).
|
|
||||||
|
|
||||||
## Environment Variable
|
|
||||||
|
|
||||||
- `MISSKEY_CONFIG_YML`: Specify the file path of config.yml instead of default.yml (e.g. `2nd.yml`).
|
|
||||||
- `MISSKEY_WEBFINGER_USE_HTTP`: If it's set true, WebFinger requests will be http instead of https, useful for testing federation between servers in localhost. NEVER USE IN PRODUCTION.
|
|
||||||
|
|
||||||
## Continuous integration
|
## Continuous integration
|
||||||
Misskey uses GitHub Actions for executing automated tests.
|
Misskey uses GitHub Actions for executing automated tests.
|
||||||
@@ -278,7 +160,7 @@ niraxã¯ãMisskeyã§äŊŋį¨ããĻãããĒãĒã¸ããĢãŽãããŗãã¨ãŗã
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
> [!WARNING]
|
> **Warning**
|
||||||
> įžįļããĢãŧãã¯åŽįžŠãããé ãĢčŠäžĄãããžãã
|
> įžįļããĢãŧãã¯åŽįžŠãããé ãĢčŠäžĄãããžãã
|
||||||
> ãã¨ãã°ã`/foo/:id`ãĢãŧãåŽįžŠãŽæŦĄãĢ`/foo/bar`ãĢãŧãåŽįžŠããããĻããå ´åãåžč
ãããããããã¨ã¯ãããžããã
|
> ãã¨ãã°ã`/foo/:id`ãĢãŧãåŽįžŠãŽæŦĄãĢ`/foo/bar`ãĢãŧãåŽįžŠããããĻããå ´åãåžč
ãããããããã¨ã¯ãããžããã
|
||||||
|
|
||||||
@@ -286,204 +168,10 @@ niraxã¯ãMisskeyã§äŊŋį¨ããĻãããĒãĒã¸ããĢãŽãããŗãã¨ãŗã
|
|||||||
vue-routerã¨ã޿大ãŽéãã¯ãniraxã¯č¤æ°ãŽãĢãŧãŋãŧãåå¨ãããã¨ã訹å¯ããĻããįšã§ãã
|
vue-routerã¨ã޿大ãŽéãã¯ãniraxã¯č¤æ°ãŽãĢãŧãŋãŧãåå¨ãããã¨ã訹å¯ããĻããįšã§ãã
|
||||||
ãããĢããããĸããĒå
ãĻãŖãŗããĻã§ããŠãĻãļã¨ã¯ååĨãĢãĢãŧããŖãŗã°ãããã¨ãĒãŠãå¯čŊãĢãĒããžãã
|
ãããĢããããĸããĒå
ãĻãŖãŗããĻã§ããŠãĻãļã¨ã¯ååĨãĢãĢãŧããŖãŗã°ãããã¨ãĒãŠãå¯čŊãĢãĒããžãã
|
||||||
|
|
||||||
## Storybook
|
|
||||||
|
|
||||||
Misskey uses [Storybook](https://storybook.js.org/) for UI development.
|
|
||||||
|
|
||||||
### Setup & Run
|
|
||||||
|
|
||||||
#### Setup
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm --filter misskey-js build
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Run
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm --filter frontend storybook-dev
|
|
||||||
```
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
When you create a new component (in this example, `MyComponent.vue`), the story file (`MyComponent.stories.ts`) will be automatically generated by the `.storybook/generate.js` script.
|
|
||||||
You can override the default story by creating a impl story file (`MyComponent.stories.impl.ts`).
|
|
||||||
|
|
||||||
```ts
|
|
||||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
|
||||||
import { StoryObj } from '@storybook/vue3';
|
|
||||||
import MyComponent from './MyComponent.vue';
|
|
||||||
export const Default = {
|
|
||||||
render(args) {
|
|
||||||
return {
|
|
||||||
components: {
|
|
||||||
MyComponent,
|
|
||||||
},
|
|
||||||
setup() {
|
|
||||||
return {
|
|
||||||
args,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
props() {
|
|
||||||
return {
|
|
||||||
...this.args,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
},
|
|
||||||
template: '<MyComponent v-bind="props" />',
|
|
||||||
};
|
|
||||||
},
|
|
||||||
args: {
|
|
||||||
foo: 'bar',
|
|
||||||
},
|
|
||||||
parameters: {
|
|
||||||
layout: 'centered',
|
|
||||||
},
|
|
||||||
} 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.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
import MyComponent from './MyComponent.vue';
|
|
||||||
void MyComponent;
|
|
||||||
```
|
|
||||||
|
|
||||||
You can override the component meta by creating a meta story file (`MyComponent.stories.meta.ts`).
|
|
||||||
|
|
||||||
```ts
|
|
||||||
export const argTypes = {
|
|
||||||
scale: {
|
|
||||||
control: {
|
|
||||||
type: 'range',
|
|
||||||
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 { HttpResponse, http } from 'msw';
|
|
||||||
export const handlers = [
|
|
||||||
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
|
## Notes
|
||||||
|
### How to resolve conflictions occurred at yarn.lock?
|
||||||
|
|
||||||
### MisskeyãŽããĄã¤ãŗåēæãŽæĻåŋĩã¯`Mi`ãprefixãã
|
Just execute `yarn` to fix it.
|
||||||
äžãã°GoogleãčĒį¤žãĩãŧããšãMapãEarthãDriveã§ã¯ãĒãGoogle MapãGoogle EarthãGoogle DriveãŽãããĢåŊåãããŽã¨åã
|
|
||||||
ãŗãŧãä¸ã§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.
|
|
||||||
|
|
||||||
### INSERTããã¨ããĢã¯saveã§ã¯ãĒãinsertãäŊŋį¨ãã
|
### INSERTããã¨ããĢã¯saveã§ã¯ãĒãinsertãäŊŋį¨ãã
|
||||||
#6441
|
#6441
|
||||||
@@ -562,41 +250,19 @@ SQLã§ã¯é
åãŽã¤ãŗããã¯ãšã¯**1å§ãžã**ã
|
|||||||
### null IN
|
### null IN
|
||||||
nullãåĢãžããå¯čŊæ§ãŽãããĢãŠã ãĢINããã¨ãã¯ãããŽãžãžã ã¨ãããããĒããŽã§ORãĒãŠã§nullãŽããŗããĒãŗã°ããããã
|
nullãåĢãžããå¯čŊæ§ãŽãããĢãŠã ãĢINããã¨ãã¯ãããŽãžãžã ã¨ãããããĒããŽã§ORãĒãŠã§nullãŽããŗããĒãŗã°ããããã
|
||||||
|
|
||||||
### enumãŽåé¤ã¯æ°ãã¤ãã
|
### `undefined`ãĢãį¨åŋ
|
||||||
enumãŽåæãŽå
厚ãŽåé¤ã¯ãããŽå¤ããã¤ãŦãŗãŧããå
¨ãĻåé¤ããĒãã¨ãããĒã
|
MongoDBãŽæã¨ã¯éããfindOneã§ãŦãŗãŧããååžããæãĢå¯žčąĄãŦãŗãŧããåå¨ããĒãå ´å **`undefined`** ãčŋãŖãĻãããŽã§æŗ¨æã
|
||||||
|
MongoDBã¯`null`ã§čŋããĻããĻããŽã§ãããŽæčĻã§`if (x === null)`ã¨ãæ¸ãã¨ãã°ããäģŖãããĢ`if (x == null)`ã¨æ¸ããĻãã ãã
|
||||||
åé¤ãéãããŖããä¸å¯čŊã ãŖããããå ´åã¯ãåé¤ããĒãã§ãã
|
|
||||||
|
|
||||||
### MigrationäŊææšæŗ
|
### MigrationäŊææšæŗ
|
||||||
packages/backendã§:
|
packages/backendã§:
|
||||||
```sh
|
```sh
|
||||||
pnpm dlx typeorm migration:generate -d ormconfig.js -o <migration name>
|
npx typeorm migration:generate -d ormconfig.js -o <migration name>
|
||||||
```
|
```
|
||||||
|
|
||||||
- įæåžãããĄã¤ãĢãmigrationä¸ãĢį§ģããĻãã ãã
|
- įæåžãããĄã¤ãĢãmigrationä¸ãĢį§ģããĻãã ãã
|
||||||
- äŊæããããšã¯ãĒããã¯ä¸åŋ
čĻãĒ夿´ãåĢãããé¤åģããĻãã ãã
|
- äŊæããããšã¯ãĒããã¯ä¸åŋ
čĻãĒ夿´ãåĢãããé¤åģããĻãã ãã
|
||||||
|
|
||||||
### JSON SchemaãŽobjectã§anyOfãäŊŋãã¨ã
|
|
||||||
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: {
|
|
||||||
hoge: { type: 'string', minLength: 1 },
|
|
||||||
fuga: { type: 'string', minLength: 1 },
|
|
||||||
},
|
|
||||||
anyOf: [
|
|
||||||
{ required: ['hoge'] },
|
|
||||||
{ required: ['fuga'] },
|
|
||||||
],
|
|
||||||
} as const;
|
|
||||||
```
|
|
||||||
|
|
||||||
### ãŗãã¯ãˇã§ãŗãĢã¯`markRaw`ãã
|
### ãŗãã¯ãˇã§ãŗãĢã¯`markRaw`ãã
|
||||||
**VueãŽãŗãŗããŧããŗããŽdataãĒããˇã§ãŗã¨ããĻ**misskey.jsãŽãŗãã¯ãˇã§ãŗãč¨åŽããã¨ããåŋ
ã`markRaw`ã§ãŠããããĻãã ãããã¤ãŗãšãŋãŗãšãä¸åŋ
čĻãĢãĒãĸã¯ããŖãåããããã¨ã§ãmisskey.jså
ãŽåĻįã§ä¸å
ˇåãįēįããã¨ã¨ããĢããããŠãŧããŗãšä¸ãŽåéĄãĢãįšããããĒããComposition APIãäŊŋãå ´åã¯ããŽéãã§ã¯ãĒã(ãĒãĸã¯ããŖãåã¯ãããĨãĸãĢãĒãã)ã
|
**VueãŽãŗãŗããŧããŗããŽdataãĒããˇã§ãŗã¨ããĻ**misskey.jsãŽãŗãã¯ãˇã§ãŗãč¨åŽããã¨ããåŋ
ã`markRaw`ã§ãŠããããĻãã ãããã¤ãŗãšãŋãŗãšãä¸åŋ
čĻãĢãĒãĸã¯ããŖãåããããã¨ã§ãmisskey.jså
ãŽåĻįã§ä¸å
ˇåãįēįããã¨ã¨ããĢããããŠãŧããŗãšä¸ãŽåéĄãĢãįšããããĒããComposition APIãäŊŋãå ´åã¯ããŽéãã§ã¯ãĒã(ãĒãĸã¯ããŖãåã¯ãããĨãĸãĢãĒãã)ã
|
||||||
|
|
||||||
@@ -610,27 +276,3 @@ marginã¯ããŽãŗãŗããŧããŗããäŊŋãå´ãč¨åŽãã
|
|||||||
## ããŽäģ
|
## ããŽäģ
|
||||||
### HTMLãŽã¯ãŠãšåã§ follow ã¨ããåčĒã¯äŊŋããĒã
|
### HTMLãŽã¯ãŠãšåã§ follow ã¨ããåčĒã¯äŊŋããĒã
|
||||||
åēåããããĢãŧã§čǤãŖãĻãããã¯ããã
|
åēåããããĢãŧã§čǤãŖãĻãããã¯ããã
|
||||||
|
|
||||||
### 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
|
Unless otherwise stated this repository is
|
||||||
Copyright Š 2014-2025 syuilo and contributors
|
Copyright Š 2014-2022 syuilo and contributers
|
||||||
|
|
||||||
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
|
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
|
||||||
|
|
||||||
|
117
Dockerfile
117
Dockerfile
@@ -1,113 +1,32 @@
|
|||||||
# syntax = docker/dockerfile:1.4
|
FROM node:16.15.1-bullseye AS builder
|
||||||
|
|
||||||
ARG NODE_VERSION=22.14.0-bookworm
|
|
||||||
|
|
||||||
# build assets & compile TypeScript
|
|
||||||
|
|
||||||
FROM --platform=$BUILDPLATFORM node:${NODE_VERSION} AS native-builder
|
|
||||||
|
|
||||||
ENV COREPACK_DEFAULT_TO_LATEST=0
|
|
||||||
|
|
||||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
|
||||||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
|
||||||
rm -f /etc/apt/apt.conf.d/docker-clean \
|
|
||||||
; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache \
|
|
||||||
&& 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/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
|
ARG NODE_ENV=production
|
||||||
|
|
||||||
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
|
WORKDIR /misskey
|
||||||
pnpm i --frozen-lockfile --aggregate-output
|
|
||||||
|
|
||||||
COPY --link . ./
|
COPY . ./
|
||||||
|
|
||||||
|
RUN apt-get update
|
||||||
|
RUN apt-get install -y build-essential
|
||||||
RUN git submodule update --init
|
RUN git submodule update --init
|
||||||
RUN pnpm build
|
RUN yarn install
|
||||||
RUN rm -rf .git/
|
RUN yarn build
|
||||||
|
RUN rm -rf .git
|
||||||
|
|
||||||
# build native dependencies for target platform
|
FROM node:16.15.1-bullseye-slim AS runner
|
||||||
|
|
||||||
FROM --platform=$TARGETPLATFORM node:${NODE_VERSION} AS target-builder
|
|
||||||
|
|
||||||
ENV COREPACK_DEFAULT_TO_LATEST=0
|
|
||||||
|
|
||||||
RUN apt-get update \
|
|
||||||
&& apt-get install -yqq --no-install-recommends \
|
|
||||||
build-essential
|
|
||||||
|
|
||||||
RUN corepack enable
|
|
||||||
|
|
||||||
WORKDIR /misskey
|
WORKDIR /misskey
|
||||||
|
|
||||||
COPY --link ["pnpm-lock.yaml", "pnpm-workspace.yaml", "package.json", "./"]
|
RUN apt-get update
|
||||||
COPY --link ["scripts", "./scripts"]
|
RUN apt-get install -y ffmpeg tini
|
||||||
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
|
COPY --from=builder /misskey/node_modules ./node_modules
|
||||||
|
COPY --from=builder /misskey/built ./built
|
||||||
|
COPY --from=builder /misskey/packages/backend/node_modules ./packages/backend/node_modules
|
||||||
|
COPY --from=builder /misskey/packages/backend/built ./packages/backend/built
|
||||||
|
COPY --from=builder /misskey/packages/client/node_modules ./packages/client/node_modules
|
||||||
|
COPY . ./
|
||||||
|
|
||||||
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
|
|
||||||
pnpm i --frozen-lockfile --aggregate-output
|
|
||||||
|
|
||||||
FROM --platform=$TARGETPLATFORM node:${NODE_VERSION}-slim AS runner
|
|
||||||
|
|
||||||
ARG UID="991"
|
|
||||||
ARG GID="991"
|
|
||||||
ENV COREPACK_DEFAULT_TO_LATEST=0
|
|
||||||
|
|
||||||
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 /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
|
|
||||||
|
|
||||||
USER misskey
|
|
||||||
WORKDIR /misskey
|
|
||||||
|
|
||||||
# add package.json to add pnpm
|
|
||||||
COPY --chown=misskey:misskey ./package.json ./package.json
|
|
||||||
RUN corepack install
|
|
||||||
|
|
||||||
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 . ./
|
|
||||||
|
|
||||||
ENV LD_PRELOAD=/usr/local/lib/libjemalloc.so
|
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
HEALTHCHECK --interval=5s --retries=20 CMD ["/bin/bash", "/misskey/healthcheck.sh"]
|
|
||||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||||
CMD ["pnpm", "run", "migrateandstart"]
|
CMD ["npm", "run", "migrateandstart"]
|
||||||
|
48
README.md
48
README.md
@@ -1,18 +1,16 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
<a href="https://misskey-hub.net">
|
<a href="https://misskey-hub.net">
|
||||||
<img src="./assets/title_float.svg" alt="Misskey logo" style="border-radius:50%" width="300"/>
|
<img src="./assets/title_float.svg" alt="Misskey logo" style="border-radius:50%" width="400"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
**đ **Misskey** is an open source, federated social media platform that's free forever! đ**
|
**đ **[Misskey](https://misskey-hub.net/)** is an open source, decentralized social media platform that's free forever! đ**
|
||||||
|
|
||||||
[Learn more](https://misskey-hub.net/)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<a href="https://misskey-hub.net/servers/">
|
<a href="https://misskey-hub.net/instances.html">
|
||||||
<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>
|
<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/for-admin/install/guides/">
|
<a href="https://misskey-hub.net/docs/install.html">
|
||||||
<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>
|
<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">
|
<a href="./CONTRIBUTING.md">
|
||||||
@@ -24,26 +22,36 @@
|
|||||||
<a href="https://www.patreon.com/syuilo">
|
<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>
|
<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>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
## Thanks
|
<div>
|
||||||
|
|
||||||
<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>
|
<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>
|
||||||
|
|
||||||
Thanks to [Sentry](https://sentry.io/) for providing the error tracking platform that helps us catch unexpected errors.
|
## ⨠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...
|
||||||
|
|
||||||
<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>
|
</div>
|
||||||
|
|
||||||
Thanks to [Chromatic](https://www.chromatic.com/) for providing the visual testing platform that helps us review UI changes and catch visual regressions.
|
<div style="clear: both;"></div>
|
||||||
|
|
||||||
<a href="https://about.codecov.io/for/open-source/"><img src="https://about.codecov.io/wp-content/themes/codecov/assets/brand/sentry-cobranding/logos/codecov-by-sentry-logo.svg" height="30" alt="Codecov" /></a>
|
## Documentation
|
||||||
|
|
||||||
Thanks to [Codecov](https://about.codecov.io/for/open-source/) for providing the code coverage platform that helps us improve our test coverage.
|
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.
|
||||||
|
|
||||||
<a href="https://crowdin.com/"><img src="https://user-images.githubusercontent.com/20679825/230709597-1299a011-171a-4294-a91e-355a9b37c672.svg" height="30" alt="Crowdin" /></a>
|
## Sponsors
|
||||||
|
<div align="center">
|
||||||
Thanks to [Crowdin](https://crowdin.com/) for providing the localization platform that helps us translate Misskey into many languages.
|
<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>
|
||||||
<a href="https://hub.docker.com/"><img src="https://user-images.githubusercontent.com/20679825/230148221-f8e73a32-a49b-47c3-9029-9a15c3824f92.png" height="30" alt="Docker" /></a>
|
|
||||||
|
|
||||||
Thanks to [Docker](https://hub.docker.com/) for providing the container platform that helps us run Misskey in production.
|
|
||||||
|
16
ROADMAP.md
16
ROADMAP.md
@@ -5,25 +5,25 @@ Also, the later tasks are more indefinite and are subject to change as developme
|
|||||||
## (1) Improve maintainability \<current phase\>
|
## (1) Improve maintainability \<current phase\>
|
||||||
This is the phase we are at now. We need to make a high-maintenance environment that can withstand future development.
|
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 (backend)
|
||||||
- Make the number of type errors zero (frontend)
|
- Probably need to switch some libraries to others that make it difficult to reduce type errors
|
||||||
|
- e.g. koa to fastify https://github.com/misskey-dev/misskey/issues/7537
|
||||||
- Improve CI
|
- Improve CI
|
||||||
- ~~Fix tests~~ â Done âī¸
|
- Fix tests
|
||||||
|
- mocha, jest, etc. do not support the combination of `TypeScript + ESM + Path alias`, and the tests currently do not work.
|
||||||
- Fix random test failures - https://github.com/misskey-dev/misskey/issues/7985 and https://github.com/misskey-dev/misskey/issues/7986
|
- Fix random test failures - https://github.com/misskey-dev/misskey/issues/7985 and https://github.com/misskey-dev/misskey/issues/7986
|
||||||
- Add more tests
|
- Add more tests
|
||||||
- ~~May need to implement a mechanism that allows for DI~~ â Done âī¸
|
- May need to implement a mechanism that allows for DI
|
||||||
- https://github.com/misskey-dev/misskey/pull/9085
|
- https://github.com/misskey-dev/misskey/pull/9085
|
||||||
- ~~Measure coverage~~ â Done âī¸
|
- Measure coverage
|
||||||
- https://github.com/misskey-dev/misskey/pull/9081
|
- https://github.com/misskey-dev/misskey/pull/9081
|
||||||
- Improve documentation
|
- Improve documentation
|
||||||
- Refactoring
|
|
||||||
- Extract the logic of each endpoint definition into a service and just call it
|
|
||||||
|
|
||||||
## (2) Improve functionality
|
## (2) Improve functionality
|
||||||
Once Phase 1 is complete and an environment conducive to the development of a stable system is in place, the implementation of new functions can begin gradually.
|
Once Phase 1 is complete and an environment conducive to the development of a stable system is in place, the implementation of new functions can begin gradually.
|
||||||
|
|
||||||
- Improve features for moderation
|
- Improve features for moderation
|
||||||
- ~~OAuth2 support https://github.com/misskey-dev/misskey/issues/8262~~ â Done âī¸
|
- OAuth2 support https://github.com/misskey-dev/misskey/issues/8262
|
||||||
- GraphQL support?
|
- GraphQL support?
|
||||||
|
|
||||||
## (3) Improve scalability
|
## (3) Improve scalability
|
||||||
|
15
SECURITY.md
15
SECURITY.md
@@ -1,20 +1,9 @@
|
|||||||
# Reporting Security Issues
|
# Reporting Security Issues
|
||||||
|
|
||||||
If you discover a security issue in Misskey, please report it by **[this form](https://github.com/misskey-dev/misskey/security/advisories/new)**.
|
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).
|
||||||
|
|
||||||
This will allow us to assess the risk, and make a fix available before we add a
|
This will allow us to assess the risk, and make a fix available before we add a
|
||||||
bug report to the GitHub repository.
|
bug report to the GitHub repository.
|
||||||
|
|
||||||
Thanks for helping make Misskey safe for everyone.
|
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: 41 KiB |
@@ -1,4 +1,3 @@
|
|||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
name: misskey
|
name: misskey
|
||||||
version: 0.0.0
|
version: 0.0.0
|
||||||
description: This chart is created for the purpose of previewing Pull Requests. Do not use this for production use.
|
|
||||||
|
@@ -72,75 +72,25 @@ db:
|
|||||||
#extra:
|
#extra:
|
||||||
# ssl: true
|
# 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 configuration ââââââââââââââââââââââââââââââââââââââ
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
host: localhost
|
host: localhost
|
||||||
port: 6379
|
port: 6379
|
||||||
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
#pass: example-pass
|
#pass: example-pass
|
||||||
#prefix: example-prefix
|
#prefix: example-prefix
|
||||||
#db: 1
|
#db: 1
|
||||||
|
|
||||||
#redisForPubsub:
|
# âââââââââââââââââââââââââââââââ
|
||||||
|
#ââââ Elasticsearch configuration ââââââââââââââââââââââââââââââ
|
||||||
|
|
||||||
|
#elasticsearch:
|
||||||
# host: localhost
|
# host: localhost
|
||||||
# port: 6379
|
# port: 9200
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
# ssl: false
|
||||||
# #pass: example-pass
|
# user:
|
||||||
# #prefix: example-prefix
|
# pass:
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForJobQueue:
|
|
||||||
# host: localhost
|
|
||||||
# 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: localhost
|
|
||||||
# port: 7700
|
|
||||||
# apiKey: ''
|
|
||||||
# ssl: true
|
|
||||||
# index: ''
|
|
||||||
|
|
||||||
# âââââââââââââââââ
|
# âââââââââââââââââ
|
||||||
#ââââ ID generation ââââââââââââââââââââââââââââââââââââââââââââ
|
#ââââ ID generation ââââââââââââââââââââââââââââââââââââââââââââ
|
||||||
@@ -151,7 +101,6 @@ redis:
|
|||||||
|
|
||||||
# Available methods:
|
# Available methods:
|
||||||
# aid ... Short, Millisecond accuracy
|
# aid ... Short, Millisecond accuracy
|
||||||
# aidx ... Millisecond accuracy
|
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||||
# ulid ... Millisecond accuracy
|
# ulid ... Millisecond accuracy
|
||||||
# objectid ... This is left for backward compatibility
|
# objectid ... This is left for backward compatibility
|
||||||
@@ -159,23 +108,7 @@ redis:
|
|||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
# ID SETTINGS AFTER THAT!
|
# ID SETTINGS AFTER THAT!
|
||||||
|
|
||||||
id: "aidx"
|
id: "aid"
|
||||||
|
|
||||||
# ââââââââââââââââââ
|
|
||||||
#ââââ 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 ââââââââââââââââââââââââââââââââââââââ
|
#ââââ Other configuration ââââââââââââââââââââââââââââââââââââââ
|
||||||
|
|
||||||
@@ -191,7 +124,7 @@ id: "aidx"
|
|||||||
|
|
||||||
# Job rate limiter
|
# Job rate limiter
|
||||||
# deliverJobPerSec: 128
|
# deliverJobPerSec: 128
|
||||||
# inboxJobPerSec: 32
|
# inboxJobPerSec: 16
|
||||||
|
|
||||||
# Job attempts
|
# Job attempts
|
||||||
# deliverJobMaxAttempts: 12
|
# deliverJobMaxAttempts: 12
|
||||||
@@ -200,6 +133,11 @@ id: "aidx"
|
|||||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||||
#outgoingAddressFamily: ipv4
|
#outgoingAddressFamily: ipv4
|
||||||
|
|
||||||
|
# Syslog option
|
||||||
|
#syslog:
|
||||||
|
# host: localhost
|
||||||
|
# port: 514
|
||||||
|
|
||||||
# Proxy for HTTP/HTTPS
|
# Proxy for HTTP/HTTPS
|
||||||
#proxy: http://127.0.0.1:3128
|
#proxy: http://127.0.0.1:3128
|
||||||
|
|
||||||
@@ -216,8 +154,8 @@ id: "aidx"
|
|||||||
# Media Proxy
|
# Media Proxy
|
||||||
#mediaProxy: https://example.com/proxy
|
#mediaProxy: https://example.com/proxy
|
||||||
|
|
||||||
# Sign to ActivityPub GET request (default: true)
|
# Sign to ActivityPub GET request (default: false)
|
||||||
signToActivityPubGet: true
|
#signToActivityPubGet: true
|
||||||
|
|
||||||
#allowedPrivateNetworks: [
|
#allowedPrivateNetworks: [
|
||||||
# '127.0.0.1/32'
|
# '127.0.0.1/32'
|
||||||
|
@@ -27,7 +27,7 @@ spec:
|
|||||||
ports:
|
ports:
|
||||||
- containerPort: 3000
|
- containerPort: 3000
|
||||||
- name: postgres
|
- name: postgres
|
||||||
image: postgres:15-alpine
|
image: postgres:14-alpine
|
||||||
env:
|
env:
|
||||||
- name: POSTGRES_USER
|
- name: POSTGRES_USER
|
||||||
value: "example-misskey-user"
|
value: "example-misskey-user"
|
||||||
@@ -38,7 +38,7 @@ spec:
|
|||||||
ports:
|
ports:
|
||||||
- containerPort: 5432
|
- containerPort: 5432
|
||||||
- name: redis
|
- name: redis
|
||||||
image: redis:7-alpine
|
image: redis:alpine
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 6379
|
- containerPort: 6379
|
||||||
volumes:
|
volumes:
|
||||||
|
@@ -1,4 +0,0 @@
|
|||||||
coverage:
|
|
||||||
status:
|
|
||||||
project: false
|
|
||||||
patch: false
|
|
@@ -1,40 +0,0 @@
|
|||||||
# ããŽ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,98 +0,0 @@
|
|||||||
services:
|
|
||||||
web:
|
|
||||||
build: .
|
|
||||||
restart: always
|
|
||||||
links:
|
|
||||||
- db
|
|
||||||
- redis
|
|
||||||
# - mcaptcha
|
|
||||||
# - meilisearch
|
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
redis:
|
|
||||||
condition: service_healthy
|
|
||||||
ports:
|
|
||||||
- "3000:3000"
|
|
||||||
networks:
|
|
||||||
- internal_network
|
|
||||||
- external_network
|
|
||||||
# env_file:
|
|
||||||
# - .config/docker.env
|
|
||||||
volumes:
|
|
||||||
- ./files:/misskey/files
|
|
||||||
- ./.config:/misskey/.config:ro
|
|
||||||
|
|
||||||
redis:
|
|
||||||
restart: always
|
|
||||||
image: redis:7-alpine
|
|
||||||
networks:
|
|
||||||
- internal_network
|
|
||||||
volumes:
|
|
||||||
- ./redis:/data
|
|
||||||
healthcheck:
|
|
||||||
test: "redis-cli ping"
|
|
||||||
interval: 5s
|
|
||||||
retries: 20
|
|
||||||
|
|
||||||
db:
|
|
||||||
restart: always
|
|
||||||
image: postgres:15-alpine
|
|
||||||
networks:
|
|
||||||
- internal_network
|
|
||||||
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
|
|
||||||
|
|
||||||
# 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
|
|
||||||
# environment:
|
|
||||||
# - MEILI_NO_ANALYTICS=true
|
|
||||||
# - MEILI_ENV=production
|
|
||||||
# env_file:
|
|
||||||
# - .config/meilisearch.env
|
|
||||||
# networks:
|
|
||||||
# - internal_network
|
|
||||||
# volumes:
|
|
||||||
# - ./meili_data:/meili_data
|
|
||||||
|
|
||||||
networks:
|
|
||||||
internal_network:
|
|
||||||
internal: true
|
|
||||||
external_network:
|
|
149
cypress/e2e/basic.cy.js
Normal file
149
cypress/e2e/basic.cy.js
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
describe('Before setup instance', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.resetState();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// ããšãįĩäēį´åãĢããŧã¸éˇį§ģãããããĒããšããąãŧãš(äžãã°ãĸãĢãĻãŗãäŊæ)ã ã¨ãããļãCypressãŽãã°ã§ããŠãĻãļãŽå
厚ãæŦĄãŽããšããąãŧãšãĢåŧãįļãããĻããžã(äžãã°ãĸãĢãĻãŗããäŊæãįĩããŖãæŽĩéããããšããå§ãžã)ã
|
||||||
|
// waitãå
Ĩãããã¨ã§ããã鞿ĸã§ãã
|
||||||
|
cy.wait(1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('successfully loads', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('setup instance', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
cy.intercept('POST', '/api/admin/accounts/create').as('signup');
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
// ãĒããåããĒã
|
||||||
|
//cy.wait('@signup').should('have.property', 'response.statusCode');
|
||||||
|
cy.wait('@signup');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('After setup instance', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.resetState();
|
||||||
|
|
||||||
|
// ã¤ãŗãšãŋãŗãšåæãģãããĸãã
|
||||||
|
cy.registerUser('admin', 'pass', true);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// ããšãįĩäēį´åãĢããŧã¸éˇį§ģãããããĒããšããąãŧãš(äžãã°ãĸãĢãĻãŗãäŊæ)ã ã¨ãããļãCypressãŽãã°ã§ããŠãĻãļãŽå
厚ãæŦĄãŽããšããąãŧãšãĢåŧãįļãããĻããžã(äžãã°ãĸãĢãĻãŗããäŊæãįĩããŖãæŽĩéããããšããå§ãžã)ã
|
||||||
|
// waitãå
Ĩãããã¨ã§ããã鞿ĸã§ãã
|
||||||
|
cy.wait(1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('successfully loads', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('signup', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
cy.intercept('POST', '/api/signup').as('signup');
|
||||||
|
|
||||||
|
cy.get('[data-cy-signup]').click();
|
||||||
|
cy.get('[data-cy-signup-username] input').type('alice');
|
||||||
|
cy.get('[data-cy-signup-password] input').type('alice1234');
|
||||||
|
cy.get('[data-cy-signup-password-retype] input').type('alice1234');
|
||||||
|
cy.get('[data-cy-signup-submit]').click();
|
||||||
|
|
||||||
|
cy.wait('@signup');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('After user signup', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.resetState();
|
||||||
|
|
||||||
|
// ã¤ãŗãšãŋãŗãšåæãģãããĸãã
|
||||||
|
cy.registerUser('admin', 'pass', true);
|
||||||
|
|
||||||
|
// ãĻãŧãļãŧäŊæ
|
||||||
|
cy.registerUser('alice', 'alice1234');
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// ããšãįĩäēį´åãĢããŧã¸éˇį§ģãããããĒããšããąãŧãš(äžãã°ãĸãĢãĻãŗãäŊæ)ã ã¨ãããļãCypressãŽãã°ã§ããŠãĻãļãŽå
厚ãæŦĄãŽããšããąãŧãšãĢåŧãįļãããĻããžã(äžãã°ãĸãĢãĻãŗããäŊæãįĩããŖãæŽĩéããããšããå§ãžã)ã
|
||||||
|
// waitãå
Ĩãããã¨ã§ããã鞿ĸã§ãã
|
||||||
|
cy.wait(1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('successfully loads', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('signin', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
cy.intercept('POST', '/api/signin').as('signin');
|
||||||
|
|
||||||
|
cy.get('[data-cy-signin]').click();
|
||||||
|
cy.get('[data-cy-signin-username] input').type('alice');
|
||||||
|
// Enterããŧã§ãĩã¤ãŗã¤ãŗã§ããããŽįĸēčĒãå
ŧãã
|
||||||
|
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||||
|
|
||||||
|
cy.wait('@signin');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('suspend', function() {
|
||||||
|
cy.request('POST', '/api/admin/suspend-user', {
|
||||||
|
i: this.admin.token,
|
||||||
|
userId: this.alice.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
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}');
|
||||||
|
|
||||||
|
// TODO: cypressãĢããŠãĻãļãŽč¨čĒæåŽã§ããæŠčŊãåŽčŖ
ããæŦĄįŦŦčąčĒãŽãŋããšããããããĢãã
|
||||||
|
cy.contains(/ãĸãĢãĻãŗããåįĩãããĻããžã|This account has been suspended due to/gi);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('After user singed in', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.resetState();
|
||||||
|
|
||||||
|
// ã¤ãŗãšãŋãŗãšåæãģãããĸãã
|
||||||
|
cy.registerUser('admin', 'pass', true);
|
||||||
|
|
||||||
|
// ãĻãŧãļãŧäŊæ
|
||||||
|
cy.registerUser('alice', 'alice1234');
|
||||||
|
|
||||||
|
cy.login('alice', 'alice1234');
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// ããšãįĩäēį´åãĢããŧã¸éˇį§ģãããããĒããšããąãŧãš(äžãã°ãĸãĢãĻãŗãäŊæ)ã ã¨ãããļãCypressãŽãã°ã§ããŠãĻãļãŽå
厚ãæŦĄãŽããšããąãŧãšãĢåŧãįļãããĻããžã(äžãã°ãĸãĢãĻãŗããäŊæãįĩããŖãæŽĩéããããšããå§ãžã)ã
|
||||||
|
// waitãå
Ĩãããã¨ã§ããã鞿ĸã§ãã
|
||||||
|
cy.wait(1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('successfully loads', () => {
|
||||||
|
cy.get('[data-cy-open-post-form]').should('be.visible');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('note', () => {
|
||||||
|
cy.get('[data-cy-open-post-form]').click();
|
||||||
|
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
||||||
|
cy.get('[data-cy-open-post-form-submit]').click();
|
||||||
|
|
||||||
|
cy.contains('Hello, Misskey!');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO: æį¨ŋããŠãŧã ãŽå
Ŧéį¯å˛æåŽãŽããšã
|
||||||
|
// TODO: æį¨ŋããŠãŧã ãŽããĄã¤ãĢæˇģäģãŽããšã
|
||||||
|
// TODO: æį¨ŋããŠãŧã ãŽãããˇãĨãŋã°äŋæããŖãŧãĢããŽããšã
|
@@ -1,255 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
describe('Before setup instance', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.resetState();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
// ããšãįĩäēį´åãĢããŧã¸éˇį§ģãããããĒããšããąãŧãš(äžãã°ãĸãĢãĻãŗãäŊæ)ã ã¨ãããļãCypressãŽãã°ã§ããŠãĻãļãŽå
厚ãæŦĄãŽããšããąãŧãšãĢåŧãįļãããĻããžã(äžãã°ãĸãĢãĻãŗããäŊæãįĩããŖãæŽĩéããããšããå§ãžã)ã
|
|
||||||
// waitãå
Ĩãããã¨ã§ããã鞿ĸã§ãã
|
|
||||||
cy.wait(1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('successfully loads', () => {
|
|
||||||
cy.visitHome();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('setup instance', () => {
|
|
||||||
cy.visitHome();
|
|
||||||
|
|
||||||
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();
|
|
||||||
|
|
||||||
// ãĒããåããĒã
|
|
||||||
//cy.wait('@signup').should('have.property', 'response.statusCode');
|
|
||||||
cy.wait('@signup');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('After setup instance', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.resetState();
|
|
||||||
|
|
||||||
// ã¤ãŗãšãŋãŗãšåæãģãããĸãã
|
|
||||||
cy.registerUser('admin', 'pass', true);
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
// ããšãįĩäēį´åãĢããŧã¸éˇį§ģãããããĒããšããąãŧãš(äžãã°ãĸãĢãĻãŗãäŊæ)ã ã¨ãããļãCypressãŽãã°ã§ããŠãĻãļãŽå
厚ãæŦĄãŽããšããąãŧãšãĢåŧãįļãããĻããžã(äžãã°ãĸãĢãĻãŗããäŊæãįĩããŖãæŽĩéããããšããå§ãžã)ã
|
|
||||||
// waitãå
Ĩãããã¨ã§ããã鞿ĸã§ãã
|
|
||||||
cy.wait(1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('successfully loads', () => {
|
|
||||||
cy.visitHome();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('signup', () => {
|
|
||||||
cy.visitHome();
|
|
||||||
|
|
||||||
cy.intercept('POST', '/api/signup').as('signup');
|
|
||||||
|
|
||||||
cy.get('[data-cy-signup]').click();
|
|
||||||
cy.get('[data-cy-signup-rules-continue]').should('be.disabled');
|
|
||||||
cy.get('[data-cy-signup-rules-notes-agree] [data-cy-switch-toggle]').click();
|
|
||||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
|
||||||
cy.get('[data-cy-signup-rules-continue]').should('not.be.disabled');
|
|
||||||
cy.get('[data-cy-signup-rules-continue]').click();
|
|
||||||
|
|
||||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
|
||||||
cy.get('[data-cy-signup-username] input').type('alice');
|
|
||||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
|
||||||
cy.get('[data-cy-signup-password] input').type('alice1234');
|
|
||||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
|
||||||
cy.get('[data-cy-signup-password-retype] input').type('alice1234');
|
|
||||||
cy.get('[data-cy-signup-submit]').should('not.be.disabled');
|
|
||||||
cy.get('[data-cy-signup-submit]').click();
|
|
||||||
|
|
||||||
cy.wait('@signup');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('signup with duplicated username', () => {
|
|
||||||
cy.registerUser('alice', 'alice1234');
|
|
||||||
|
|
||||||
cy.visitHome();
|
|
||||||
|
|
||||||
// ãĻãŧãļãŧåãéč¤ããĻããå ´åãŽæåįĸēčĒ
|
|
||||||
cy.get('[data-cy-signup]').click();
|
|
||||||
cy.get('[data-cy-signup-rules-continue]').should('be.disabled');
|
|
||||||
cy.get('[data-cy-signup-rules-notes-agree] [data-cy-switch-toggle]').click();
|
|
||||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
|
||||||
cy.get('[data-cy-signup-rules-continue]').should('not.be.disabled');
|
|
||||||
cy.get('[data-cy-signup-rules-continue]').click();
|
|
||||||
|
|
||||||
cy.get('[data-cy-signup-username] input').type('alice');
|
|
||||||
cy.get('[data-cy-signup-password] input').type('alice1234');
|
|
||||||
cy.get('[data-cy-signup-password-retype] input').type('alice1234');
|
|
||||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('After user signup', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.resetState();
|
|
||||||
|
|
||||||
// ã¤ãŗãšãŋãŗãšåæãģãããĸãã
|
|
||||||
cy.registerUser('admin', 'pass', true);
|
|
||||||
|
|
||||||
// ãĻãŧãļãŧäŊæ
|
|
||||||
cy.registerUser('alice', 'alice1234');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
// ããšãįĩäēį´åãĢããŧã¸éˇį§ģãããããĒããšããąãŧãš(äžãã°ãĸãĢãĻãŗãäŊæ)ã ã¨ãããļãCypressãŽãã°ã§ããŠãĻãļãŽå
厚ãæŦĄãŽããšããąãŧãšãĢåŧãįļãããĻããžã(äžãã°ãĸãĢãĻãŗããäŊæãįĩããŖãæŽĩéããããšããå§ãžã)ã
|
|
||||||
// waitãå
Ĩãããã¨ã§ããã鞿ĸã§ãã
|
|
||||||
cy.wait(1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('successfully loads', () => {
|
|
||||||
cy.visitHome();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('signin', () => {
|
|
||||||
cy.visitHome();
|
|
||||||
|
|
||||||
cy.intercept('POST', '/api/signin-flow').as('signin');
|
|
||||||
|
|
||||||
cy.get('[data-cy-signin]').click();
|
|
||||||
|
|
||||||
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');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('suspend', function() {
|
|
||||||
cy.request('POST', '/api/admin/suspend-user', {
|
|
||||||
i: this.admin.token,
|
|
||||||
userId: this.alice.id,
|
|
||||||
});
|
|
||||||
|
|
||||||
cy.visitHome();
|
|
||||||
|
|
||||||
cy.get('[data-cy-signin]').click();
|
|
||||||
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('After user signed in', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.resetState();
|
|
||||||
|
|
||||||
// ã¤ãŗãšãŋãŗãšåæãģãããĸãã
|
|
||||||
cy.registerUser('admin', 'pass', true);
|
|
||||||
|
|
||||||
// ãĻãŧãļãŧäŊæ
|
|
||||||
cy.registerUser('alice', 'alice1234');
|
|
||||||
|
|
||||||
cy.login('alice', 'alice1234');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
// ããšãįĩäēį´åãĢããŧã¸éˇį§ģãããããĒããšããąãŧãš(äžãã°ãĸãĢãĻãŗãäŊæ)ã ã¨ãããļãCypressãŽãã°ã§ããŠãĻãļãŽå
厚ãæŦĄãŽããšããąãŧãšãĢåŧãįļãããĻããžã(äžãã°ãĸãĢãĻãŗããäŊæãįĩããŖãæŽĩéããããšããå§ãžã)ã
|
|
||||||
// waitãå
Ĩãããã¨ã§ããã鞿ĸã§ãã
|
|
||||||
cy.wait(1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('successfully loads', () => {
|
|
||||||
// 襨į¤ēãĢæéãããããŽã§ãããŠãĢãį§æ°ã ã¨ãŋã¤ã ãĸãĻããã
|
|
||||||
cy.get('[data-cy-user-setup-continue]', { timeout: 30000 }).should('be.visible');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('account setup wizard', () => {
|
|
||||||
// 襨į¤ēãĢæéãããããŽã§ãããŠãĢãį§æ°ã ã¨ãŋã¤ã ãĸãĻããã
|
|
||||||
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('ãģã');
|
|
||||||
// TODO: ãĸã¤ãŗãŗč¨åŽããšã
|
|
||||||
|
|
||||||
cy.get('[data-cy-user-setup-continue]').click();
|
|
||||||
|
|
||||||
// ããŠã¤ããˇãŧč¨åŽ
|
|
||||||
|
|
||||||
cy.get('[data-cy-user-setup-continue]').click();
|
|
||||||
|
|
||||||
// ããŠããŧã¯ãšããã
|
|
||||||
|
|
||||||
cy.get('[data-cy-user-setup-continue]').click();
|
|
||||||
|
|
||||||
// ãããˇãĨéįĨč¨åŽã¯ãšããã
|
|
||||||
|
|
||||||
cy.get('[data-cy-user-setup-continue]').click();
|
|
||||||
|
|
||||||
cy.get('[data-cy-user-setup-continue]').click();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('After user setup', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
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.get('[data-cy-modal-dialog-ok]').click();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
// ããšãįĩäēį´åãĢããŧã¸éˇį§ģãããããĒããšããąãŧãš(äžãã°ãĸãĢãĻãŗãäŊæ)ã ã¨ãããļãCypressãŽãã°ã§ããŠãĻãļãŽå
厚ãæŦĄãŽããšããąãŧãšãĢåŧãįļãããĻããžã(äžãã°ãĸãĢãĻãŗããäŊæãįĩããŖãæŽĩéããããšããå§ãžã)ã
|
|
||||||
// waitãå
Ĩãããã¨ã§ããã鞿ĸã§ãã
|
|
||||||
cy.wait(1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('note', () => {
|
|
||||||
cy.get('[data-cy-open-post-form]').should('be.visible');
|
|
||||||
cy.get('[data-cy-open-post-form]').click();
|
|
||||||
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
|
||||||
cy.get('[data-cy-open-post-form-submit]').click();
|
|
||||||
|
|
||||||
cy.contains('Hello, Misskey!', { timeout: 15000 });
|
|
||||||
});
|
|
||||||
|
|
||||||
it('open note form with hotkey', () => {
|
|
||||||
// Wait until the page loads
|
|
||||||
cy.get('[data-cy-open-post-form]').should('be.visible');
|
|
||||||
// Use trigger() to give different `code` to test if hotkeys also work on non-QWERTY keyboards.
|
|
||||||
cy.document().trigger("keydown", { eventConstructor: 'KeyboardEvent', key: "n", code: "KeyL" });
|
|
||||||
// See if the form is opened
|
|
||||||
cy.get('[data-cy-post-form-text]').should('be.visible');
|
|
||||||
// Close it
|
|
||||||
cy.focused().trigger("keydown", { eventConstructor: 'KeyboardEvent', key: "Escape", code: "Escape" });
|
|
||||||
// See if the form is closed
|
|
||||||
cy.get('[data-cy-post-form-text]').should('not.be.visible');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// TODO: æį¨ŋããŠãŧã ãŽå
Ŧéį¯å˛æåŽãŽããšã
|
|
||||||
// TODO: æį¨ŋããŠãŧã ãŽããĄã¤ãĢæˇģäģãŽããšã
|
|
||||||
// TODO: æį¨ŋããŠãŧã ãŽãããˇãĨãŋã°äŋæããŖãŧãĢããŽããšã
|
|
@@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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')
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
65
cypress/e2e/widgets.cy.js
Normal file
65
cypress/e2e/widgets.cy.js
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
describe('After user signed in', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.resetState();
|
||||||
|
cy.viewport('macbook-16');
|
||||||
|
|
||||||
|
// ã¤ãŗãšãŋãŗãšåæãģãããĸãã
|
||||||
|
cy.registerUser('admin', 'pass', true);
|
||||||
|
|
||||||
|
// ãĻãŧãļãŧäŊæ
|
||||||
|
cy.registerUser('alice', 'alice1234');
|
||||||
|
|
||||||
|
cy.login('alice', 'alice1234');
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// ããšãįĩäēį´åãĢããŧã¸éˇį§ģãããããĒããšããąãŧãš(äžãã°ãĸãĢãĻãŗãäŊæ)ã ã¨ãããļãCypressãŽãã°ã§ããŠãĻãļãŽå
厚ãæŦĄãŽããšããąãŧãšãĢåŧãįļãããĻããžã(äžãã°ãĸãĢãĻãŗããäŊæãįĩããŖãæŽĩéããããšããå§ãžã)ã
|
||||||
|
// waitãå
Ĩãããã¨ã§ããã鞿ĸã§ãã
|
||||||
|
cy.wait(1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('widget edit toggle is visible', () => {
|
||||||
|
cy.get('.mk-widget-edit').should('be.visible');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('widget select should be visible in edit mode', () => {
|
||||||
|
cy.get('.mk-widget-edit').click();
|
||||||
|
cy.get('.mk-widget-select').should('be.visible');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('first widget should be removed', () => {
|
||||||
|
cy.get('.mk-widget-edit').click();
|
||||||
|
cy.get('.customize-container:first-child .remove._button').click();
|
||||||
|
cy.get('.customize-container').should('have.length', 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
function buildWidgetTest(widgetName) {
|
||||||
|
it(`${widgetName} widget should get added`, () => {
|
||||||
|
cy.get('.mk-widget-edit').click();
|
||||||
|
cy.get('.mk-widget-select select').select(widgetName, { force: true });
|
||||||
|
cy.get('.bg._modalBg.transparent').click({ multiple: true, force: true });
|
||||||
|
cy.get('.mk-widget-add').click({ force: true });
|
||||||
|
cy.get(`.mkw-${widgetName}`).should('exist');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
buildWidgetTest('memo');
|
||||||
|
buildWidgetTest('notifications');
|
||||||
|
buildWidgetTest('timeline');
|
||||||
|
buildWidgetTest('calendar');
|
||||||
|
buildWidgetTest('rss');
|
||||||
|
buildWidgetTest('trends');
|
||||||
|
buildWidgetTest('clock');
|
||||||
|
buildWidgetTest('activity');
|
||||||
|
buildWidgetTest('photos');
|
||||||
|
buildWidgetTest('digitalClock');
|
||||||
|
buildWidgetTest('federation');
|
||||||
|
buildWidgetTest('postForm');
|
||||||
|
buildWidgetTest('slideshow');
|
||||||
|
buildWidgetTest('serverMetric');
|
||||||
|
buildWidgetTest('onlineUsers');
|
||||||
|
buildWidgetTest('jobQueue');
|
||||||
|
buildWidgetTest('button');
|
||||||
|
buildWidgetTest('aiscript');
|
||||||
|
buildWidgetTest('aichan');
|
||||||
|
});
|
@@ -1,76 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* flaky
|
|
||||||
describe('After user signed in', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.resetState();
|
|
||||||
cy.viewport('macbook-16');
|
|
||||||
|
|
||||||
// ã¤ãŗãšãŋãŗãšåæãģãããĸãã
|
|
||||||
cy.registerUser('admin', 'pass', true);
|
|
||||||
|
|
||||||
// ãĻãŧãļãŧäŊæ
|
|
||||||
cy.registerUser('alice', 'alice1234');
|
|
||||||
|
|
||||||
cy.login('alice', 'alice1234');
|
|
||||||
|
|
||||||
// ãĸãĢãĻãŗãåæč¨åŽãĻãŖãļãŧã
|
|
||||||
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]').click();
|
|
||||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
// ããšãįĩäēį´åãĢããŧã¸éˇį§ģãããããĒããšããąãŧãš(äžãã°ãĸãĢãĻãŗãäŊæ)ã ã¨ãããļãCypressãŽãã°ã§ããŠãĻãļãŽå
厚ãæŦĄãŽããšããąãŧãšãĢåŧãįļãããĻããžã(äžãã°ãĸãĢãĻãŗããäŊæãįĩããŖãæŽĩéããããšããå§ãžã)ã
|
|
||||||
// waitãå
Ĩãããã¨ã§ããã鞿ĸã§ãã
|
|
||||||
cy.wait(1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('widget edit toggle is visible', () => {
|
|
||||||
cy.get('[data-cy-widget-edit]').should('be.visible');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('widget select should be visible in edit mode', () => {
|
|
||||||
cy.get('[data-cy-widget-edit]').click();
|
|
||||||
cy.get('[data-cy-widget-select]').should('be.visible');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('first widget should be removed', () => {
|
|
||||||
cy.get('[data-cy-widget-edit]').click();
|
|
||||||
cy.get('[data-cy-customize-container]:first-child [data-cy-customize-container-remove]._button').click();
|
|
||||||
cy.get('[data-cy-customize-container]').should('have.length', 2);
|
|
||||||
});
|
|
||||||
|
|
||||||
function buildWidgetTest(widgetName) {
|
|
||||||
it(`${widgetName} widget should get added`, () => {
|
|
||||||
cy.get('[data-cy-widget-edit]').click();
|
|
||||||
cy.get('[data-cy-widget-select] select').select(widgetName, { force: true });
|
|
||||||
cy.get('[data-cy-bg]._modalBg[data-cy-transparent]').click({ multiple: true, force: true });
|
|
||||||
cy.get('[data-cy-widget-add]').click({ force: true });
|
|
||||||
cy.get(`[data-cy-mkw-${widgetName}]`).should('exist');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
buildWidgetTest('memo');
|
|
||||||
buildWidgetTest('notifications');
|
|
||||||
buildWidgetTest('timeline');
|
|
||||||
buildWidgetTest('calendar');
|
|
||||||
buildWidgetTest('rss');
|
|
||||||
buildWidgetTest('trends');
|
|
||||||
buildWidgetTest('clock');
|
|
||||||
buildWidgetTest('activity');
|
|
||||||
buildWidgetTest('photos');
|
|
||||||
buildWidgetTest('digitalClock');
|
|
||||||
buildWidgetTest('federation');
|
|
||||||
buildWidgetTest('postForm');
|
|
||||||
buildWidgetTest('slideshow');
|
|
||||||
buildWidgetTest('serverMetric');
|
|
||||||
buildWidgetTest('onlineUsers');
|
|
||||||
buildWidgetTest('jobQueue');
|
|
||||||
buildWidgetTest('button');
|
|
||||||
buildWidgetTest('aiscript');
|
|
||||||
buildWidgetTest('aichan');
|
|
||||||
});
|
|
||||||
*/
|
|
55
cypress/support/commands.js
Normal file
55
cypress/support/commands.js
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
// ***********************************************
|
||||||
|
// This example commands.js shows you how to
|
||||||
|
// create various custom commands and overwrite
|
||||||
|
// existing commands.
|
||||||
|
//
|
||||||
|
// For more comprehensive examples of custom
|
||||||
|
// commands please read more here:
|
||||||
|
// https://on.cypress.io/custom-commands
|
||||||
|
// ***********************************************
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a parent command --
|
||||||
|
// Cypress.Commands.add('login', (email, password) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a child command --
|
||||||
|
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a dual command --
|
||||||
|
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This will overwrite an existing command --
|
||||||
|
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
||||||
|
|
||||||
|
Cypress.Commands.add('resetState', () => {
|
||||||
|
cy.window(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);
|
||||||
|
});
|
||||||
|
|
||||||
|
Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => {
|
||||||
|
const route = isAdmin ? '/api/admin/accounts/create' : '/api/signup';
|
||||||
|
|
||||||
|
cy.request('POST', route, {
|
||||||
|
username: username,
|
||||||
|
password: password,
|
||||||
|
}).its('body').as(username);
|
||||||
|
});
|
||||||
|
|
||||||
|
Cypress.Commands.add('login', (username, password) => {
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
cy.intercept('POST', '/api/signin').as('signin');
|
||||||
|
|
||||||
|
cy.get('[data-cy-signin]').click();
|
||||||
|
cy.get('[data-cy-signin-username] input').type(username);
|
||||||
|
cy.get('[data-cy-signin-password] input').type(`${password}{enter}`);
|
||||||
|
|
||||||
|
cy.wait('@signin').as('signedIn');
|
||||||
|
});
|
@@ -1,67 +0,0 @@
|
|||||||
// ***********************************************
|
|
||||||
// This example commands.js shows you how to
|
|
||||||
// create various custom commands and overwrite
|
|
||||||
// existing commands.
|
|
||||||
//
|
|
||||||
// For more comprehensive examples of custom
|
|
||||||
// commands please read more here:
|
|
||||||
// https://on.cypress.io/custom-commands
|
|
||||||
// ***********************************************
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// -- This is a parent command --
|
|
||||||
// Cypress.Commands.add('login', (email, password) => { ... })
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// -- This is a child command --
|
|
||||||
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// -- This is a dual command --
|
|
||||||
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// -- This will overwrite an existing command --
|
|
||||||
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
|
||||||
|
|
||||||
Cypress.Commands.add('visitHome', () => {
|
|
||||||
cy.visit('/');
|
|
||||||
cy.get('button', { timeout: 30000 }).should('be.visible');
|
|
||||||
})
|
|
||||||
|
|
||||||
Cypress.Commands.add('resetState', () => {
|
|
||||||
// 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);
|
|
||||||
});
|
|
||||||
|
|
||||||
Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => {
|
|
||||||
const route = isAdmin ? '/api/admin/accounts/create' : '/api/signup';
|
|
||||||
|
|
||||||
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-flow').as('signin');
|
|
||||||
|
|
||||||
cy.get('[data-cy-signin]').click();
|
|
||||||
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');
|
|
||||||
});
|
|
32
cypress/support/e2e.js
Normal file
32
cypress/support/e2e.js
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// ***********************************************************
|
||||||
|
// This example support/index.js is processed and
|
||||||
|
// loaded automatically before your test files.
|
||||||
|
//
|
||||||
|
// This is a great place to put global configuration and
|
||||||
|
// behavior that modifies Cypress.
|
||||||
|
//
|
||||||
|
// You can change the location of this file or turn off
|
||||||
|
// automatically serving support files with the
|
||||||
|
// 'supportFile' configuration option.
|
||||||
|
//
|
||||||
|
// You can read more here:
|
||||||
|
// https://on.cypress.io/configuration
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// Import commands.js using ES2015 syntax:
|
||||||
|
import './commands'
|
||||||
|
|
||||||
|
// Alternatively you can use CommonJS syntax:
|
||||||
|
// require('./commands')
|
||||||
|
|
||||||
|
Cypress.on('uncaught:exception', (err, runnable) => {
|
||||||
|
if ([
|
||||||
|
// Chrome
|
||||||
|
'ResizeObserver loop limit exceeded',
|
||||||
|
|
||||||
|
// Firefox
|
||||||
|
'ResizeObserver loop completed with undelivered notifications',
|
||||||
|
].some(msg => err.message.includes(msg))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
@@ -1,34 +0,0 @@
|
|||||||
// ***********************************************************
|
|
||||||
// This example support/index.js is processed and
|
|
||||||
// loaded automatically before your test files.
|
|
||||||
//
|
|
||||||
// This is a great place to put global configuration and
|
|
||||||
// behavior that modifies Cypress.
|
|
||||||
//
|
|
||||||
// You can change the location of this file or turn off
|
|
||||||
// automatically serving support files with the
|
|
||||||
// 'supportFile' configuration option.
|
|
||||||
//
|
|
||||||
// You can read more here:
|
|
||||||
// https://on.cypress.io/configuration
|
|
||||||
// ***********************************************************
|
|
||||||
|
|
||||||
// Import commands.js using ES2015 syntax:
|
|
||||||
import './commands'
|
|
||||||
|
|
||||||
// Alternatively you can use CommonJS syntax:
|
|
||||||
// require('./commands')
|
|
||||||
|
|
||||||
Cypress.on('uncaught:exception', (err, runnable) => {
|
|
||||||
if ([
|
|
||||||
'The source image cannot be decoded',
|
|
||||||
|
|
||||||
// Chrome
|
|
||||||
'ResizeObserver loop limit exceeded',
|
|
||||||
|
|
||||||
// Firefox
|
|
||||||
'ResizeObserver loop completed with undelivered notifications',
|
|
||||||
].some(msg => err.message.includes(msg))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
@@ -1,19 +0,0 @@
|
|||||||
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 {}
|
|
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"lib": ["dom", "es5"],
|
|
||||||
"target": "es5",
|
|
||||||
"types": ["cypress", "node"]
|
|
||||||
},
|
|
||||||
"include": ["./**/*.ts"]
|
|
||||||
}
|
|
52
docker-compose.yml
Normal file
52
docker-compose.yml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
build: .
|
||||||
|
restart: always
|
||||||
|
links:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
# - es
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
- external_network
|
||||||
|
volumes:
|
||||||
|
- ./files:/misskey/files
|
||||||
|
- ./.config:/misskey/.config:ro
|
||||||
|
|
||||||
|
redis:
|
||||||
|
restart: always
|
||||||
|
image: redis:4.0-alpine
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
volumes:
|
||||||
|
- ./redis:/data
|
||||||
|
|
||||||
|
db:
|
||||||
|
restart: always
|
||||||
|
image: postgres:12.2-alpine
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
env_file:
|
||||||
|
- .config/docker.env
|
||||||
|
volumes:
|
||||||
|
- ./db:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
# es:
|
||||||
|
# restart: always
|
||||||
|
# image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.2
|
||||||
|
# environment:
|
||||||
|
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
||||||
|
# - "TAKE_FILE_OWNERSHIP=111"
|
||||||
|
# networks:
|
||||||
|
# - internal_network
|
||||||
|
# volumes:
|
||||||
|
# - ./elasticsearch:/usr/share/elasticsearch/data
|
||||||
|
|
||||||
|
networks:
|
||||||
|
internal_network:
|
||||||
|
internal: true
|
||||||
|
external_network:
|
25
docs/DONATORS.md
Normal file
25
docs/DONATORS.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
DONATORS
|
||||||
|
========
|
||||||
|
The list of people who have sent donation for Misskey.
|
||||||
|
|
||||||
|
(In random order, honorific titles are omitted.)
|
||||||
|
|
||||||
|
* ããĩã
|
||||||
|
* äŋēæ§
|
||||||
|
* ãĒããã
|
||||||
|
* ãšãĢãĄ https://surume.tk/
|
||||||
|
* č
|
||||||
|
* éŗčš https://otofune.me/
|
||||||
|
* aqz https://misskey.xyz/aqz
|
||||||
|
* kotodu "čįĄåĩäŊä¸"
|
||||||
|
* Maya Minatsuki
|
||||||
|
* Knzk https://knzk.me/@Knzk
|
||||||
|
* ããããããŗ https://knzk.me/@y
|
||||||
|
* NCLS https://knzk.me/@imncls]
|
||||||
|
* ãããž @skoji@sandbox.skoji.jp
|
||||||
|
|
||||||
|
:heart: Thanks for donating, guys!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
If your name is missing, please contact us!
|
Submodule fluent-emojis deleted from cae981eb4c
65
gulpfile.js
Normal file
65
gulpfile.js
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* Gulp tasks
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const gulp = require('gulp');
|
||||||
|
const replace = require('gulp-replace');
|
||||||
|
const terser = require('gulp-terser');
|
||||||
|
const cssnano = require('gulp-cssnano');
|
||||||
|
|
||||||
|
const locales = require('./locales');
|
||||||
|
const meta = require('./package.json');
|
||||||
|
|
||||||
|
gulp.task('copy:backend:views', () =>
|
||||||
|
gulp.src('./packages/backend/src/server/web/views/**/*').pipe(gulp.dest('./packages/backend/built/server/web/views'))
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task('copy:client:fonts', () =>
|
||||||
|
gulp.src('./packages/client/node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/_client_dist_/fonts/'))
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task('copy:client:fontawesome', () =>
|
||||||
|
gulp.src('./packages/client/node_modules/@fortawesome/fontawesome-free/**/*').pipe(gulp.dest('./built/_client_dist_/fontawesome/'))
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task('copy:client:locales', cb => {
|
||||||
|
fs.mkdirSync('./built/_client_dist_/locales', { recursive: true });
|
||||||
|
|
||||||
|
const v = { '_version_': meta.version };
|
||||||
|
|
||||||
|
for (const [lang, locale] of Object.entries(locales)) {
|
||||||
|
fs.writeFileSync(`./built/_client_dist_/locales/${lang}.${meta.version}.json`, JSON.stringify({ ...locale, ...v }), 'utf-8');
|
||||||
|
}
|
||||||
|
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('build:backend:script', () => {
|
||||||
|
return gulp.src(['./packages/backend/src/server/web/boot.js', './packages/backend/src/server/web/bios.js', './packages/backend/src/server/web/cli.js'])
|
||||||
|
.pipe(replace('LANGS', JSON.stringify(Object.keys(locales))))
|
||||||
|
.pipe(terser({
|
||||||
|
toplevel: true
|
||||||
|
}))
|
||||||
|
.pipe(gulp.dest('./packages/backend/built/server/web/'));
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('build:backend:style', () => {
|
||||||
|
return gulp.src(['./packages/backend/src/server/web/style.css', './packages/backend/src/server/web/bios.css', './packages/backend/src/server/web/cli.css'])
|
||||||
|
.pipe(cssnano({
|
||||||
|
zindex: false
|
||||||
|
}))
|
||||||
|
.pipe(gulp.dest('./packages/backend/built/server/web/'));
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('build', gulp.parallel(
|
||||||
|
'copy:client:locales', 'copy:backend:views', 'build:backend:script', 'build:backend:style', 'copy:client:fonts', 'copy:client:fontawesome'
|
||||||
|
));
|
||||||
|
|
||||||
|
gulp.task('default', gulp.task('build'));
|
||||||
|
|
||||||
|
gulp.task('watch', () => {
|
||||||
|
gulp.watch([
|
||||||
|
'./packages/*/src/**/*',
|
||||||
|
], { ignoreInitial: false }, gulp.task('build'));
|
||||||
|
});
|
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# 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 -Sfso/dev/null "http://localhost:${PORT}/healthz"
|
|
@@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 { 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) {
|
|
||||||
return {
|
|
||||||
components: {
|
|
||||||
MkAbuseReport,
|
|
||||||
},
|
|
||||||
setup() {
|
|
||||||
return {
|
|
||||||
args,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
props() {
|
|
||||||
return {
|
|
||||||
...this.args,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
events() {
|
|
||||||
return {
|
|
||||||
resolved: action('resolved'),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
},
|
|
||||||
template: '<MkAbuseReport v-bind="props" v-on="events" />',
|
|
||||||
};
|
|
||||||
},
|
|
||||||
args: {
|
|
||||||
report: abuseUserReport(),
|
|
||||||
},
|
|
||||||
parameters: {
|
|
||||||
layout: 'fullscreen',
|
|
||||||
msw: {
|
|
||||||
handlers: [
|
|
||||||
...commonHandlers,
|
|
||||||
http.post('/api/admin/resolve-abuse-user-report', async ({ request }) => {
|
|
||||||
action('POST /api/admin/resolve-abuse-user-report')(await request.json());
|
|
||||||
return HttpResponse.json({});
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
} satisfies StoryObj<typeof MkAbuseReport>;
|
|
@@ -1,41 +0,0 @@
|
|||||||
<!--
|
|
||||||
SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
-->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div :class="[$style.root]">
|
|
||||||
<div :inert="disabled" :class="[{ [$style.disabled]: disabled }]">
|
|
||||||
<slot></slot>
|
|
||||||
</div>
|
|
||||||
<div v-if="disabled" :class="[$style.cover]"></div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts" setup>
|
|
||||||
defineProps<{
|
|
||||||
disabled?: boolean;
|
|
||||||
}>();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" module>
|
|
||||||
.root {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.disabled {
|
|
||||||
opacity: 0.7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cover {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
cursor: not-allowed;
|
|
||||||
--color: color(from var(--MI_THEME-error) srgb r g b / 0.25);
|
|
||||||
background-size: auto auto;
|
|
||||||
background-image: repeating-linear-gradient(135deg, transparent, transparent 10px, var(--color) 4px, var(--color) 14px);
|
|
||||||
}
|
|
||||||
</style>
|
|
@@ -1 +0,0 @@
|
|||||||
äŊŋãããĒããĒãŖãããŠæļããŽã¯åŋäŊãĒã(å°æĨäŊŋãããããããĒã)ãŗãŧããå
ĨããĻããã¨ã
|
|
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,6 @@
|
|||||||
_lang_: "āĻŦāĻžāĻāϞāĻž"
|
_lang_: "āĻŦāĻžāĻāϞāĻž"
|
||||||
headlineMisskey: "āύā§āĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻāϝā§āĻā§āϤ āύā§āĻāĻā§āĻžāϰā§āĻ"
|
headlineMisskey: "āύā§āĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻāϝā§āĻā§āϤ āύā§āĻāĻā§āĻžāϰā§āĻ"
|
||||||
introMisskey: "āϏā§āĻŦāĻžāĻāϤāĻŽ! āĻŽāĻŋāϏāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻĒā§āύ āϏā§āϰā§āϏ, āĻĄāĻŋāϏā§āύā§āĻā§āϰāĻžāϞāĻžāĻāĻāĻĄ āĻŽāĻžāĻāĻā§āϰā§āĻŦā§āϞāĻāĻŋāĻ āĻĒāϰāĻŋāώā§āĻŦāĻžāĨ¤ \n\"āύā§āĻ\" āϤā§āϰāĻŋāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϝāĻž āĻāĻāĻā§ āϤāĻž āϏāĻŦāĻžāϰ āϏāĻžāĻĨā§ āĻļā§ā§āĻžāϰ āĻāϰā§āύ đĄ\n\"āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύ\" āĻā§āϞāĻŋāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϝā§āĻā§āύ⧠āύā§āĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĒāύāĻžāϰ āĻ
āύā§āĻā§āϤāĻŋ āĻŦā§āϝāĻžāĻā§āϤ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ đ\nāĻāĻāĻāĻŋ āύāϤā§āύ āĻĻā§āύāĻŋā§āĻž āĻā§āϰ⧠āĻĻā§āĻā§āύ đ\n"
|
introMisskey: "āϏā§āĻŦāĻžāĻāϤāĻŽ! āĻŽāĻŋāϏāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻĒā§āύ āϏā§āϰā§āϏ, āĻĄāĻŋāϏā§āύā§āĻā§āϰāĻžāϞāĻžāĻāĻāĻĄ āĻŽāĻžāĻāĻā§āϰā§āĻŦā§āϞāĻāĻŋāĻ āĻĒāϰāĻŋāώā§āĻŦāĻžāĨ¤ \n\"āύā§āĻ\" āϤā§āϰāĻŋāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϝāĻž āĻāĻāĻā§ āϤāĻž āϏāĻŦāĻžāϰ āϏāĻžāĻĨā§ āĻļā§ā§āĻžāϰ āĻāϰā§āύ đĄ\n\"āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύ\" āĻā§āϞāĻŋāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϝā§āĻā§āύ⧠āύā§āĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĒāύāĻžāϰ āĻ
āύā§āĻā§āϤāĻŋ āĻŦā§āϝāĻžāĻā§āϤ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ đ\nāĻāĻāĻāĻŋ āύāϤā§āύ āĻĻā§āύāĻŋā§āĻž āĻā§āϰ⧠āĻĻā§āĻā§āύ đ\n"
|
||||||
poweredByMisskeyDescription: "{name} āĻšāϞ āĻāĻĒā§āύ āϏā§āϰā§āϏ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ <b>Misskey</b>-āĻāϰ āϏāĻžāϰā§āĻāĻžāϰāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ⧎"
|
|
||||||
monthAndDay: "{day}/{month}"
|
monthAndDay: "{day}/{month}"
|
||||||
search: "āĻā§āĻāĻā§āύ"
|
search: "āĻā§āĻāĻā§āύ"
|
||||||
notifications: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ"
|
notifications: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ"
|
||||||
@@ -13,14 +12,12 @@ fetchingAsApObject: "āĻĢā§āĻĄāĻŋāĻāĻžāϰā§āϏ āĻĨā§āĻā§ āĻāĻŦāϰ āĻāύ
|
|||||||
ok: "āĻ āĻŋāĻ"
|
ok: "āĻ āĻŋāĻ"
|
||||||
gotIt: "āĻŦā§āĻā§āĻāĻŋ"
|
gotIt: "āĻŦā§āĻā§āĻāĻŋ"
|
||||||
cancel: "āĻŦāĻžāϤāĻŋāϞ"
|
cancel: "āĻŦāĻžāϤāĻŋāϞ"
|
||||||
noThankYou: "āύāĻž, āϧāύā§āϝāĻŦāĻžāĻĻ"
|
|
||||||
enterUsername: "āĻāĻāĻāĻžāϰāύā§āĻŽ āϞāĻŋāĻā§āύ"
|
enterUsername: "āĻāĻāĻāĻžāϰāύā§āĻŽ āϞāĻŋāĻā§āύ"
|
||||||
renotedBy: "{user} āϰāĻŋāύā§āĻ āĻāϰā§āĻā§āύ"
|
renotedBy: "{user} āϰāĻŋāύā§āĻ āĻāϰā§āĻā§āύ"
|
||||||
noNotes: "āĻā§āύ āύā§āĻ āύā§āĻ"
|
noNotes: "āĻā§āύ āύā§āĻ āύā§āĻ"
|
||||||
noNotifications: "āĻā§āύ⧠āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ āύā§āĻ"
|
noNotifications: "āĻā§āύ⧠āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ āύā§āĻ"
|
||||||
instance: "āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ"
|
instance: "āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ"
|
||||||
settings: "āϏā§āĻāĻŋāĻāϏ"
|
settings: "āϏā§āĻāĻŋāĻāϏ"
|
||||||
notificationSettings: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋāϰ āϏā§āĻāĻŋāĻāϏ"
|
|
||||||
basicSettings: "āϏāĻžāϧāĻžāϰāĻŖ āϏā§āĻāĻŋāĻāϏ"
|
basicSettings: "āϏāĻžāϧāĻžāϰāĻŖ āϏā§āĻāĻŋāĻāϏ"
|
||||||
otherSettings: "āĻ
āύā§āϝāĻžāύā§āϝ āϏā§āĻāĻŋāĻāϏ"
|
otherSettings: "āĻ
āύā§āϝāĻžāύā§āϝ āϏā§āĻāĻŋāĻāϏ"
|
||||||
openInWindow: "āύāϤā§āύ āĻāĻāύā§āĻĄā§āϤ⧠āĻā§āϞāĻž"
|
openInWindow: "āύāϤā§āύ āĻāĻāύā§āĻĄā§āϤ⧠āĻā§āϞāĻž"
|
||||||
@@ -45,20 +42,12 @@ pin: "āĻĒāĻŋāύ āĻāϰāĻž"
|
|||||||
unpin: "āĻĒāĻŋāύ āϏāϰāĻžāύ"
|
unpin: "āĻĒāĻŋāύ āϏāϰāĻžāύ"
|
||||||
copyContent: "āĻŦāĻŋāώā§āĻŦāϏā§āϤ⧠āĻāĻĒāĻŋ āĻāϰā§āύ"
|
copyContent: "āĻŦāĻŋāώā§āĻŦāϏā§āϤ⧠āĻāĻĒāĻŋ āĻāϰā§āύ"
|
||||||
copyLink: "āϞāĻŋāĻā§āĻ āĻāĻĒāĻŋ āĻāϰā§āύ"
|
copyLink: "āϞāĻŋāĻā§āĻ āĻāĻĒāĻŋ āĻāϰā§āύ"
|
||||||
copyLinkRenote: "āϰāĻŋāύā§āĻ āϞāĻŋāĻā§āĻ āĻāĻĒāĻŋ āĻāϰā§āύ"
|
|
||||||
delete: "āĻŽā§āĻā§āύ"
|
delete: "āĻŽā§āĻā§āύ"
|
||||||
deleteAndEdit: "āĻŽā§āĻā§āύ āĻāĻŦāĻ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰā§āύ"
|
deleteAndEdit: "āĻŽā§āĻā§āύ āĻāĻŦāĻ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰā§āύ"
|
||||||
deleteAndEditConfirm: "āĻāĻĒāύāĻŋ āĻāĻŋ āĻāĻ āύā§āĻāĻāĻŋ āĻŽā§āĻā§ āĻāĻāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰāĻžāϰ āĻŦāĻŋāώāϝāĻŧā§ āύāĻŋāĻļā§āĻāĻŋāϤ? āĻāĻĒāύāĻŋ āĻāĻāĻŋāϰ āϏāĻŽāϏā§āϤ āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύ, āϰāĻŋāύā§āĻ āĻāĻŦāĻ āĻāĻŦāĻžāĻŦ āĻšāĻžāϰāĻžāĻŦā§āύāĨ¤"
|
deleteAndEditConfirm: "āĻāĻĒāύāĻŋ āĻāĻŋ āĻāĻ āύā§āĻāĻāĻŋ āĻŽā§āĻā§ āĻāĻāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰāĻžāϰ āĻŦāĻŋāώāϝāĻŧā§ āύāĻŋāĻļā§āĻāĻŋāϤ? āĻāĻĒāύāĻŋ āĻāĻāĻŋāϰ āϏāĻŽāϏā§āϤ āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύ, āϰāĻŋāύā§āĻ āĻāĻŦāĻ āĻāĻŦāĻžāĻŦ āĻšāĻžāϰāĻžāĻŦā§āύāĨ¤"
|
||||||
addToList: "āϞāĻŋāϏā§āĻ āĻ āϝā§āĻ āĻāϰā§āύ"
|
addToList: "āϞāĻŋāϏā§āĻ āĻ āϝā§āĻ āĻāϰā§āύ"
|
||||||
addToAntenna: "āĻ
ā§āϝāĻžāύā§āĻā§āύāĻž āĻ āϝā§āĻ āĻāϰā§āύ"
|
|
||||||
sendMessage: "āĻāĻāĻāĻŋ āĻŦāĻžāϰā§āϤāĻž āĻĒāĻžāĻ āĻžāύ"
|
sendMessage: "āĻāĻāĻāĻŋ āĻŦāĻžāϰā§āϤāĻž āĻĒāĻžāĻ āĻžāύ"
|
||||||
copyRSS: "RSS āĻāĻĒāĻŋ āĻāϰā§āύ"
|
|
||||||
copyUsername: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύāĻžāĻŽ āĻāĻĒāĻŋ āĻāϰā§āύ"
|
copyUsername: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύāĻžāĻŽ āĻāĻĒāĻŋ āĻāϰā§āύ"
|
||||||
copyUserId: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ ID āĻāĻĒāĻŋ āĻāϰā§āύ"
|
|
||||||
copyNoteId: "āύā§āĻā§āϰ ID āĻāĻĒāĻŋ āĻāϰā§āύ"
|
|
||||||
copyFileId: "āĻĢāĻžāĻāϞ ID āĻāĻĒāĻŋ āĻāϰā§āύ"
|
|
||||||
copyFolderId: "āĻĢā§āϞā§āĻĄāĻžāϰ ID āĻāĻĒāĻŋ āĻāϰā§āύ"
|
|
||||||
copyProfileUrl: "āĻĒā§āϰā§āĻĢāĻžāĻāϞ URL āĻāĻĒāĻŋ āĻāϰā§āύ"
|
|
||||||
searchUser: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻā§āĻāĻā§āύ..."
|
searchUser: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻā§āĻāĻā§āύ..."
|
||||||
reply: "āĻāĻŦāĻžāĻŦ"
|
reply: "āĻāĻŦāĻžāĻŦ"
|
||||||
loadMore: "āĻāϰāĻ āĻĻā§āĻā§āύ"
|
loadMore: "āĻāϰāĻ āĻĻā§āĻā§āύ"
|
||||||
@@ -111,8 +100,6 @@ renoted: "āϰāĻŋāύā§āĻ āĻāϰāĻž āĻšā§ā§āĻā§"
|
|||||||
cantRenote: "āĻāĻ āύā§āĻāĻāĻŋ āϰāĻŋāύā§āĻ āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻžāĨ¤"
|
cantRenote: "āĻāĻ āύā§āĻāĻāĻŋ āϰāĻŋāύā§āĻ āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻžāĨ¤"
|
||||||
cantReRenote: "āϰāĻŋāύā§āĻāĻā§ āϰāĻŋāύā§āĻ āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻžāĨ¤"
|
cantReRenote: "āϰāĻŋāύā§āĻāĻā§ āϰāĻŋāύā§āĻ āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻžāĨ¤"
|
||||||
quote: "āĻāĻĻā§āϧā§āϤāĻŋ"
|
quote: "āĻāĻĻā§āϧā§āϤāĻŋ"
|
||||||
inChannelRenote: "āĻā§āϝāĻžāύā§āϞ⧠āϰāĻŋāύā§āĻ"
|
|
||||||
inChannelQuote: "āĻā§āϝāĻžāύā§āϞ⧠āĻāĻĻā§āϧā§āϤāĻŋ"
|
|
||||||
pinnedNote: "āĻĒāĻŋāύ āĻāϰāĻž āύā§āĻ"
|
pinnedNote: "āĻĒāĻŋāύ āĻāϰāĻž āύā§āĻ"
|
||||||
pinned: "āĻĒāĻŋāύ āĻāϰāĻž"
|
pinned: "āĻĒāĻŋāύ āĻāϰāĻž"
|
||||||
you: "āĻāĻĒāύāĻŋ"
|
you: "āĻāĻĒāύāĻŋ"
|
||||||
@@ -120,11 +107,7 @@ clickToShow: "āĻĻā§āĻāĻžāϰ āĻāύā§āϝ āĻā§āϞāĻŋāĻ āĻāϰā§āύ"
|
|||||||
sensitive: "āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻŦāĻŋāώā§āĻŦāϏā§āϤā§"
|
sensitive: "āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻŦāĻŋāώā§āĻŦāϏā§āϤā§"
|
||||||
add: "āϝā§āĻā§āϤ āĻāϰā§āύ"
|
add: "āϝā§āĻā§āϤ āĻāϰā§āύ"
|
||||||
reaction: "āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž"
|
reaction: "āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž"
|
||||||
reactions: "āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž"
|
reactionSetting: "āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύ āĻĒāĻŋāĻāĻžāϰ⧠āϝā§āϏāĻāϞ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋā§āĻž āĻĻā§āĻāĻžāύ⧠āĻšāĻŦā§"
|
||||||
emojiPicker: "āĻāĻŽā§āĻāĻŋ āĻĒāĻŋāĻāĻžāϰ"
|
|
||||||
pinnedEmojisForReactionSettingDescription: "āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύ āĻĻā§ā§āĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻŋ āĻāĻŽā§āĻāĻŋāĻāĻŋāĻā§ āĻĒāĻŋāύ āĻāϰāĻž āĻāĻŦāĻ āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻšāĻāϝāĻŧāĻžāϰ āĻāύā§āϝ āϏā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤"
|
|
||||||
pinnedEmojisSettingDescription: "āĻāĻŽā§āĻāĻŋ āĻāύāĻĒā§āĻ āĻĻā§ā§āĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻŋ āĻāĻŽā§āĻāĻŋāĻāĻŋāĻā§ āĻĒāĻŋāύ āĻāϰāĻž āĻāĻŦāĻ āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻšāĻāϝāĻŧāĻžāϰ āĻāύā§āϝ āϏā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤"
|
|
||||||
emojiPickerDisplay: "āĻĒāĻŋāĻāĻžāϰ āĻĄāĻŋāϏāĻĒā§āϞā§"
|
|
||||||
reactionSettingDescription2: "āĻĒā§āύāϰāĻžāϝāĻŧ āϏāĻžāĻāĻžāϤ⧠āĻā§āύ⧠āĻāύā§āύ, āĻŽā§āĻāϤ⧠āĻā§āϞāĻŋāĻ āĻāϰā§āύ, āϝā§āĻ āĻāϰāϤ⧠+ āĻāĻŋāĻĒā§āύāĨ¤"
|
reactionSettingDescription2: "āĻĒā§āύāϰāĻžāϝāĻŧ āϏāĻžāĻāĻžāϤ⧠āĻā§āύ⧠āĻāύā§āύ, āĻŽā§āĻāϤ⧠āĻā§āϞāĻŋāĻ āĻāϰā§āύ, āϝā§āĻ āĻāϰāϤ⧠+ āĻāĻŋāĻĒā§āύāĨ¤"
|
||||||
rememberNoteVisibility: "āύā§āĻā§āϰ āĻĻā§āĻļā§āϝāĻŽāĻžāύā§āϝāϤāĻžāϰ āϏā§āĻāĻŋāĻāϏ āĻŽāύ⧠āϰāĻžāĻā§āύ"
|
rememberNoteVisibility: "āύā§āĻā§āϰ āĻĻā§āĻļā§āϝāĻŽāĻžāύā§āϝāϤāĻžāϰ āϏā§āĻāĻŋāĻāϏ āĻŽāύ⧠āϰāĻžāĻā§āύ"
|
||||||
attachCancel: "āĻ
ā§āϝāĻžāĻāĻžāĻāĻŽā§āύā§āĻ āϏāϰāĻžāύ "
|
attachCancel: "āĻ
ā§āϝāĻžāĻāĻžāĻāĻŽā§āύā§āĻ āϏāϰāĻžāύ "
|
||||||
@@ -181,6 +164,7 @@ annotation: "āĻŽāύā§āϤāĻŦā§āϝ"
|
|||||||
federation: "āĻĢā§āĻĄāĻŋāĻāĻžāϰā§āϏ"
|
federation: "āĻĢā§āĻĄāĻŋāĻāĻžāϰā§āϏ"
|
||||||
instances: "āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ"
|
instances: "āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ"
|
||||||
registeredAt: "āϝā§āĻ āĻĻāĻŋā§ā§āĻā§āύ"
|
registeredAt: "āϝā§āĻ āĻĻāĻŋā§ā§āĻā§āύ"
|
||||||
|
latestRequestSentAt: "āĻļā§āώ āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻĒāĻžāĻ āĻžāύ⧠āĻšā§ā§āĻā§"
|
||||||
latestRequestReceivedAt: "āĻļā§āώ āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻā§āĻšā§āϤ āĻšā§ā§āĻā§"
|
latestRequestReceivedAt: "āĻļā§āώ āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻā§āĻšā§āϤ āĻšā§ā§āĻā§"
|
||||||
latestStatus: "āϏāϰā§āĻŦāĻļā§āώ āĻ
āĻŦāϏā§āĻĨāĻž"
|
latestStatus: "āϏāϰā§āĻŦāĻļā§āώ āĻ
āĻŦāϏā§āĻĨāĻž"
|
||||||
storageUsage: "āϏā§āĻā§āϰā§āĻā§āϰ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ"
|
storageUsage: "āϏā§āĻā§āϰā§āĻā§āϰ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ"
|
||||||
@@ -268,12 +252,12 @@ noMoreHistory: "āĻāϰ āĻā§āύ āĻāϤāĻŋāĻšāĻžāϏ āύā§āĻ"
|
|||||||
startMessaging: "āĻā§āϝāĻžāĻ āĻļā§āϰ⧠āĻāϰā§āύ"
|
startMessaging: "āĻā§āϝāĻžāĻ āĻļā§āϰ⧠āĻāϰā§āύ"
|
||||||
nUsersRead: "{n} āĻāύ āĻĒā§ā§āĻā§āύ"
|
nUsersRead: "{n} āĻāύ āĻĒā§ā§āĻā§āύ"
|
||||||
agreeTo: "{0} āĻāϰ āĻĒā§āϰāϤāĻŋ āĻāĻŽāĻŋ āϏāĻŽā§āĻŽāϤ"
|
agreeTo: "{0} āĻāϰ āĻĒā§āϰāϤāĻŋ āĻāĻŽāĻŋ āϏāĻŽā§āĻŽāϤ"
|
||||||
|
tos: "āĻĒāϰāĻŋāώā§āĻŦāĻžāϰ āĻļāϰā§āϤāĻžāĻĻāĻŋ"
|
||||||
start: "āĻļā§āϰ⧠āĻāϰā§āύ"
|
start: "āĻļā§āϰ⧠āĻāϰā§āύ"
|
||||||
home: "āĻŽā§āϞ āĻĒāĻžāϤāĻž"
|
home: "āĻŽā§āϞ āĻĒāĻžāϤāĻž"
|
||||||
remoteUserCaution: "āĻāĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϰāĻŋāĻŽā§āĻ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ, āύāĻŋāĻŽā§āύāĻā§āϤ āϤāĻĨā§āϝ āĻ
āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤"
|
remoteUserCaution: "āĻāĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϰāĻŋāĻŽā§āĻ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ, āύāĻŋāĻŽā§āύāĻā§āϤ āϤāĻĨā§āϝ āĻ
āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤"
|
||||||
activity: "āĻāĻžāϰā§āϝāĻāϞāĻžāĻĒ"
|
activity: "āĻāĻžāϰā§āϝāĻāϞāĻžāĻĒ"
|
||||||
images: "āĻāĻŦāĻŋ"
|
images: "āĻāĻŦāĻŋ"
|
||||||
image: "āĻāĻŦāĻŋ"
|
|
||||||
birthday: "āĻāύā§āĻŽāĻĻāĻŋāύ"
|
birthday: "āĻāύā§āĻŽāĻĻāĻŋāύ"
|
||||||
yearsOld: "{age} āĻŦāĻāϰ"
|
yearsOld: "{age} āĻŦāĻāϰ"
|
||||||
registeredDate: "āϝā§āĻāĻĻāĻžāύā§āϰ āϤāĻžāϰāĻŋāĻ"
|
registeredDate: "āϝā§āĻāĻĻāĻžāύā§āϰ āϤāĻžāϰāĻŋāĻ"
|
||||||
@@ -310,6 +294,7 @@ copyUrl: "URL āĻāĻĒāĻŋ āĻāϰā§āύ"
|
|||||||
rename: "āĻĒā§āύāĻāύāĻžāĻŽāĻāϰāĻŖ"
|
rename: "āĻĒā§āύāĻāύāĻžāĻŽāĻāϰāĻŖ"
|
||||||
avatar: "āĻĒā§āϰā§āĻĢāĻžāĻāϞ āĻāĻŦāĻŋ"
|
avatar: "āĻĒā§āϰā§āĻĢāĻžāĻāϞ āĻāĻŦāĻŋ"
|
||||||
banner: "āĻŦā§āϝāĻžāύāĻžāϰ"
|
banner: "āĻŦā§āϝāĻžāύāĻžāϰ"
|
||||||
|
nsfw: "āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻŦāĻŋāώā§āĻŦāϏā§āϤā§"
|
||||||
whenServerDisconnected: "āϏāĻžāϰā§āĻāĻžāϰā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύ āĻšāϝāĻŧā§ āĻā§āϞā§"
|
whenServerDisconnected: "āϏāĻžāϰā§āĻāĻžāϰā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύ āĻšāϝāĻŧā§ āĻā§āϞā§"
|
||||||
disconnectedFromServer: "āϏāĻžāϰā§āĻāĻžāϰ āĻĨā§āĻā§ āϏāĻāϝā§āĻ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύ āĻšāϝāĻŧā§āĻā§"
|
disconnectedFromServer: "āϏāĻžāϰā§āĻāĻžāϰ āĻĨā§āĻā§ āϏāĻāϝā§āĻ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύ āĻšāϝāĻŧā§āĻā§"
|
||||||
reload: "āĻāĻŦāĻžāϰ āϞā§āĻĄ āĻāϰā§āύ"
|
reload: "āĻāĻŦāĻžāϰ āϞā§āĻĄ āĻāϰā§āύ"
|
||||||
@@ -339,10 +324,12 @@ enableLocalTimeline: "āϏā§āĻĨāĻžāύā§ā§ āĻāĻžāĻāĻŽāϞāĻžāĻāύ āĻāĻžāϞ
|
|||||||
enableGlobalTimeline: "āĻā§āϞā§āĻŦāĻžāϞ āĻāĻžāĻāĻŽāϞāĻžāĻāύ āĻāĻžāϞ⧠āĻāϰā§āύ"
|
enableGlobalTimeline: "āĻā§āϞā§āĻŦāĻžāϞ āĻāĻžāĻāĻŽāϞāĻžāĻāύ āĻāĻžāϞ⧠āĻāϰā§āύ"
|
||||||
disablingTimelinesInfo: "āĻāĻĒāύāĻŋ āĻāĻ āĻāĻžāĻāĻŽāϞāĻžāĻāύāĻā§āϞāĻŋ āĻŦāύā§āϧ āĻāϰāϞā§āĻ āĻĒā§āϰāĻļāĻžāϏāĻ āĻāĻŦāĻ āĻŽāĻĄāĻžāϰā§āĻāϰāϰāĻž āĻāĻ āĻāĻžāĻāĻŽāϞāĻžāĻāύāĻā§āϞāĻŋ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§"
|
disablingTimelinesInfo: "āĻāĻĒāύāĻŋ āĻāĻ āĻāĻžāĻāĻŽāϞāĻžāĻāύāĻā§āϞāĻŋ āĻŦāύā§āϧ āĻāϰāϞā§āĻ āĻĒā§āϰāĻļāĻžāϏāĻ āĻāĻŦāĻ āĻŽāĻĄāĻžāϰā§āĻāϰāϰāĻž āĻāĻ āĻāĻžāĻāĻŽāϞāĻžāĻāύāĻā§āϞāĻŋ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§"
|
||||||
registration: "āύāĻŋāĻŦāύā§āϧāύ"
|
registration: "āύāĻŋāĻŦāύā§āϧāύ"
|
||||||
|
enableRegistration: "āύāϤā§āύ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āύāĻŋāĻŦāύā§āϧāύ āĻāĻžāϞ⧠āĻāϰā§āύ"
|
||||||
invite: "āĻāĻŽāύā§āϤā§āϰāĻŖ"
|
invite: "āĻāĻŽāύā§āϤā§āϰāĻŖ"
|
||||||
driveCapacityPerLocalAccount: "āĻĒā§āϰāϤā§āϝā§āĻ āϏā§āĻĨāĻžāύā§ā§ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻĄā§āϰāĻžāĻāĻā§āϰ āĻāĻžā§āĻāĻž"
|
driveCapacityPerLocalAccount: "āĻĒā§āϰāϤā§āϝā§āĻ āϏā§āĻĨāĻžāύā§ā§ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻĄā§āϰāĻžāĻāĻā§āϰ āĻāĻžā§āĻāĻž"
|
||||||
driveCapacityPerRemoteAccount: "āĻĒā§āϰāϤā§āϝā§āĻ āϰāĻŋāĻŽā§āĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻĄā§āϰāĻžāĻāĻā§āϰ āĻāĻžā§āĻāĻž"
|
driveCapacityPerRemoteAccount: "āĻĒā§āϰāϤā§āϝā§āĻ āϰāĻŋāĻŽā§āĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻĄā§āϰāĻžāĻāĻā§āϰ āĻāĻžā§āĻāĻž"
|
||||||
inMb: "āĻŽā§āĻāĻžāĻŦāĻžāĻāĻā§ āϞāĻŋāĻā§āύ"
|
inMb: "āĻŽā§āĻāĻžāĻŦāĻžāĻāĻā§ āϞāĻŋāĻā§āύ"
|
||||||
|
iconUrl: "āĻāĻāĻāύā§āϰ URL (āĻĢā§āϝāĻžāĻāĻŋāĻāύ, āĻāϤā§āϝāĻžāĻĻāĻŋ)"
|
||||||
bannerUrl: "āĻŦā§āϝāĻžāύāĻžāϰ āĻāĻŦāĻŋāϰ URL"
|
bannerUrl: "āĻŦā§āϝāĻžāύāĻžāϰ āĻāĻŦāĻŋāϰ URL"
|
||||||
backgroundImageUrl: "āĻĒāĻāĻā§āĻŽāĻŋāϰ āĻāĻŋāϤā§āϰā§āϰ URL"
|
backgroundImageUrl: "āĻĒāĻāĻā§āĻŽāĻŋāϰ āĻāĻŋāϤā§āϰā§āϰ URL"
|
||||||
basicInfo: "āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āϤāĻĨā§āϝ"
|
basicInfo: "āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āϤāĻĨā§āϝ"
|
||||||
@@ -356,14 +343,10 @@ hcaptcha: "hCaptcha"
|
|||||||
enableHcaptcha: "hCaptcha āĻāĻžāϞ⧠āĻāϰā§āύ"
|
enableHcaptcha: "hCaptcha āĻāĻžāϞ⧠āĻāϰā§āύ"
|
||||||
hcaptchaSiteKey: "āϏāĻžāĻāĻ āĻā§"
|
hcaptchaSiteKey: "āϏāĻžāĻāĻ āĻā§"
|
||||||
hcaptchaSecretKey: "āϏāĻŋāĻā§āϰā§āĻ āĻā§"
|
hcaptchaSecretKey: "āϏāĻŋāĻā§āϰā§āĻ āĻā§"
|
||||||
mcaptchaSiteKey: "āϏāĻžāĻāĻ āĻā§"
|
|
||||||
mcaptchaSecretKey: "āϏāĻŋāĻā§āϰā§āĻ āĻā§"
|
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
enableRecaptcha: "reCAPTCHA āĻāĻžāϞ⧠āĻāϰā§āύ"
|
enableRecaptcha: "reCAPTCHA āĻāĻžāϞ⧠āĻāϰā§āύ"
|
||||||
recaptchaSiteKey: "āϏāĻžāĻāĻ āĻā§"
|
recaptchaSiteKey: "āϏāĻžāĻāĻ āĻā§"
|
||||||
recaptchaSecretKey: "āϏāĻŋāĻā§āϰā§āĻ āĻā§"
|
recaptchaSecretKey: "āϏāĻŋāĻā§āϰā§āĻ āĻā§"
|
||||||
turnstileSiteKey: "āϏāĻžāĻāĻ āĻā§"
|
|
||||||
turnstileSecretKey: "āϏāĻŋāĻā§āϰā§āĻ āĻā§"
|
|
||||||
avoidMultiCaptchaConfirm: "āĻāĻāĻžāϧāĻŋāĻ Captcha āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϞ⧠āϤāĻžāϰāĻž āĻĒāϰāϏā§āĻĒāϰā§āϰ āĻāĻžāĻā§ āĻŦāĻžāϧāĻž āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻĒāύāĻŋ āĻāĻŋ āĻ
āύā§āϝāĻžāύā§āϝ Captcha āύāĻŋāώā§āĻā§āϰāĻŋāϝāĻŧ āĻāϰāϤ⧠āĻāĻžāύ? āĻāĻĒāύāĻŋ 'āĻŦāĻžāϤāĻŋāϞ' āĻā§āϞāĻŋāĻ āĻāϰāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻāĻžāϧāĻŋāĻ Captcha āĻāĻžāϞ⧠āϰāĻžāĻāϤ⧠āĻĒāĻžāϰā§āύāĨ¤"
|
avoidMultiCaptchaConfirm: "āĻāĻāĻžāϧāĻŋāĻ Captcha āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϞ⧠āϤāĻžāϰāĻž āĻĒāϰāϏā§āĻĒāϰā§āϰ āĻāĻžāĻā§ āĻŦāĻžāϧāĻž āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻĒāύāĻŋ āĻāĻŋ āĻ
āύā§āϝāĻžāύā§āϝ Captcha āύāĻŋāώā§āĻā§āϰāĻŋāϝāĻŧ āĻāϰāϤ⧠āĻāĻžāύ? āĻāĻĒāύāĻŋ 'āĻŦāĻžāϤāĻŋāϞ' āĻā§āϞāĻŋāĻ āĻāϰāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻāĻžāϧāĻŋāĻ Captcha āĻāĻžāϞ⧠āϰāĻžāĻāϤ⧠āĻĒāĻžāϰā§āύāĨ¤"
|
||||||
antennas: "āĻ
ā§āϝāĻžāύā§āĻā§āύāĻž"
|
antennas: "āĻ
ā§āϝāĻžāύā§āĻā§āύāĻž"
|
||||||
manageAntennas: "āĻ
ā§āϝāĻžāύā§āĻā§āύāĻž āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž"
|
manageAntennas: "āĻ
ā§āϝāĻžāύā§āĻā§āύāĻž āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž"
|
||||||
@@ -397,9 +380,12 @@ about: "āĻāĻĒāύāĻžāϰ āϏāĻŽā§āĻĒāϰā§āĻā§"
|
|||||||
aboutMisskey: "Misskey āϏāĻŽā§āĻĒāϰā§āĻā§"
|
aboutMisskey: "Misskey āϏāĻŽā§āĻĒāϰā§āĻā§"
|
||||||
administrator: "āĻĒā§āϰāĻļāĻžāϏāĻ"
|
administrator: "āĻĒā§āϰāĻļāĻžāϏāĻ"
|
||||||
token: "āĻā§āĻā§āύ"
|
token: "āĻā§āĻā§āύ"
|
||||||
|
twoStepAuthentication: "⧍-āϧāĻžāĻĒ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ"
|
||||||
moderator: "āĻŽāĻĄāĻžāϰā§āĻāϰ"
|
moderator: "āĻŽāĻĄāĻžāϰā§āĻāϰ"
|
||||||
nUsersMentioned: "{n} āĻāύāĻā§ āĻāϞā§āϞā§āĻ āĻāϰāĻž āĻšā§ā§āĻā§"
|
nUsersMentioned: "{n} āĻāύāĻā§ āĻāϞā§āϞā§āĻ āĻāϰāĻž āĻšā§ā§āĻā§"
|
||||||
securityKey: "āϏāĻŋāĻāĻŋāĻāϰāĻŋāĻāĻŋ āĻā§"
|
securityKey: "āϏāĻŋāĻāĻŋāĻāϰāĻŋāĻāĻŋ āĻā§"
|
||||||
|
securityKeyName: "āĻā§'āϰ āύāĻžāĻŽ"
|
||||||
|
registerSecurityKey: "āϏāĻŋāĻāĻŋāĻāϰāĻŋāĻāĻŋ āĻā§ āύāĻŋāĻŦāύā§āϧāύ āĻāϰā§āύ"
|
||||||
lastUsed: "āĻļā§āώ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§ā§āĻā§"
|
lastUsed: "āĻļā§āώ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§ā§āĻā§"
|
||||||
unregister: "āύāĻŋāĻŦāύā§āϧāύāĻŽā§āĻā§āϤ āĻšāύ"
|
unregister: "āύāĻŋāĻŦāύā§āϧāύāĻŽā§āĻā§āϤ āĻšāύ"
|
||||||
passwordLessLogin: "āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ-āĻŦāĻŋāĻšā§āύ āϞāĻāĻāύ āϏā§āĻ āĻāĻĒ āĻāϰā§āύ"
|
passwordLessLogin: "āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ-āĻŦāĻŋāĻšā§āύ āϞāĻāĻāύ āϏā§āĻ āĻāĻĒ āĻāϰā§āύ"
|
||||||
@@ -410,21 +396,31 @@ share: "āĻļā§ā§āĻžāϰ"
|
|||||||
notFound: "āĻĒāĻžāĻā§āĻž āϝāĻžā§āύāĻŋ"
|
notFound: "āĻĒāĻžāĻā§āĻž āϝāĻžā§āύāĻŋ"
|
||||||
notFoundDescription: "āĻāĻ URL-āĻāϰ āϏāĻžāĻĨā§ āϏāĻŽā§āĻĒāϰā§āĻāĻŋāϤ āĻā§āύ⧠āĻĒā§āώā§āĻ āĻž āύā§āĻāĨ¤"
|
notFoundDescription: "āĻāĻ URL-āĻāϰ āϏāĻžāĻĨā§ āϏāĻŽā§āĻĒāϰā§āĻāĻŋāϤ āĻā§āύ⧠āĻĒā§āώā§āĻ āĻž āύā§āĻāĨ¤"
|
||||||
uploadFolder: "āĻāĻĒāϞā§āĻĄā§āϰ āĻāύā§āϝ āĻĄāĻŋāĻĢāϞā§āĻ āĻĢā§āϞā§āĻĄāĻžāϰ"
|
uploadFolder: "āĻāĻĒāϞā§āĻĄā§āϰ āĻāύā§āϝ āĻĄāĻŋāĻĢāϞā§āĻ āĻĢā§āϞā§āĻĄāĻžāϰ"
|
||||||
|
cacheClear: "āĻā§āϝāĻžāĻļ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻāϰā§āύ"
|
||||||
markAsReadAllNotifications: "āϏāĻŽāϏā§āϤ āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋāĻā§āϞāĻŋ āĻĒāĻ āĻŋāϤ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŋāĻšā§āύāĻŋāϤ āĻāϰā§āύ"
|
markAsReadAllNotifications: "āϏāĻŽāϏā§āϤ āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋāĻā§āϞāĻŋ āĻĒāĻ āĻŋāϤ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŋāĻšā§āύāĻŋāϤ āĻāϰā§āύ"
|
||||||
markAsReadAllUnreadNotes: "āϏāĻŽāϏā§āϤ āύā§āĻāĻā§āϞāĻŋ āĻĒāĻ āĻŋāϤ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŋāĻšā§āύāĻŋāϤ āĻāϰā§āύ"
|
markAsReadAllUnreadNotes: "āϏāĻŽāϏā§āϤ āύā§āĻāĻā§āϞāĻŋ āĻĒāĻ āĻŋāϤ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŋāĻšā§āύāĻŋāϤ āĻāϰā§āύ"
|
||||||
markAsReadAllTalkMessages: "āϏāĻŽāϏā§āϤ āĻŽā§āϏā§āĻ āĻĒāĻ āĻŋāϤ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŋāĻšā§āύāĻŋāϤ āĻāϰā§āύ"
|
markAsReadAllTalkMessages: "āϏāĻŽāϏā§āϤ āĻŽā§āϏā§āĻ āĻĒāĻ āĻŋāϤ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŋāĻšā§āύāĻŋāϤ āĻāϰā§āύ"
|
||||||
help: "āϏāĻšāĻžāϝāĻŧāϤāĻž"
|
help: "āϏāĻšāĻžāϝāĻŧāϤāĻž"
|
||||||
inputMessageHere: "āĻāĻāĻžāύ⧠āĻŽā§āϏā§āĻ āϞāĻŋāĻā§āύ"
|
inputMessageHere: "āĻāĻāĻžāύ⧠āĻŽā§āϏā§āĻ āϞāĻŋāĻā§āύ"
|
||||||
close: "āĻŦāύā§āϧ"
|
close: "āĻŦāύā§āϧ"
|
||||||
|
group: "āĻā§āϰā§āĻĒ"
|
||||||
|
groups: "āĻā§āϰā§āĻĒāϏāĻŽā§āĻš"
|
||||||
|
createGroup: "āĻā§āϰā§āĻĒ āϤā§āϰ⧠āĻāϰā§āύ"
|
||||||
|
ownedGroups: "āĻāĻĒāύāĻžāϰ āĻā§āϰā§āĻĒāĻā§āϞāĻŋ"
|
||||||
|
joinedGroups: "āϝā§āϏāĻŦ āĻā§āϰā§āĻĒā§ āĻāĻĒāύāĻŋ āĻāĻā§āύ"
|
||||||
invites: "āĻāĻŽāύā§āϤā§āϰāĻŖ"
|
invites: "āĻāĻŽāύā§āϤā§āϰāĻŖ"
|
||||||
|
groupName: "āĻā§āϰā§āĻĒā§āϰ āύāĻžāĻŽ"
|
||||||
members: "āϏāĻĻāϏā§āϝāĻŦā§āύā§āĻĻ"
|
members: "āϏāĻĻāϏā§āϝāĻŦā§āύā§āĻĻ"
|
||||||
transfer: "āĻšāϏā§āϤāĻžāύā§āϤāϰ"
|
transfer: "āĻšāϏā§āϤāĻžāύā§āϤāϰ"
|
||||||
|
messagingWithUser: "āĻĒā§āϰāĻžāĻāĻā§āĻ āĻā§āϝāĻžāĻ"
|
||||||
|
messagingWithGroup: "āĻā§āϰā§āĻĒ āĻā§āϝāĻžāĻ"
|
||||||
title: "āĻļāĻŋāϰā§āύāĻžāĻŽ"
|
title: "āĻļāĻŋāϰā§āύāĻžāĻŽ"
|
||||||
text: "āĻĒāĻžāĻ ā§āϝ"
|
text: "āĻĒāĻžāĻ ā§āϝ"
|
||||||
enable: "āϏāĻā§āϰāĻŋā§"
|
enable: "āϏāĻā§āϰāĻŋā§"
|
||||||
next: "āĻĒāϰāĻŦāϰā§āϤā§"
|
next: "āĻĒāϰāĻŦāϰā§āϤā§"
|
||||||
retype: "āĻĒā§āύāĻ āĻĒā§āϰāĻŦā§āĻļ"
|
retype: "āĻĒā§āύāĻ āĻĒā§āϰāĻŦā§āĻļ"
|
||||||
noteOf: "{user} āĻāϰ āύā§āĻ"
|
noteOf: "{user} āĻāϰ āύā§āĻ"
|
||||||
|
inviteToGroup: "āĻā§āϰā§āĻĒā§ āĻāĻŽāύā§āϤā§āϰāĻŖ āĻāĻžāύāĻžāύ"
|
||||||
quoteAttached: "āĻāĻĻā§āϧā§āϤ"
|
quoteAttached: "āĻāĻĻā§āϧā§āϤ"
|
||||||
quoteQuestion: "āĻāĻĻā§āϧā§āϤāĻŋ āĻšāĻŋāϏāĻžāĻŦā§ āϏāĻāϝā§āĻā§āϤ āĻāϰāĻŦā§āύ?"
|
quoteQuestion: "āĻāĻĻā§āϧā§āϤāĻŋ āĻšāĻŋāϏāĻžāĻŦā§ āϏāĻāϝā§āĻā§āϤ āĻāϰāĻŦā§āύ?"
|
||||||
noMessagesYet: "āĻā§āύ āĻŽā§āϏā§āĻ āύā§āĻ"
|
noMessagesYet: "āĻā§āύ āĻŽā§āϏā§āĻ āύā§āĻ"
|
||||||
@@ -446,12 +442,19 @@ passwordMatched: "āĻŽāĻŋāϞā§āĻā§"
|
|||||||
passwordNotMatched: "āĻŽāĻŋāϞā§āύāĻŋ"
|
passwordNotMatched: "āĻŽāĻŋāϞā§āύāĻŋ"
|
||||||
signinWith: "{x} āĻāϰ āϏāĻžāĻšāĻžāϝā§āϝ⧠āϏāĻžāĻāύ āĻāύ āĻāϰā§āύ"
|
signinWith: "{x} āĻāϰ āϏāĻžāĻšāĻžāϝā§āϝ⧠āϏāĻžāĻāύ āĻāύ āĻāϰā§āύ"
|
||||||
signinFailed: "āϞāĻ āĻāύ āĻāϰāĻž āϝāĻžāϝāĻŧāύāĻŋāĨ¤ āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύāĻžāĻŽ āĻāĻŦāĻ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āĻā§āĻ āĻāϰā§āύ."
|
signinFailed: "āϞāĻ āĻāύ āĻāϰāĻž āϝāĻžāϝāĻŧāύāĻŋāĨ¤ āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύāĻžāĻŽ āĻāĻŦāĻ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āĻā§āĻ āĻāϰā§āύ."
|
||||||
|
tapSecurityKey: "āϏāĻŋāĻāĻŋāĻāϰāĻŋāĻāĻŋ āĻā§ āϏā§āĻĒāϰā§āĻļ āĻāϰā§āύ"
|
||||||
or: "āĻ
āĻĨāĻŦāĻž"
|
or: "āĻ
āĻĨāĻŦāĻž"
|
||||||
language: "āĻāĻžāώāĻž"
|
language: "āĻāĻžāώāĻž"
|
||||||
uiLanguage: "UI āĻāϰ āĻāĻžāώāĻž"
|
uiLanguage: "UI āĻāϰ āĻāĻžāώāĻž"
|
||||||
|
groupInvited: "āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻā§āϰā§āĻĒā§ āĻāĻŽāύā§āϤā§āϰāĻŋāϤ āĻšā§ā§āĻā§āύ"
|
||||||
aboutX: "{x} āϏāĻŽā§āĻĒāϰā§āĻā§"
|
aboutX: "{x} āϏāĻŽā§āĻĒāϰā§āĻā§"
|
||||||
|
useOsNativeEmojis: "āĻ
āĻĒāĻžāϰā§āĻāĻŋāĻ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āύā§āĻāĻŋāĻ āĻāĻŽā§āĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ"
|
||||||
|
disableDrawer: "āĻĄā§āϰāϝāĻŧāĻžāϰ āĻŽā§āύ⧠āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰāĻŦā§āύ āύāĻž"
|
||||||
|
youHaveNoGroups: "āĻāĻĒāύāĻžāϰ āĻā§āύ āĻā§āϰā§āĻĒ āύā§āĻ "
|
||||||
|
joinOrCreateGroup: "āĻāĻāĻāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻā§āϰā§āĻĒā§āϰ āĻāĻŽāύā§āϤā§āϰāĻŖ āĻĒāĻžāύ āĻŦāĻž āĻāĻāĻāĻŋ āύāϤā§āύ āĻā§āϰā§āĻĒ āϤā§āϰāĻŋ āĻāϰā§āύ⧎"
|
||||||
noHistory: "āĻā§āύ⧠āĻāϤāĻŋāĻšāĻžāϏ āύā§āĻ"
|
noHistory: "āĻā§āύ⧠āĻāϤāĻŋāĻšāĻžāϏ āύā§āĻ"
|
||||||
signinHistory: "āĻĒā§āϰāĻŦā§āĻļ āĻāϰāĻžāϰ āĻāϤāĻŋāĻšāĻžāϏ"
|
signinHistory: "āĻĒā§āϰāĻŦā§āĻļ āĻāϰāĻžāϰ āĻāϤāĻŋāĻšāĻžāϏ"
|
||||||
|
disableAnimatedMfm: "āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻā§āĻĄ MFM āĻ
āĻā§āώāĻŽ āĻāϰā§āύ"
|
||||||
doing: "āĻĒā§āϰāĻā§āϰāĻŋā§āĻž āĻāϰāĻā§..."
|
doing: "āĻĒā§āϰāĻā§āϰāĻŋā§āĻž āĻāϰāĻā§..."
|
||||||
category: "āĻŦāĻŋāĻāĻžāĻ"
|
category: "āĻŦāĻŋāĻāĻžāĻ"
|
||||||
tags: "āĻâā§āϝāĻžāĻāϏāĻŽā§āĻš"
|
tags: "āĻâā§āϝāĻžāĻāϏāĻŽā§āĻš"
|
||||||
@@ -498,7 +501,6 @@ deleteAll: "āϏāĻŦ āĻŽā§āĻā§āύ"
|
|||||||
showFixedPostForm: "āĻāĻžāĻāĻŽāϞāĻžāĻāύā§āϰ āĻļā§āϰā§āώ⧠āĻĒā§āϏā§āĻ āĻāϰāĻžāϰ āĻĢāϰā§āĻŽāĻāĻŋ āĻĻā§āĻāĻžāύ"
|
showFixedPostForm: "āĻāĻžāĻāĻŽāϞāĻžāĻāύā§āϰ āĻļā§āϰā§āώ⧠āĻĒā§āϏā§āĻ āĻāϰāĻžāϰ āĻĢāϰā§āĻŽāĻāĻŋ āĻĻā§āĻāĻžāύ"
|
||||||
newNoteRecived: "āύāϤā§āύ āύā§āĻ āĻāĻā§"
|
newNoteRecived: "āύāϤā§āύ āύā§āĻ āĻāĻā§"
|
||||||
sounds: "āĻļāĻŦā§āĻĻ"
|
sounds: "āĻļāĻŦā§āĻĻ"
|
||||||
sound: "āĻļāĻŦā§āĻĻ"
|
|
||||||
listen: "āĻļā§āύā§āύ"
|
listen: "āĻļā§āύā§āύ"
|
||||||
none: "āĻāĻŋāĻā§āĻ āύāĻž"
|
none: "āĻāĻŋāĻā§āĻ āύāĻž"
|
||||||
showInPage: "āĻĒā§āĻā§ āĻĻā§āĻāĻžāύ"
|
showInPage: "āĻĒā§āĻā§ āĻĻā§āĻāĻžāύ"
|
||||||
@@ -575,6 +577,7 @@ tokenRequested: "āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻā§ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ
|
|||||||
pluginTokenRequestedDescription: "āĻāĻ āĻĒā§āϞāĻžāĻāĻāύāĻāĻŋ āĻāĻāĻžāύ⧠āĻĻā§āĻā§āĻž āĻ
āύā§āĻŽā§āϤāĻŋāϏāĻŽā§āĻš āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§"
|
pluginTokenRequestedDescription: "āĻāĻ āĻĒā§āϞāĻžāĻāĻāύāĻāĻŋ āĻāĻāĻžāύ⧠āĻĻā§āĻā§āĻž āĻ
āύā§āĻŽā§āϤāĻŋāϏāĻŽā§āĻš āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§"
|
||||||
notificationType: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋāϰ āϧāϰāύ"
|
notificationType: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋāϰ āϧāϰāύ"
|
||||||
edit: "āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž"
|
edit: "āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž"
|
||||||
|
useStarForReactionFallback: "āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύā§āϰ āĻāĻŽā§āĻāĻŋ āύāĻž āĻāĻžāύāϞ⧠â
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ"
|
||||||
emailServer: "āĻāĻŽā§āĻāϞ āϏāĻžāϰā§āĻāĻžāϰ"
|
emailServer: "āĻāĻŽā§āĻāϞ āϏāĻžāϰā§āĻāĻžāϰ"
|
||||||
enableEmail: "āĻāĻŽā§āĻāϞ āĻŦāĻŋāϤāϰāĻŖ āĻāĻžāϞ⧠āĻāϰā§āύ"
|
enableEmail: "āĻāĻŽā§āĻāϞ āĻŦāĻŋāϤāϰāĻŖ āĻāĻžāϞ⧠āĻāϰā§āύ"
|
||||||
emailConfigInfo: "āĻāĻĒāύāĻžāϰ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āĻĒā§āύāϰāĻžāϝāĻŧ āϏā§āĻ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ"
|
emailConfigInfo: "āĻāĻĒāύāĻžāϰ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āĻĒā§āύāϰāĻžāϝāĻŧ āϏā§āĻ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ"
|
||||||
@@ -623,7 +626,10 @@ abuseReported: "āĻāĻĒāύāĻžāϰ āĻ
āĻāĻŋāϝā§āĻāĻāĻŋ āĻĻāĻžāĻāĻŋāϞ āĻāϰ
|
|||||||
reporter: "āĻ
āĻāĻŋāϝā§āĻāĻāĻžāϰā§"
|
reporter: "āĻ
āĻāĻŋāϝā§āĻāĻāĻžāϰā§"
|
||||||
reporteeOrigin: "āĻ
āĻāĻŋāϝā§āĻāĻāĻŋāϰ āĻā§āϏ"
|
reporteeOrigin: "āĻ
āĻāĻŋāϝā§āĻāĻāĻŋāϰ āĻā§āϏ"
|
||||||
reporterOrigin: "āĻ
āĻāĻŋāϝā§āĻāĻāĻžāϰā§āϰ āĻā§āϏ"
|
reporterOrigin: "āĻ
āĻāĻŋāϝā§āĻāĻāĻžāϰā§āϰ āĻā§āϏ"
|
||||||
|
forwardReport: "āϰāĻŋāĻŽā§āĻ āĻāύā§āϏāϤā§āϝāĻžāύā§āϏ⧠āĻ
āĻāĻŋāϝā§āĻāĻāĻŋ āĻĒāĻžāĻ āĻžāύ"
|
||||||
|
forwardReportIsAnonymous: "āĻāĻĒāύāĻžāϰ āϤāĻĨā§āϝ āϰāĻŋāĻŽā§āĻ āĻāύā§āϏāϤā§āϝāĻžāύā§āϏ⧠āĻĒāĻžāĻ āĻžāύ⧠āĻšāĻŦā§ āύāĻž āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻŦā§āύāĻžāĻŽā§ āϏāĻŋāϏā§āĻā§āĻŽ āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻšāĻŋāϏāĻžāĻŦā§ āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻšāĻŦā§āĨ¤"
|
||||||
send: "āĻĒāĻžāĻ āĻžāύ"
|
send: "āĻĒāĻžāĻ āĻžāύ"
|
||||||
|
abuseMarkAsResolved: "āĻ
āĻāĻŋāϝā§āĻāĻāĻŋāĻā§ āϏāĻŽāĻžāϧāĻžāĻā§āϤ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŋāĻšā§āύāĻŋāϤ āĻāϰā§āύ"
|
||||||
openInNewTab: "āύāϤā§āύ āĻā§āϝāĻžāĻŦā§ āĻā§āϞā§āύ"
|
openInNewTab: "āύāϤā§āύ āĻā§āϝāĻžāĻŦā§ āĻā§āϞā§āύ"
|
||||||
openInSideView: "āϏāĻžāĻāĻĄ āĻāĻŋāĻāϤ⧠āĻā§āϞā§āύ"
|
openInSideView: "āϏāĻžāĻāĻĄ āĻāĻŋāĻāϤ⧠āĻā§āϞā§āύ"
|
||||||
defaultNavigationBehaviour: "āĻĄāĻŋāĻĢāϞā§āĻ āύā§āĻāĻŋāĻā§āĻļāύ"
|
defaultNavigationBehaviour: "āĻĄāĻŋāĻĢāϞā§āĻ āύā§āĻāĻŋāĻā§āĻļāύ"
|
||||||
@@ -639,7 +645,6 @@ createNew: "āύāϤā§āύ"
|
|||||||
optional: "āĻĒā§āϰāϝāĻŧā§āĻāύā§ā§ āύā§"
|
optional: "āĻĒā§āϰāϝāĻŧā§āĻāύā§ā§ āύā§"
|
||||||
createNewClip: "āύāϤā§āύ āĻā§āϞāĻŋāĻĒ āϤā§āϰāĻŋ āĻāϰā§āύ"
|
createNewClip: "āύāϤā§āύ āĻā§āϞāĻŋāĻĒ āϤā§āϰāĻŋ āĻāϰā§āύ"
|
||||||
public: "āϏāϰā§āĻŦāĻāύā§āύ"
|
public: "āϏāϰā§āĻŦāĻāύā§āύ"
|
||||||
private: "āĻŦā§āϝāĻžāĻā§āϤāĻŋāĻāϤ"
|
|
||||||
i18nInfo: "Misskey āϏā§āĻŦā§āĻā§āĻāĻžāϏā§āĻŦāĻāĻĻā§āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻžāώāĻžāϝāĻŧ āĻ
āύā§āĻŦāĻžāĻĻ āĻāϰāĻž āĻšāĻā§āĻā§āĨ¤ āĻāĻĒāύāĻŋ {link} āĻ āĻāĻŋā§ā§ āĻ
āύā§āĻŦāĻžāĻĻā§ āϏāĻšāϝā§āĻāĻŋāϤāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤"
|
i18nInfo: "Misskey āϏā§āĻŦā§āĻā§āĻāĻžāϏā§āĻŦāĻāĻĻā§āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻžāώāĻžāϝāĻŧ āĻ
āύā§āĻŦāĻžāĻĻ āĻāϰāĻž āĻšāĻā§āĻā§āĨ¤ āĻāĻĒāύāĻŋ {link} āĻ āĻāĻŋā§ā§ āĻ
āύā§āĻŦāĻžāĻĻā§ āϏāĻšāϝā§āĻāĻŋāϤāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤"
|
||||||
manageAccessTokens: "āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻā§āĻā§āύ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύ"
|
manageAccessTokens: "āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻā§āĻā§āύ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύ"
|
||||||
accountInfo: "āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āϤāĻĨā§āϝ"
|
accountInfo: "āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āϤāĻĨā§āϝ"
|
||||||
@@ -807,11 +812,15 @@ makeReactionsPublicDescription: "āĻāĻĒāύāĻžāϰ āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤā§
|
|||||||
classic: "āĻā§āϞāĻžāϏāĻŋāĻ"
|
classic: "āĻā§āϞāĻžāϏāĻŋāĻ"
|
||||||
muteThread: "āĻĨā§āϰā§āĻĄ āĻŽāĻŋāĻāĻ āĻāϰā§āύ"
|
muteThread: "āĻĨā§āϰā§āĻĄ āĻŽāĻŋāĻāĻ āĻāϰā§āύ"
|
||||||
unmuteThread: "āĻĨā§āϰā§āĻĄ āĻāύāĻŽāĻŋāĻāĻ āĻāϰā§āύ"
|
unmuteThread: "āĻĨā§āϰā§āĻĄ āĻāύāĻŽāĻŋāĻāĻ āĻāϰā§āύ"
|
||||||
|
ffVisibility: "āĻ
āύā§āϏāϰāĻŖ/āĻ
āύā§āϏāϰāĻŖāĻāĻžāϰā§āĻĻā§āϰ āĻĻā§āĻļā§āϝāĻŽāĻžāύā§āϝāϤāĻž"
|
||||||
|
ffVisibilityDescription: "āĻāĻĒāύāĻŋ āĻāĻžāĻā§ āĻ
āύā§āϏāϰāĻŖ āĻāϰā§āύ āĻāĻŦāĻ āĻā§ āĻāĻĒāύāĻžāĻā§ āĻ
āύā§āϏāϰāĻŖ āĻāϰā§, āϏā§āĻāĻž āĻāĻžāϰāĻž āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§ āϤāĻž āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰā§āĨ¤"
|
||||||
continueThread: "āĻāϰ⧠āĻĨā§āϰā§āĻĄ āĻĻā§āĻā§āύ"
|
continueThread: "āĻāϰ⧠āĻĨā§āϰā§āĻĄ āĻĻā§āĻā§āύ"
|
||||||
deleteAccountConfirm: "āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻŽā§āĻā§ āĻĢā§āϞāĻž āĻšāĻŦā§āĨ¤ āĻ āĻŋāĻ āĻāĻā§?"
|
deleteAccountConfirm: "āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻŽā§āĻā§ āĻĢā§āϞāĻž āĻšāĻŦā§āĨ¤ āĻ āĻŋāĻ āĻāĻā§?"
|
||||||
incorrectPassword: "āĻāĻĒāύāĻžāϰ āĻĻā§āĻā§āĻž āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄāĻāĻŋ āĻā§āϞāĨ¤"
|
incorrectPassword: "āĻāĻĒāύāĻžāϰ āĻĻā§āĻā§āĻž āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄāĻāĻŋ āĻā§āϞāĨ¤"
|
||||||
voteConfirm: "\"{choice}\" āĻ āĻā§āĻ āĻĻāĻŋāϤ⧠āĻāĻžāύīŧ"
|
voteConfirm: "\"{choice}\" āĻ āĻā§āĻ āĻĻāĻŋāϤ⧠āĻāĻžāύīŧ"
|
||||||
hide: "āϞā§āĻāĻžāύ"
|
hide: "āϞā§āĻāĻžāύ"
|
||||||
|
leaveGroup: "āĻā§āϰā§āĻĒ āĻā§ā§ā§ āĻāϞ⧠āϝāĻžāύ"
|
||||||
|
leaveGroupConfirm: "\"{name}\" āĻā§āϰā§āĻĒ āĻā§ā§ā§ āĻāϞ⧠āϝā§āϤ⧠āĻāĻžāύ?"
|
||||||
useDrawerReactionPickerForMobile: "āĻŽā§āĻŦāĻžāĻāϞ⧠āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύ āĻĒāĻŋāĻāĻžāϰāĻā§ āĻĄā§āϰāϝāĻŧāĻžāϰ⧠āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰā§āύ"
|
useDrawerReactionPickerForMobile: "āĻŽā§āĻŦāĻžāĻāϞ⧠āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύ āĻĒāĻŋāĻāĻžāϰāĻā§ āĻĄā§āϰāϝāĻŧāĻžāϰ⧠āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰā§āύ"
|
||||||
welcomeBackWithName: "āĻāĻŦāĻžāϰ āϏā§āĻŦāĻžāĻāϤāĻŽ, {name}"
|
welcomeBackWithName: "āĻāĻŦāĻžāϰ āϏā§āĻŦāĻžāĻāϤāĻŽ, {name}"
|
||||||
clickToFinishEmailVerification: " [{ok}] āĻā§āϞāĻŋāĻ āĻāϰāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻĒāύāĻžāϰ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰā§āύāĨ¤"
|
clickToFinishEmailVerification: " [{ok}] āĻā§āϞāĻŋāĻ āĻāϰāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻĒāύāĻžāϰ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰā§āύāĨ¤"
|
||||||
@@ -827,7 +836,6 @@ instanceDefaultLightTheme: "āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ āĻĄāĻŋāĻĢāϞ
|
|||||||
instanceDefaultDarkTheme: "āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ āĻĄāĻŋāĻĢāϞā§āĻ āĻĄāĻžāϰā§āĻ āĻĨāĻŋāĻŽ"
|
instanceDefaultDarkTheme: "āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ āĻĄāĻŋāĻĢāϞā§āĻ āĻĄāĻžāϰā§āĻ āĻĨāĻŋāĻŽ"
|
||||||
instanceDefaultThemeDescription: "āĻ
āĻŦāĻā§āĻā§āĻ āĻĢāϰāĻŽā§āϝāĻžāĻā§ āĻĨāĻŋāĻŽ āĻā§āĻĄ āϞāĻŋāĻā§āύ"
|
instanceDefaultThemeDescription: "āĻ
āĻŦāĻā§āĻā§āĻ āĻĢāϰāĻŽā§āϝāĻžāĻā§ āĻĨāĻŋāĻŽ āĻā§āĻĄ āϞāĻŋāĻā§āύ"
|
||||||
mutePeriod: "āĻŽāĻŋāĻāĻā§āϰ āϏāĻŽā§āĻāĻžāϞ"
|
mutePeriod: "āĻŽāĻŋāĻāĻā§āϰ āϏāĻŽā§āĻāĻžāϞ"
|
||||||
period: "āĻĒā§āϞā§āϰ āϏāĻŽāϝāĻŧāϏā§āĻŽāĻž"
|
|
||||||
indefinitely: "āĻ
āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ"
|
indefinitely: "āĻ
āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ"
|
||||||
tenMinutes: "ā§§ā§Ļ āĻŽāĻŋāύāĻŋāĻ"
|
tenMinutes: "ā§§ā§Ļ āĻŽāĻŋāύāĻŋāĻ"
|
||||||
oneHour: "ā§§ āĻāĻŖā§āĻāĻž"
|
oneHour: "ā§§ āĻāĻŖā§āĻāĻž"
|
||||||
@@ -842,26 +850,6 @@ colored: "āϰāĻā§āĻāĻŋāύ"
|
|||||||
label: "āϞā§āĻŦā§āϞ"
|
label: "āϞā§āĻŦā§āϞ"
|
||||||
localOnly: "āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϞā§āĻāĻžāϞ"
|
localOnly: "āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϞā§āĻāĻžāϞ"
|
||||||
account: "āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻāĻā§āϞāĻŋ"
|
account: "āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻāĻā§āϞāĻŋ"
|
||||||
like: "āĻĒāĻāύā§āĻĻ āĻāϰāĻž"
|
|
||||||
show: "āĻĒā§āϰāĻĻāϰā§āĻļāύ"
|
|
||||||
color: "āϰāĻ"
|
|
||||||
horizontal: "āĻĒāĻžāĻļā§"
|
|
||||||
youFollowing: "āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻž āĻšāĻā§āĻā§"
|
|
||||||
icon: "āĻĒā§āϰā§āĻĢāĻžāĻāϞ āĻāĻŦāĻŋ"
|
|
||||||
replies: "āĻāĻŦāĻžāĻŦ"
|
|
||||||
renotes: "āϰāĻŋāύā§āĻ"
|
|
||||||
sourceCode: "āϏā§āϰā§āϏ āĻā§āĻĄ"
|
|
||||||
flip: "āĻāϞā§āĻāĻžāύ"
|
|
||||||
_delivery:
|
|
||||||
stop: "āϏā§āĻĨāĻāĻŋāϤ āĻāϰāĻž āĻšā§ā§āĻā§"
|
|
||||||
_type:
|
|
||||||
none: "āĻĒā§āϰāĻāĻžāĻļ āĻāϰāĻž āĻšāĻā§āĻā§"
|
|
||||||
_role:
|
|
||||||
priority: "āĻ
āĻā§āϰāĻžāϧāĻŋāĻāĻžāϰ"
|
|
||||||
_priority:
|
|
||||||
low: "āύāĻŋāĻŽā§āύ"
|
|
||||||
middle: "āĻŽāĻžāĻāĻžāϰāĻŋ"
|
|
||||||
high: "āĻāĻā§āĻ"
|
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "āĻāĻ āĻāĻŽā§āĻāϞ āĻ āĻŋāĻāĻžāύāĻžāĻāĻŋ āĻāϤā§āĻŽāϧā§āϝ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšā§ā§āĻā§"
|
used: "āĻāĻ āĻāĻŽā§āĻāϞ āĻ āĻŋāĻāĻžāύāĻžāĻāĻŋ āĻāϤā§āĻŽāϧā§āϝ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšā§ā§āĻā§"
|
||||||
format: "āĻāĻ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻžāĻāĻŋ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āϞāĻŋāĻāĻž āĻšā§āύāĻŋ"
|
format: "āĻāĻ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻžāĻāĻŋ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āϞāĻŋāĻāĻž āĻšā§āύāĻŋ"
|
||||||
@@ -886,7 +874,6 @@ _accountDelete:
|
|||||||
_ad:
|
_ad:
|
||||||
back: "āĻĒāĻŋāĻāύā§"
|
back: "āĻĒāĻŋāĻāύā§"
|
||||||
reduceFrequencyOfThisAd: "āĻāĻ āĻŦāĻŋāĻā§āĻāĻžāĻĒāύāĻāĻŋ āĻāĻŽ āĻĻā§āĻāĻžāύ"
|
reduceFrequencyOfThisAd: "āĻāĻ āĻŦāĻŋāĻā§āĻāĻžāĻĒāύāĻāĻŋ āĻāĻŽ āĻĻā§āĻāĻžāύ"
|
||||||
hide: "āĻĻā§āĻāĻžāĻŦā§āύ āύāĻž"
|
|
||||||
_forgotPassword:
|
_forgotPassword:
|
||||||
enterEmail: "āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āĻāύā§āϝ āύāĻŋāĻŦāύā§āϧāĻŋāϤ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āϞāĻŋāĻā§āύ. āϏā§āĻ āĻ āĻŋāĻāĻžāύāĻžāϝāĻŧ āĻāĻāĻāĻŋ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āϰāĻŋāϏā§āĻ āϞāĻŋāĻā§āĻ āĻĒāĻžāĻ āĻžāύ⧠āĻšāĻŦā§āĨ¤"
|
enterEmail: "āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āĻāύā§āϝ āύāĻŋāĻŦāύā§āϧāĻŋāϤ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āϞāĻŋāĻā§āύ. āϏā§āĻ āĻ āĻŋāĻāĻžāύāĻžāϝāĻŧ āĻāĻāĻāĻŋ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āϰāĻŋāϏā§āĻ āϞāĻŋāĻā§āĻ āĻĒāĻžāĻ āĻžāύ⧠āĻšāĻŦā§āĨ¤"
|
||||||
ifNoEmail: "āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āύāĻŋāĻŦāύā§āϧāύā§āϰ āϏāĻŽā§ āĻ-āĻŽā§āĻāϞ āĻ āĻŋāĻāĻžāύāĻž āύāĻž āĻĻāĻŋā§ā§ āĻĨāĻžāĻā§āύ, āϤāĻžāĻšāϞ⧠āĻ
āύā§āĻā§āϰāĻš āĻāϰ⧠āĻĒā§āϰāĻļāĻžāϏāĻā§āϰ āϏāĻžāĻĨā§ āϝā§āĻāĻžāϝā§āĻ āĻāϰā§āύāĨ¤"
|
ifNoEmail: "āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āύāĻŋāĻŦāύā§āϧāύā§āϰ āϏāĻŽā§ āĻ-āĻŽā§āĻāϞ āĻ āĻŋāĻāĻžāύāĻž āύāĻž āĻĻāĻŋā§ā§ āĻĨāĻžāĻā§āύ, āϤāĻžāĻšāϞ⧠āĻ
āύā§āĻā§āϰāĻš āĻāϰ⧠āĻĒā§āϰāĻļāĻžāϏāĻā§āϰ āϏāĻžāĻĨā§ āϝā§āĻāĻžāϝā§āĻ āĻāϰā§āύāĨ¤"
|
||||||
@@ -905,7 +892,6 @@ _plugin:
|
|||||||
install: "āĻĒā§āϞāĻžāĻāĻāύ āĻāύā§āϏāĻāϞ āĻāϰā§āύ"
|
install: "āĻĒā§āϞāĻžāĻāĻāύ āĻāύā§āϏāĻāϞ āĻāϰā§āύ"
|
||||||
installWarn: "āĻ
āĻŦāĻŋāĻļā§āĻŦāϏā§āϤ āĻĒā§āϞāĻžāĻāĻāύ āĻāύāϏā§āĻāϞ āĻāϰāĻŦā§āύ āύāĻžāĨ¤"
|
installWarn: "āĻ
āĻŦāĻŋāĻļā§āĻŦāϏā§āϤ āĻĒā§āϞāĻžāĻāĻāύ āĻāύāϏā§āĻāϞ āĻāϰāĻŦā§āύ āύāĻžāĨ¤"
|
||||||
manage: "āĻĒā§āϞāĻžāĻāĻāύ āĻŽā§āϝāĻžāύā§āĻ āĻāϰā§āύ"
|
manage: "āĻĒā§āϞāĻžāĻāĻāύ āĻŽā§āϝāĻžāύā§āĻ āĻāϰā§āύ"
|
||||||
viewSource: "āĻā§āϏ āĻĻā§āĻā§āύ"
|
|
||||||
_registry:
|
_registry:
|
||||||
scope: "āϏā§āĻā§āĻĒ"
|
scope: "āϏā§āĻā§āĻĒ"
|
||||||
key: "āĻā§"
|
key: "āĻā§"
|
||||||
@@ -921,6 +907,74 @@ _aboutMisskey:
|
|||||||
donate: "Misskey āϤ⧠āĻĻāĻžāύ āĻāϰā§āύ"
|
donate: "Misskey āϤ⧠āĻĻāĻžāύ āĻāϰā§āύ"
|
||||||
morePatrons: "āĻāϰāĻ āĻ
āύā§āĻā§ āĻāĻŽāĻžāĻĻā§āϰ āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰāĻā§āύāĨ¤ āϤāĻžāĻĻā§āϰ āϏāĻŦāĻžāĻāĻā§ āϧāύā§āϝāĻŦāĻžāĻĻ đĨ°"
|
morePatrons: "āĻāϰāĻ āĻ
āύā§āĻā§ āĻāĻŽāĻžāĻĻā§āϰ āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰāĻā§āύāĨ¤ āϤāĻžāĻĻā§āϰ āϏāĻŦāĻžāĻāĻā§ āϧāύā§āϝāĻŦāĻžāĻĻ đĨ°"
|
||||||
patrons: "āϏāĻŽāϰā§āĻĨāύāĻāĻžāϰā§"
|
patrons: "āϏāĻŽāϰā§āĻĨāύāĻāĻžāϰā§"
|
||||||
|
_nsfw:
|
||||||
|
respect: "āϏā§āĻĒāϰā§āĻļāĻāĻžāϤāϰ āĻŽāĻŋāĻĄāĻŋā§āĻž āϞā§āĻāĻžāύ"
|
||||||
|
ignore: "āϏā§āĻĒāϰā§āĻļāĻāĻžāϤāϰ āĻŽāĻŋāĻĄāĻŋā§āĻž āϞā§āĻāĻžāĻŦā§āύ āύāĻž"
|
||||||
|
force: "āϏāĻāϞ āĻŽāĻŋāĻĄāĻŋā§āĻž āϞā§āĻāĻžāύ"
|
||||||
|
_mfm:
|
||||||
|
cheatSheet: "MFM āĻāĻŋāĻāĻļāĻŋāĻ"
|
||||||
|
intro: "MFM āĻāĻāĻāĻŋ āĻŽāĻžāϰā§āĻāĻāĻĒ āĻāĻžāώāĻž āϝāĻž Misskey-āĻāϰ āĻŽāϧā§āϝ⧠āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻžāϝāĻŧāĻāĻžāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻāĻžāύ⧠āĻāĻĒāύāĻŋ MFM-āĻāϰ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āϤāĻžāϞāĻŋāĻāĻž āĻĻā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤"
|
||||||
|
dummy: "āĻŽāĻŋāϏāĻāĻŋ āĻĢā§āĻĄāĻŋāĻāĻžāϰā§āϏā§āϰ āĻŦāĻŋāĻļā§āĻŦāĻā§ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰā§"
|
||||||
|
mention: "āĻāϞā§āϞā§āĻ"
|
||||||
|
mentionDescription: "@ āĻāĻŋāĻšā§āύ + āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύāĻžāĻŽ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝāĻžā§āĨ¤"
|
||||||
|
hashtag: "āĻšā§āϝāĻžāĻļāĻā§āϝāĻžāĻ"
|
||||||
|
hashtagDescription: "āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ # āĻāĻŋāĻšā§āύ + āĻā§āϝāĻžāĻ āϏāĻš āĻāĻāĻāĻŋ āĻšā§āϝāĻžāĻļāĻā§āϝāĻžāĻ āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤"
|
||||||
|
url: "URL"
|
||||||
|
urlDescription: "URL āĻĻā§āĻāĻžāύ⧠āϏāĻŽā§āĻāĻŦāĨ¤"
|
||||||
|
link: "āϞāĻŋāĻāĻ"
|
||||||
|
linkDescription: "āĻāĻĒāύāĻŋ āĻĒāĻžāĻ ā§āϝā§āϰ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻ
āĻāĻļāĻā§ URL āĻšāĻŋāϏāĻžāĻŦā§ āĻĻā§āĻāĻžāϤ⧠āĻĒāĻžāϰā§āύ⧎"
|
||||||
|
bold: "āĻāĻžā§"
|
||||||
|
boldDescription: "āĻ
āĻā§āώāϰāĻā§āϞāĻŋāĻā§ āĻŽā§āĻāĻžāĻāϰ⧠āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰāĻž āĻšāĻŦā§āĨ¤"
|
||||||
|
small: "āĻā§āĻ"
|
||||||
|
smallDescription: "āϞā§āĻāĻž āĻā§āĻ āĻāĻŦāĻ āĻĒāĻžāϤāϞāĻž āĻāϰ⧠āĻĻā§āĻāĻžāύ⧠āĻšāĻŦā§āĨ¤"
|
||||||
|
center: "āϏā§āύā§āĻāĻžāϰ"
|
||||||
|
centerDescription: "āϞā§āĻāĻž āĻŽāĻžāĻ āĻŦāϰāĻžāĻŦāϰ āĻĻā§āĻāĻžāύ⧠āĻšāĻŦā§"
|
||||||
|
inlineCode: "āĻā§āĻĄ (āĻāύāϞāĻžāĻāύ)"
|
||||||
|
inlineCodeDescription: " āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻā§āĻĄā§āϰ āĻāύā§āϝ āĻāύāϞāĻžāĻāύ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ āĻšāĻžāĻāϞāĻžāĻāĻāĻŋāĻ āĻāϰāĻž āĻšāĻŦā§"
|
||||||
|
blockCode: "āĻā§āĻĄ (āĻŦā§āϞāĻ)"
|
||||||
|
blockCodeDescription: "āĻŽāĻžāϞā§āĻāĻŋ-āϞāĻžāĻāύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻā§āĻĄā§āϰ āĻāύā§āϝ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ āĻšāĻžāĻāϞāĻžāĻāĻ āĻāϰā§āĨ¤"
|
||||||
|
inlineMath: "āĻāĻžāĻŖāĻŋāϤāĻŋāĻ āϏā§āϤā§āϰ (āĻāύāϞāĻžāĻāύ)"
|
||||||
|
inlineMathDescription: "āĻāĻžāĻŖāĻŋāϤāĻŋāĻ āϏā§āϤā§āϰ āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰā§āύ (KaTeX) āĻāύāϞāĻžāĻāύāĨ¤"
|
||||||
|
blockMath: "āĻāĻžāĻŖāĻŋāϤāĻŋāĻ āϏā§āϤā§āϰ (āĻŦā§āϞāĻ)"
|
||||||
|
blockMathDescription: "āĻāĻāĻāĻŋ āĻŦā§āϞāĻā§ āĻāĻāĻžāϧāĻŋāĻ āϞāĻžāĻāύā§āϰ āĻāĻžāĻŖāĻŋāϤāĻŋāĻ āϏā§āϤā§āϰ āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰā§āύ (KaTeX)āĨ¤"
|
||||||
|
quote: "āĻāĻĻā§āϧā§āϤāĻŋ"
|
||||||
|
quoteDescription: "āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤā§āĻā§ āĻāĻāĻāĻŋ āĻāĻĻā§āϧā§āϤāĻŋ āĻšāĻŋāϏāĻžāĻŦā§ āĻĻā§āĻāĻžāύ⧠āĻšāĻŦā§āĨ¤"
|
||||||
|
emoji: "āϏā§āĻŦāύāĻŋāϰā§āϧāĻžāϰāĻŋāϤ āĻāĻŽā§āĻāĻŋāĻā§āϞāĻŋ"
|
||||||
|
emojiDescription: "āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻāĻŽ āĻāĻŽā§āĻāĻŋāϰ āύāĻžāĻŽ āĻā§āϞāύ⧠āĻāĻŦāĻĻā§āϧ āĻāϰ⧠āĻāĻžāϏā§āĻāĻŽ āĻāĻŽā§āĻāĻŋāĻāĻŋ āĻĻā§āĻāĻžāϤ⧠āĻĒāĻžāϰā§āύ⧎"
|
||||||
|
search: "āĻā§āĻāĻā§āύ"
|
||||||
|
searchDescription: "āĻĒā§āϰā§āĻŦ-āĻāĻžāĻāĻĒ āĻāϰāĻž āĻĒāĻžāĻ ā§āϝ āϏāĻš āĻāĻāĻāĻŋ āĻ
āύā§āϏāύā§āϧāĻžāύ āĻŦāĻžāĻā§āϏ āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰā§āĨ¤"
|
||||||
|
flip: "āĻāϞā§āĻāĻžāύ"
|
||||||
|
flipDescription: "āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻāĻĒāϰā§/āύā§āĻā§ āĻŦāĻž āĻŦāĻžāĻŽ/āĻĄāĻžāύ⧠āĻāϞā§āĻāĻžāύāĨ¤"
|
||||||
|
jelly: "āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ (āĻā§āϞāĻŋ)"
|
||||||
|
jellyDescription: "āĻā§āϞāĻŋāϰ āĻŽāϤ āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ āĻĻā§āĻāĻžā§āĨ¤"
|
||||||
|
tada: "āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ (āĻāĻžāĻĄāĻž)"
|
||||||
|
tadaDescription: "\"āĻāĻžāĻĄāĻž!\" āĻāϰ āĻŽāϤ āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ āĻĻā§āĻāĻžā§āĨ¤"
|
||||||
|
jump: "āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ (āϞāĻžāĻĢ)"
|
||||||
|
jumpDescription: "āĻŦāĻŋāώā§āĻŦāϏā§āϤā§āϤ⧠āϞāĻžāĻĢ āĻŽāĻžāϰāĻžāϰ āĻŽāϤ āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ āĻĻā§āĻāĻžā§āĨ¤"
|
||||||
|
bounce: "āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ (āϤāĻŋā§āĻŋāĻ āĻŦāĻŋā§āĻŋāĻ)"
|
||||||
|
bounceDescription: "āϤāĻŋā§āĻŋāĻ āĻŦāĻŋā§āĻŋāĻ āĻāϰāĻžāϰ āĻŽāϤ āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ āĻĻā§āĻāĻžā§āĨ¤"
|
||||||
|
shake: "āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ (āĻāĻžāĻāĻāĻŋ)"
|
||||||
|
shakeDescription: "āĻāĻžāĻāĻāĻŋāϰ āĻŽāϤ āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ āĻĻā§āĻāĻžā§āĨ¤"
|
||||||
|
twitch: "āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ (āĻŽā§āĻāĻĄāĻŧāĻžāύā§)"
|
||||||
|
twitchDescription: "āĻŽā§āĻāĻĄāĻŧāĻžāύā§āϰ āĻŽāϤ āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ āĻĻā§āĻāĻžā§āĨ¤"
|
||||||
|
spin: "āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ (āĻā§āϰāĻž)"
|
||||||
|
spinDescription: "āĻā§āϰāĻžāϰ āĻŽāϤ āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ āĻĻā§āĻāĻžā§āĨ¤"
|
||||||
|
x2: "āĻŦā§"
|
||||||
|
x2Description: "āĻŦāĻŋāώā§āĻŦāϏā§āϤ⧠āĻŦā§ āĻāϰ⧠āĻĻā§āĻāĻžā§āĨ¤"
|
||||||
|
x3: "āĻ
āύā§āĻ āĻŦā§"
|
||||||
|
x3Description: "āĻŦāĻŋāώā§āĻŦāϏā§āϤ⧠āĻāϰāĻ āĻŦā§ āĻāϰ⧠āĻĻā§āĻāĻžā§āĨ¤"
|
||||||
|
x4: "āĻ
āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻŦā§"
|
||||||
|
x4Description: "āĻŦāĻŋāώā§āĻŦāϏā§āϤā§āĻā§ āĻāĻā§āϰ āĻĨā§āĻā§āĻ āĻāϰāĻ āĻŦā§ āĻāϰ⧠āĻĻā§āĻāĻžā§āĨ¤"
|
||||||
|
blur: "āĻŦā§āϞāĻžāϰ"
|
||||||
|
blurDescription: "āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤā§āĻā§ āĻŦā§āϞāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻĒāύāĻŋ āĻāϰ āĻāĻĒāϰ āĻŽāĻžāĻāϏ āĻāĻžāϰā§āϏāĻžāϰ āϰāĻžāĻāϞā§, āĻāĻāĻŋ āĻĒāϰāĻŋāώā§āĻāĻžāϰāĻāĻžāĻŦā§ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āύāĨ¤"
|
||||||
|
font: "āĻĢāύā§āĻ"
|
||||||
|
fontDescription: "āĻŦāĻŋāώā§āĻŦāϏā§āϤā§āĻā§ āĻā§āύ āĻĢāύā§āĻā§ āĻĻā§āĻāĻžāύ⧠āĻšāĻŦā§ āϤāĻž āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰā§āĨ¤"
|
||||||
|
rainbow: "āϰā§āĻāύāĻŦā§"
|
||||||
|
rainbowDescription: "āĻŦāĻŋāώā§āĻŦāϏā§āϤā§āĻā§ āϰāĻāϧāύā§āϰ āϰāĻ āĻā§āϞāĻŋāϤ⧠āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰā§āĨ¤"
|
||||||
|
sparkle: "āĻāĻŋāĻ āĻāĻŋāĻ"
|
||||||
|
sparkleDescription: "āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤā§āĻā§ āĻāĻāĻāĻŋ āĻāĻŋāĻāĻāĻŋāĻā§ āĻāĻŖāĻž āĻĒā§āϰāĻāĻžāĻŦ āĻĻā§āϝāĻŧāĨ¤"
|
||||||
|
rotate: "āĻā§āϰāĻžāύ"
|
||||||
|
rotateDescription: "āĻŦāĻŋāώā§āĻŦāϏā§āϤā§āĻā§ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻā§āύ⧠āĻā§āϰāĻžā§āĨ¤"
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "āĻĻā§āĻāĻžāĻŦā§āύ āύāĻž"
|
none: "āĻĻā§āĻāĻžāĻŦā§āύ āύāĻž"
|
||||||
remote: "āϰāĻŋāĻŽā§āĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāύā§āϝ āĻĻā§āĻāĻžāύ"
|
remote: "āϰāĻŋāĻŽā§āĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāύā§āϝ āĻĻā§āĻāĻžāύ"
|
||||||
@@ -948,6 +1002,11 @@ _wordMute:
|
|||||||
muteWords: "āύāĻŋāĻāĻļāĻŦā§āĻĻ āĻāϰāĻž āĻļāĻŦā§āĻĻāĻā§āϞāĻŋ"
|
muteWords: "āύāĻŋāĻāĻļāĻŦā§āĻĻ āĻāϰāĻž āĻļāĻŦā§āĻĻāĻā§āϞāĻŋ"
|
||||||
muteWordsDescription: "āϏā§āĻĒā§āϏ āĻĻāĻŋāϝāĻŧā§ āĻāϞāĻžāĻĻāĻž āĻāϰāϞ⧠AND āĻļāϰā§āϤ āϤā§āϰāĻŋ āĻšāĻŦā§ āĻāĻŦāĻ āĻāϞāĻžāĻĻāĻž āϞāĻžāĻāύ⧠āϞāĻŋāĻāϞ⧠OR āĻļāϰā§āϤ āϤā§āϰāĻŋ āĻšāĻŦā§āĨ¤"
|
muteWordsDescription: "āϏā§āĻĒā§āϏ āĻĻāĻŋāϝāĻŧā§ āĻāϞāĻžāĻĻāĻž āĻāϰāϞ⧠AND āĻļāϰā§āϤ āϤā§āϰāĻŋ āĻšāĻŦā§ āĻāĻŦāĻ āĻāϞāĻžāĻĻāĻž āϞāĻžāĻāύ⧠āϞāĻŋāĻāϞ⧠OR āĻļāϰā§āϤ āϤā§āϰāĻŋ āĻšāĻŦā§āĨ¤"
|
||||||
muteWordsDescription2: "āϰā§āĻā§āϞāĻžāϰ āĻāĻā§āϏāĻĒā§āϰā§āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āϏā§āϞā§āϝāĻžāĻļ āĻĻāĻŋāϝāĻŧā§ āĻā§āĻāϝāĻŧāĻžāϰā§āĻĄāĻā§ āĻāĻŋāϰ⧠āϰāĻžāĻā§āύāĨ¤"
|
muteWordsDescription2: "āϰā§āĻā§āϞāĻžāϰ āĻāĻā§āϏāĻĒā§āϰā§āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āϏā§āϞā§āϝāĻžāĻļ āĻĻāĻŋāϝāĻŧā§ āĻā§āĻāϝāĻŧāĻžāϰā§āĻĄāĻā§ āĻāĻŋāϰ⧠āϰāĻžāĻā§āύāĨ¤"
|
||||||
|
softDescription: "āĻāĻžāĻāĻŽāϞāĻžāĻāύ āĻĨā§āĻā§ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻļāϰā§āϤāĻžāύā§āϝāĻžā§ā§ āύā§āĻ āϞā§āĻāĻŋāϝāĻŧā§ āϰāĻžāĻā§āĨ¤"
|
||||||
|
hardDescription: "āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻļāϰā§āϤāĻžāύā§āϝāĻžā§ā§ āύā§āĻāĻā§āϞāĻŋāĻā§ āĻāĻžāĻāĻŽāϞāĻžāĻāύ āĻĨā§āĻā§ āĻŦāĻžāĻĻ āĻĻā§ā§āĨ¤ āĻāĻĒāύāĻŋ āĻļāϰā§āϤ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāϞā§āĻ āϝ⧠āύā§āĻāĻā§āϞāĻŋ āϝā§āĻ āĻāϰāĻž āĻšāϝāĻŧāύāĻŋ āϏā§āĻā§āϞāĻŋ āĻŦāĻžāĻĻ āĻĻā§āĻāϝāĻŧāĻž āĻšāĻŦā§āĨ¤"
|
||||||
|
soft: "āύāĻŽāύā§ā§"
|
||||||
|
hard: "āĻāĻ ā§āϰ"
|
||||||
|
mutedNotes: "āĻŽāĻŋāĻāĻ āĻāϰāĻž āύā§āĻāĻā§āϞāĻŋ"
|
||||||
_instanceMute:
|
_instanceMute:
|
||||||
instanceMuteDescription: "āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻž āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ āϏāĻŦ āύā§āĻ āĻāĻŦāĻ āϰāĻŋāύā§āĻ āĻŽāĻŋāĻāĻ āĻāϰā§āύ, āĻŽāĻŋāĻāĻ āĻāϰāĻž āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāϤā§āϤāϰ āϏāĻšāĨ¤"
|
instanceMuteDescription: "āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻž āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ āϏāĻŦ āύā§āĻ āĻāĻŦāĻ āϰāĻŋāύā§āĻ āĻŽāĻŋāĻāĻ āĻāϰā§āύ, āĻŽāĻŋāĻāĻ āĻāϰāĻž āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāϤā§āϤāϰ āϏāĻšāĨ¤"
|
||||||
instanceMuteDescription2: "āĻĒā§āϰāϤāĻŋāĻāĻŋāĻā§ āĻāϞāĻžāĻĻāĻž āϞāĻžāĻāύ⧠āϞāĻŋāĻā§āύ"
|
instanceMuteDescription2: "āĻĒā§āϰāϤāĻŋāĻāĻŋāĻā§ āĻāϞāĻžāĻĻāĻž āϞāĻžāĻāύ⧠āϞāĻŋāĻā§āύ"
|
||||||
@@ -1011,11 +1070,15 @@ _theme:
|
|||||||
infoFg: "āϤāĻĨā§āϝā§āϰ āĻĒāĻžāĻ ā§āϝ"
|
infoFg: "āϤāĻĨā§āϝā§āϰ āĻĒāĻžāĻ ā§āϝ"
|
||||||
infoWarnBg: "āĻā§āĻžāϰā§āύāĻŋāĻ āĻāϰ āĻĒāĻāĻā§āĻŽāĻŋ"
|
infoWarnBg: "āĻā§āĻžāϰā§āύāĻŋāĻ āĻāϰ āĻĒāĻāĻā§āĻŽāĻŋ"
|
||||||
infoWarnFg: "āĻā§āĻžāϰā§āύāĻŋāĻ āĻāϰ āĻĒāĻžāĻ ā§āϝ"
|
infoWarnFg: "āĻā§āĻžāϰā§āύāĻŋāĻ āĻāϰ āĻĒāĻžāĻ ā§āϝ"
|
||||||
|
cwBg: "CW āĻŦāĻžāĻāύā§āϰ āĻĒāĻāĻā§āĻŽāĻŋ"
|
||||||
|
cwFg: "CW āĻŦāĻžāĻāύā§āϰ āĻĒāĻžāĻ ā§āϝ"
|
||||||
|
cwHoverBg: "CW āĻŦāĻžāĻāύā§āϰ āĻĒāĻāĻā§āĻŽāĻŋ (āĻšāĻāĻžāϰ)"
|
||||||
toastBg: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋāϰ āĻĒāĻāĻā§āĻŽāĻŋ"
|
toastBg: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋāϰ āĻĒāĻāĻā§āĻŽāĻŋ"
|
||||||
toastFg: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋāϰ āĻĒāĻžāĻ ā§āϝ"
|
toastFg: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋāϰ āĻĒāĻžāĻ ā§āϝ"
|
||||||
buttonBg: "āĻŦāĻžāĻāύā§āϰ āĻĒāĻāĻā§āĻŽāĻŋ"
|
buttonBg: "āĻŦāĻžāĻāύā§āϰ āĻĒāĻāĻā§āĻŽāĻŋ"
|
||||||
buttonHoverBg: "āĻŦāĻžāĻāύā§āϰ āĻĒāĻāĻā§āĻŽāĻŋ (āĻšāĻāĻžāϰ)"
|
buttonHoverBg: "āĻŦāĻžāĻāύā§āϰ āĻĒāĻāĻā§āĻŽāĻŋ (āĻšāĻāĻžāϰ)"
|
||||||
inputBorder: "āĻāύāĻĒā§āĻ āĻĢāĻŋāϞā§āĻĄā§āϰ āĻŦāϰā§āĻĄāĻžāϰ"
|
inputBorder: "āĻāύāĻĒā§āĻ āĻĢāĻŋāϞā§āĻĄā§āϰ āĻŦāϰā§āĻĄāĻžāϰ"
|
||||||
|
listItemHoverBg: "āϞāĻŋāϏā§āĻ āĻāĻāĻā§āĻŽā§āϰ āĻĒāĻāĻā§āĻŽāĻŋ (āĻšā§āĻāĻžāϰ)"
|
||||||
driveFolderBg: "āĻĄā§āϰāĻžāĻāĻ āĻĢā§āϞā§āĻĄāĻžāϰā§āϰ āĻĒāĻāĻā§āĻŽāĻŋ"
|
driveFolderBg: "āĻĄā§āϰāĻžāĻāĻ āĻĢā§āϞā§āĻĄāĻžāϰā§āϰ āĻĒāĻāĻā§āĻŽāĻŋ"
|
||||||
wallpaperOverlay: "āĻāϝāĻŧāĻžāϞāĻĒā§āĻĒāĻžāϰ āĻāĻāĻžāϰāϞā§"
|
wallpaperOverlay: "āĻāϝāĻŧāĻžāϞāĻĒā§āĻĒāĻžāϰ āĻāĻāĻžāϰāϞā§"
|
||||||
badge: "āĻŦā§āϝāĻžāĻ"
|
badge: "āĻŦā§āϝāĻžāĻ"
|
||||||
@@ -1027,6 +1090,10 @@ _sfx:
|
|||||||
note: "āύā§āĻāĻā§āϞāĻŋ"
|
note: "āύā§āĻāĻā§āϞāĻŋ"
|
||||||
noteMy: "āύā§āĻ (āĻāĻĒāύāĻžāϰ)"
|
noteMy: "āύā§āĻ (āĻāĻĒāύāĻžāϰ)"
|
||||||
notification: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ"
|
notification: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ"
|
||||||
|
chat: "āĻā§āϝāĻžāĻ"
|
||||||
|
chatBg: "āĻā§āϝāĻžāĻ (āĻŦā§āϝāĻžāĻāĻā§āϰāĻžāĻāύā§āĻĄ)"
|
||||||
|
antenna: "āĻ
ā§āϝāĻžāύā§āĻā§āύāĻžāĻā§āϞāĻŋ"
|
||||||
|
channel: "āĻā§āϝāĻžāύā§āϞā§āϰ āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ"
|
||||||
_ago:
|
_ago:
|
||||||
future: "āĻāĻŦāĻŋāώā§āϝā§"
|
future: "āĻāĻŦāĻŋāώā§āϝā§"
|
||||||
justNow: "āĻāĻāĻŽāĻžāϤā§āϰ"
|
justNow: "āĻāĻāĻŽāĻžāϤā§āϰ"
|
||||||
@@ -1037,20 +1104,44 @@ _ago:
|
|||||||
weeksAgo: "{n} āϏāĻĒā§āϤāĻžāĻš āĻāĻā§"
|
weeksAgo: "{n} āϏāĻĒā§āϤāĻžāĻš āĻāĻā§"
|
||||||
monthsAgo: "{n} āĻŽāĻžāϏ āĻāĻā§"
|
monthsAgo: "{n} āĻŽāĻžāϏ āĻāĻā§"
|
||||||
yearsAgo: "{n} āĻŦāĻāϰ āĻāĻā§"
|
yearsAgo: "{n} āĻŦāĻāϰ āĻāĻā§"
|
||||||
invalid: "āĻāĻāĻžāύ⧠āĻāĻŋāĻā§āĻ āύāĻžāĻ"
|
|
||||||
_time:
|
_time:
|
||||||
second: "āϏā§āĻā§āύā§āĻĄ"
|
second: "āϏā§āĻā§āύā§āĻĄ"
|
||||||
minute: "āĻŽāĻŋāύāĻŋāĻ"
|
minute: "āĻŽāĻŋāύāĻŋāĻ"
|
||||||
hour: "āĻāĻŖā§āĻāĻž"
|
hour: "āĻāĻŖā§āĻāĻž"
|
||||||
day: "āĻĻāĻŋāύ"
|
day: "āĻĻāĻŋāύ"
|
||||||
|
_tutorial:
|
||||||
|
title: "Misskey āĻāĻŋāĻāĻžāĻŦā§ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ"
|
||||||
|
step1_1: "āϏā§āĻŦāĻžāĻāϤāĻŽ!"
|
||||||
|
step1_2: "āĻāĻ āϏā§āĻā§āϰā§āύāĻāĻŋāĻā§ \"āĻāĻžāĻāĻŽāϞāĻžāĻāύ\" āĻŦāϞāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻāĻžāϞāĻžāύā§āĻā§āϰāĻŽāĻŋāĻ āĻā§āϰāĻŽā§ āĻāĻĒāύāĻžāϰ āĻāĻŦāĻ āĻāĻĒāύāĻŋ āϝāĻžāĻĻā§āϰ \"āĻ
āύā§āϏāϰāĻŖ āĻāϰā§āύ\" āϤāĻžāĻĻā§āϰ \"āύā§āĻāĻā§āϞāĻŋ\" āĻĻā§āĻāĻžāϝāĻŧ⧎"
|
||||||
|
step1_3: "āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻžāĻāĻŽāϞāĻžāĻāύ⧠āĻāĻŋāĻā§ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āύ āύāĻž āĻāĻžāϰāĻŖ āĻāĻĒāύāĻŋ āĻāĻāύāĻ āĻā§āύ⧠āύā§āĻ āĻĒā§āϏā§āĻ āĻāϰā§āύāύāĻŋ āĻāĻŦāĻ āĻāĻĒāύāĻŋ āĻāĻžāĻāĻā§ āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻā§āύ āύāĻžā§ˇ"
|
||||||
|
step2_1: "āύā§āĻ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻāĻā§ āĻŦāĻž āĻāĻžāĻāĻā§ āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻžāϰ āĻāĻā§ āĻĒā§āϰāĻĨāĻŽā§ āĻāĻĒāύāĻžāϰ āĻĒā§āϰā§āĻĢāĻžāĻāϞāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāϰā§āύāĨ¤"
|
||||||
|
step2_2: "āĻāĻĒāύāĻŋ āĻā§ āϤāĻž āĻāĻžāύāĻž āĻ
āύā§āĻ āϞā§āĻā§āϰ āĻāύā§āϝ āĻāĻĒāύāĻžāϰ āύā§āĻāĻā§āϞāĻŋ āĻĻā§āĻāĻž āĻāĻŦāĻ āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻžāĻā§ āϏāĻšāĻ āĻāϰ⧠āϤā§āϞā§ā§ˇ"
|
||||||
|
step3_1: "āĻāĻĒāύāĻŋ āĻāĻŋ āϏāĻĢāϞāĻāĻžāĻŦā§ āĻāĻĒāύāĻžāϰ āĻĒā§āϰā§āĻĢāĻžāĻāϞ āϏā§āĻ āĻāĻĒ āĻāϰā§āĻā§āύ?"
|
||||||
|
step3_2: "āĻāĻāύ, āĻāĻŋāĻā§ āύā§āĻ āĻĒā§āϏā§āĻ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰā§āύāĨ¤ āĻĒā§āϏā§āĻ āĻĢāϰā§āĻŽ āĻā§āϞāϤ⧠āĻĒā§āύā§āϏāĻŋāϞ āĻāĻŋāĻšā§āύāϝā§āĻā§āϤ āĻŦāĻžāĻāύ⧠āĻā§āϞāĻŋāĻ āĻāϰā§āύāĨ¤"
|
||||||
|
step3_3: "āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āϞā§āĻāĻžāϰ āĻĒāϰā§, āĻāĻĒāύāĻŋ āĻĢāϰā§āĻŽā§āϰ āĻāĻĒāϰā§āϰ āĻĄāĻžāύāĻĻāĻŋāĻā§āϰ āĻŦāĻžāĻāύ⧠āĻā§āϞāĻŋāĻ āĻāϰ⧠āĻĒā§āϏā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤"
|
||||||
|
step3_4: "āĻĒā§āϏā§āĻ āĻāϰāĻžāϰ āĻŽāϤ āĻāĻŋāĻā§ āĻŽāύ⧠āĻĒāϰāĻā§ āύāĻž? \"āĻāĻŽāĻŋ āĻŽāĻŋāϏāĻāĻŋ āϏā§āĻ āĻāĻĒ āĻāϰāĻāĻŋ\" āĻŦāϞāϞ⧠āĻā§āĻŽāύ āĻšāϝāĻŧ?"
|
||||||
|
step4_1: "āĻĒā§āϏā§āĻ āĻāϰā§āĻā§āύ?"
|
||||||
|
step4_2: "āϏāĻžāĻŦāĻžāĻļ! āĻāĻāύ āĻāĻĒāύāĻžāϰ āύā§āĻ āĻāĻžāĻāĻŽāϞāĻžāĻāύ⧠āĻĻā§āĻāĻž āϝāĻžāĻŦā§āĨ¤"
|
||||||
|
step5_1: "āĻāĻāύ āĻ
āύā§āϝāĻĻā§āϰāĻā§ āĻ
āύā§āϏāϰāĻŖ āĻāϰ⧠āĻāĻĒāύāĻžāϰ āĻāĻžāĻāĻŽāϞāĻžāĻāύāĻā§ āĻĒā§āϰāĻžāĻŖāĻŦāύā§āϤ āĻāϰ⧠āϤā§āϞā§āύāĨ¤"
|
||||||
|
step5_2: "āĻāĻĒāύāĻŋ {featured}-āĻ āĻāύāĻĒā§āϰāĻŋāϝāĻŧ āύā§āĻāĻā§āϞāĻŋ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰā§āύ, āϝāĻžāϤ⧠āĻāĻĒāύāĻŋ āϝ⧠āĻŦā§āϝāĻā§āϤāĻŋāĻā§ āĻĒāĻāύā§āĻĻ āĻāϰā§āύ āϤāĻžāĻā§ āĻŦā§āĻā§ āύāĻŋāϤ⧠āĻāĻŦāĻ āĻ
āύā§āϏāϰāĻŖ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āĻ
āĻĨāĻŦāĻž {explore}-āĻ āĻāύāĻĒā§āϰāĻŋāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰā§āύ⧎"
|
||||||
|
step5_3: "āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āĻ
āύā§āϏāϰāĻŖ āĻāϰāϤā§, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāĻāĻāύ⧠āĻā§āϞāĻŋāĻ āĻāϰā§āύ āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻĒā§āώā§āĻ āĻžāϤ⧠\"āĻ
āύā§āϏāϰāĻŖ āĻāϰā§āύ\" āĻŦāĻžāĻāύ⧠āĻā§āϞāĻŋāĻ āĻāϰā§āύāĨ¤"
|
||||||
|
step5_4: "āϝāĻĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύāĻžāĻŽā§āϰ āĻĒāĻžāĻļā§ āĻāĻāĻāĻŋ āϞāĻ āĻāĻāĻāύ āĻĨāĻžāĻā§ āϤāĻžāĻšāϞ⧠āĻāĻĒāύāĻžāϰ āĻ
āύā§āϏāϰāĻŖā§āϰ āĻ
āύā§āϰā§āϧ āĻā§āϰāĻšāĻŖ āĻāϰāĻžāϰ āĻāύā§āϝ āϤāĻžāϰāĻž āĻāĻŋāĻā§ āϏāĻŽāϝāĻŧ āύāĻŋāϤ⧠āĻĒāĻžāϰā§āĨ¤"
|
||||||
|
step6_1: "āϏāĻŦāĻāĻŋāĻā§ āĻ āĻŋāĻ āĻĨāĻžāĻāϞ⧠āĻāĻĒāύāĻŋ āĻāĻžāĻāĻŽāϞāĻžāĻāύ⧠āĻ
āύā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āύā§āĻ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āύāĨ¤"
|
||||||
|
step6_2: "āĻāĻĒāύāĻŋ āϏāĻšāĻā§āĻ āĻāĻĒāύāĻžāϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻāĻžāύāĻžāϤ⧠āĻ
āύā§āϝ āĻŦā§āϝāĻā§āϤāĻŋāϰ āύā§āĻā§ \"āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύ\" āϝā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤"
|
||||||
|
step6_3: "āĻāĻāĻāĻŋ āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύ āϝā§āĻ āĻāϰāϤā§, āύā§āĻā§ \"+\" āĻāĻŋāĻšā§āύ⧠āĻā§āϞāĻŋāĻ āĻāϰā§āύ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻĒāĻāύā§āĻĻā§āϰ āϰāĻŋāĻ
ā§āϝāĻžāĻāĻļāύ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύāĨ¤"
|
||||||
|
step7_1: "āĻ
āĻāĻŋāύāύā§āĻĻāύ! āĻāĻĒāύāĻŋ āĻāĻāύ Misskey-āϰ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞāĻāĻŋ āĻļā§āώ āĻāϰā§āĻā§āύāĨ¤"
|
||||||
|
step7_2: "āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ Misskey āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻāĻžāύāϤ⧠āĻāĻžāύ, āϤāĻžāĻšāϞ⧠{help} āĻ āĻĻā§āĻā§āύāĨ¤"
|
||||||
|
step7_3: "āĻāĻāύ Misskey āĻāĻĒāĻā§āĻ āĻāϰā§āύ đ"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "āĻāĻĒāύāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋ 2-āĻĢā§āϝāĻžāĻā§āĻāϰ āĻ
āĻĨā§āύāĻāĻŋāĻā§āĻļāύ āĻĄāĻŋāĻāĻžāĻāϏ āύāĻŋāĻŦāύā§āϧāύ āĻāϰā§āĻā§āύ⧎"
|
alreadyRegistered: "āĻāĻĒāύāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋ 2-āĻĢā§āϝāĻžāĻā§āĻāϰ āĻ
āĻĨā§āύāĻāĻŋāĻā§āĻļāύ āĻĄāĻŋāĻāĻžāĻāϏ āύāĻŋāĻŦāύā§āϧāύ āĻāϰā§āĻā§āύ⧎"
|
||||||
|
registerDevice: "āύāϤā§āύ āĻĄāĻŋāĻāĻžāĻāϏ āύāĻŋāĻŦāύā§āϧāύ āĻāϰā§āύ"
|
||||||
|
registerKey: "āϏāĻŋāĻāĻŋāĻāϰāĻŋāĻāĻŋ āĻā§ āύāĻŋāĻŦāύā§āϧāύ āĻāϰā§āύ"
|
||||||
step1: "āĻĒā§āϰāĻĨāĻŽā§, āĻāĻĒāύāĻžāϰ āĻĄāĻŋāĻāĻžāĻāϏ⧠{a} āĻŦāĻž {b} āĻāϰ āĻŽāϤ⧠āĻāĻāĻāĻŋ āĻ
āĻĨā§āύāĻāĻŋāĻā§āĻļāύ āĻ
ā§āϝāĻžāĻĒ āĻāύāϏā§āĻāϞ āĻāϰā§āύ⧎"
|
step1: "āĻĒā§āϰāĻĨāĻŽā§, āĻāĻĒāύāĻžāϰ āĻĄāĻŋāĻāĻžāĻāϏ⧠{a} āĻŦāĻž {b} āĻāϰ āĻŽāϤ⧠āĻāĻāĻāĻŋ āĻ
āĻĨā§āύāĻāĻŋāĻā§āĻļāύ āĻ
ā§āϝāĻžāĻĒ āĻāύāϏā§āĻāϞ āĻāϰā§āύ⧎"
|
||||||
step2: "āĻāϰāĻĒāϰā§, āĻ
ā§āϝāĻžāĻĒā§āϰ āϏāĻžāĻšāĻžāϝā§āϝ⧠āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ QR āĻā§āĻĄāĻāĻŋ āϏā§āĻā§āϝāĻžāύ āĻāϰā§āύāĨ¤"
|
step2: "āĻāϰāĻĒāϰā§, āĻ
ā§āϝāĻžāĻĒā§āϰ āϏāĻžāĻšāĻžāϝā§āϝ⧠āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ QR āĻā§āĻĄāĻāĻŋ āϏā§āĻā§āϝāĻžāύ āĻāϰā§āύāĨ¤"
|
||||||
|
step2Url: "āĻĄā§āϏā§āĻāĻāĻĒ āĻ
ā§āϝāĻžāĻĒā§, āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ URL āϞāĻŋāĻā§āύ:"
|
||||||
step3: "āĻ
ā§āϝāĻžāĻĒā§ āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻā§āĻā§āύāĻāĻŋ āϞāĻŋāĻā§āύ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻāĻžāĻ āĻļā§āώāĨ¤"
|
step3: "āĻ
ā§āϝāĻžāĻĒā§ āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻā§āĻā§āύāĻāĻŋ āϞāĻŋāĻā§āύ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻāĻžāĻ āĻļā§āώāĨ¤"
|
||||||
step4: "āĻāĻĒāύāĻžāĻā§ āĻāĻāύ āĻĨā§āĻā§ āϞāĻ āĻāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāĻāĻāĻžāĻŦā§ āĻā§āĻā§āύ āϞāĻŋāĻāϤ⧠āĻšāĻŦā§āĨ¤"
|
step4: "āĻāĻĒāύāĻžāĻā§ āĻāĻāύ āĻĨā§āĻā§ āϞāĻ āĻāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāĻāĻāĻžāĻŦā§ āĻā§āĻā§āύ āϞāĻŋāĻāϤ⧠āĻšāĻŦā§āĨ¤"
|
||||||
securityKeyInfo: "āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻšāĻžāϰā§āĻĄāĻāϝāĻŧā§āϝāĻžāϰ āϏāĻŋāĻāĻŋāĻāϰāĻŋāĻāĻŋ āĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϞāĻ āĻāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āϝāĻž FIDO2 āĻŦāĻž āĻĄāĻŋāĻāĻžāĻāϏā§āϰ āĻĢāĻŋāĻā§āĻāĻžāϰāĻĒā§āϰāĻŋāύā§āĻ āϏā§āύā§āϏāϰ āĻŦāĻž āĻĒāĻŋāύ āϏāĻŽāϰā§āĻĨāύ āĻāϰā§ā§ˇ"
|
securityKeyInfo: "āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻšāĻžāϰā§āĻĄāĻāϝāĻŧā§āϝāĻžāϰ āϏāĻŋāĻāĻŋāĻāϰāĻŋāĻāĻŋ āĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϞāĻ āĻāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āϝāĻž FIDO2 āĻŦāĻž āĻĄāĻŋāĻāĻžāĻāϏā§āϰ āĻĢāĻŋāĻā§āĻāĻžāϰāĻĒā§āϰāĻŋāύā§āĻ āϏā§āύā§āϏāϰ āĻŦāĻž āĻĒāĻŋāύ āϏāĻŽāϰā§āĻĨāύ āĻāϰā§ā§ˇ"
|
||||||
renewTOTPCancel: "āύāĻž, āϧāύā§āϝāĻŦāĻžāĻĻ"
|
|
||||||
_permissions:
|
_permissions:
|
||||||
"read:account": "āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āϤāĻĨā§āϝ āĻĻā§āĻā§āύ"
|
"read:account": "āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āϤāĻĨā§āϝ āĻĻā§āĻā§āύ"
|
||||||
"write:account": "āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āϤāĻĨā§āϝ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻāϰā§āύ"
|
"write:account": "āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āϤāĻĨā§āϝ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻāϰā§āύ"
|
||||||
@@ -1096,6 +1187,7 @@ _antennaSources:
|
|||||||
homeTimeline: "āĻāĻĒāύāĻŋ āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻā§āύ, āĻāĻŽāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āύā§āĻ"
|
homeTimeline: "āĻāĻĒāύāĻŋ āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻā§āύ, āĻāĻŽāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āύā§āĻ"
|
||||||
users: "āĻāĻ āĻŦāĻž āĻāĻāĻžāϧāĻŋāĻ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύā§āĻ"
|
users: "āĻāĻ āĻŦāĻž āĻāĻāĻžāϧāĻŋāĻ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύā§āĻ"
|
||||||
userList: "āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϤāĻžāϞāĻŋāĻāĻžāϝāĻŧ āύāĻžāĻŽ āĻĨāĻžāĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āύā§āĻ"
|
userList: "āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϤāĻžāϞāĻŋāĻāĻžāϝāĻŧ āύāĻžāĻŽ āĻĨāĻžāĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āύā§āĻ"
|
||||||
|
userGroup: "āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻā§āϰā§āĻĒā§ āĻĨāĻžāĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āύā§āĻ"
|
||||||
_weekday:
|
_weekday:
|
||||||
sunday: "āϰāĻŦāĻŋāĻŦāĻžāϰ"
|
sunday: "āϰāĻŦāĻŋāĻŦāĻžāϰ"
|
||||||
monday: "āϏā§āĻŽāĻŦāĻžāϰ"
|
monday: "āϏā§āĻŽāĻŦāĻžāϰ"
|
||||||
@@ -1105,8 +1197,6 @@ _weekday:
|
|||||||
friday: "āĻļā§āĻā§āϰāĻŦāĻžāϰ"
|
friday: "āĻļā§āĻā§āϰāĻŦāĻžāϰ"
|
||||||
saturday: "āĻļāύāĻŋāĻŦāĻžāϰ"
|
saturday: "āĻļāύāĻŋāĻŦāĻžāϰ"
|
||||||
_widgets:
|
_widgets:
|
||||||
profile: "āĻĒā§āϰā§āĻĢāĻžāĻāϞ"
|
|
||||||
instanceInfo: "āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ āϤāĻĨā§āϝ"
|
|
||||||
memo: "āϏā§āĻāĻŋāĻāĻŋ āύā§āĻ"
|
memo: "āϏā§āĻāĻŋāĻāĻŋ āύā§āĻ"
|
||||||
notifications: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ"
|
notifications: "āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ"
|
||||||
timeline: "āĻāĻžāĻāĻŽāϞāĻžāĻāύ"
|
timeline: "āĻāĻžāĻāĻŽāϞāĻžāĻāύ"
|
||||||
@@ -1126,8 +1216,6 @@ _widgets:
|
|||||||
serverMetric: "āϏāĻžāϰā§āĻāĻžāϰ āĻŽā§āĻā§āϰāĻŋāĻā§āϏ"
|
serverMetric: "āϏāĻžāϰā§āĻāĻžāϰ āĻŽā§āĻā§āϰāĻŋāĻā§āϏ"
|
||||||
aiscript: "AiScript āĻāύāϏā§āϞ"
|
aiscript: "AiScript āĻāύāϏā§āϞ"
|
||||||
aichan: "āĻāĻ āĻāĻžāύ"
|
aichan: "āĻāĻ āĻāĻžāύ"
|
||||||
_userList:
|
|
||||||
chooseList: "āϞāĻŋāϏā§āĻ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ"
|
|
||||||
_cw:
|
_cw:
|
||||||
hide: "āϞā§āĻāĻžāύ"
|
hide: "āϞā§āĻāĻžāύ"
|
||||||
show: "āĻāϰāĻ āĻĻā§āĻā§āύ"
|
show: "āĻāϰāĻ āĻĻā§āĻā§āύ"
|
||||||
@@ -1164,6 +1252,8 @@ _visibility:
|
|||||||
followersDescription: "āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻĒāύāĻžāϰ āĻ
āύā§āϏāϰāĻŖāĻāĻžāϰā§āĻĻā§āϰ āύāĻŋāĻāĻ āĻĒā§āϏā§āĻ āĻāϰā§āύ"
|
followersDescription: "āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻĒāύāĻžāϰ āĻ
āύā§āϏāϰāĻŖāĻāĻžāϰā§āĻĻā§āϰ āύāĻŋāĻāĻ āĻĒā§āϏā§āĻ āĻāϰā§āύ"
|
||||||
specified: "āĻĄāĻžāĻāϰā§āĻā§āĻ āύā§āĻ"
|
specified: "āĻĄāĻžāĻāϰā§āĻā§āĻ āύā§āĻ"
|
||||||
specifiedDescription: "āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύāĻŋāĻāĻ āĻĒāĻžāĻ āĻžāύ"
|
specifiedDescription: "āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύāĻŋāĻāĻ āĻĒāĻžāĻ āĻžāύ"
|
||||||
|
localOnly: "āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϞā§āĻāĻžāϞ"
|
||||||
|
localOnlyDescription: "āϰāĻŋāĻŽā§āĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āύāĻŋāĻāĻ āĻĻā§āĻļā§āϝāĻŽāĻžāύ āύā§"
|
||||||
_postForm:
|
_postForm:
|
||||||
replyPlaceholder: "āύā§āĻāĻāĻŋāϰ āĻāĻŦāĻžāĻŦ āĻĻāĻŋāύ..."
|
replyPlaceholder: "āύā§āĻāĻāĻŋāϰ āĻāĻŦāĻžāĻŦ āĻĻāĻŋāύ..."
|
||||||
quotePlaceholder: "āύā§āĻāĻāĻŋāĻā§ āĻāĻĻā§āϧā§āϤ āĻāϰā§āύ..."
|
quotePlaceholder: "āύā§āĻāĻāĻŋāĻā§ āĻāĻĻā§āϧā§āϤ āĻāϰā§āύ..."
|
||||||
@@ -1189,7 +1279,6 @@ _profile:
|
|||||||
changeBanner: "āĻŦā§āϝāĻžāύāĻžāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§āύ"
|
changeBanner: "āĻŦā§āϝāĻžāύāĻžāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§āύ"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "āϏāĻāϞ āύā§āĻ"
|
allNotes: "āϏāĻāϞ āύā§āĻ"
|
||||||
clips: "āĻā§āϞāĻŋāĻĒ"
|
|
||||||
followingList: "āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻž āĻšāĻā§āĻā§"
|
followingList: "āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻž āĻšāĻā§āĻā§"
|
||||||
muteList: "āĻŽāĻŋāĻāĻ"
|
muteList: "āĻŽāĻŋāĻāĻ"
|
||||||
blockingList: "āĻŦā§āϞāĻ"
|
blockingList: "āĻŦā§āϞāĻ"
|
||||||
@@ -1227,16 +1316,13 @@ _timelines:
|
|||||||
local: "āϏā§āĻĨāĻžāύā§āϝāĻŧ"
|
local: "āϏā§āĻĨāĻžāύā§āϝāĻŧ"
|
||||||
social: "āϏāĻžāĻŽāĻžāĻāĻŋāĻ"
|
social: "āϏāĻžāĻŽāĻžāĻāĻŋāĻ"
|
||||||
global: "āĻā§āϞā§āĻŦāĻžāϞ"
|
global: "āĻā§āϞā§āĻŦāĻžāϞ"
|
||||||
_play:
|
|
||||||
viewSource: "āĻā§āϏ āĻĻā§āĻā§āύ"
|
|
||||||
featured: "āĻāύāĻĒā§āϰāĻŋāϝāĻŧ"
|
|
||||||
title: "āĻļāĻŋāϰā§āύāĻžāĻŽ"
|
|
||||||
script: "āϏā§āĻā§āϰāĻŋāĻĒā§āĻ"
|
|
||||||
summary: "āĻŦāϰā§āĻŖāύāĻž"
|
|
||||||
_pages:
|
_pages:
|
||||||
newPage: "āύāϤā§āύ āĻĒā§āώā§āĻ āĻž āĻŦāĻžāύāĻžāύ"
|
newPage: "āύāϤā§āύ āĻĒā§āώā§āĻ āĻž āĻŦāĻžāύāĻžāύ"
|
||||||
editPage: "āĻĒā§āώā§āĻ āĻžāĻāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰā§āύ"
|
editPage: "āĻĒā§āώā§āĻ āĻžāĻāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰā§āύ"
|
||||||
readPage: "āĻā§āϏ āĻĻā§āĻāĻā§āύ"
|
readPage: "āĻā§āϏ āĻĻā§āĻāĻā§āύ"
|
||||||
|
created: "āĻĒā§āώā§āĻ āĻž āϤā§āϰāĻŋ āĻāϰāĻž āĻšā§ā§āĻā§"
|
||||||
|
updated: "āĻĒā§āώā§āĻ āĻž āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰāĻž āĻšā§ā§āĻā§"
|
||||||
|
deleted: "āĻĒā§āώā§āĻ āĻž āĻŽā§āĻā§ āĻĢā§āϞāĻž āĻšā§ā§āĻā§"
|
||||||
pageSetting: "āĻĒā§āώā§āĻ āĻžāϰ āϏā§āĻāĻŋāĻāϏ"
|
pageSetting: "āĻĒā§āώā§āĻ āĻžāϰ āϏā§āĻāĻŋāĻāϏ"
|
||||||
nameAlreadyExists: "āĻĒā§āώā§āĻ āĻžāϰ URLāĻāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§ā§āĻā§"
|
nameAlreadyExists: "āĻĒā§āώā§āĻ āĻžāϰ URLāĻāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§ā§āĻā§"
|
||||||
invalidNameTitle: "āĻĒā§āώā§āĻ āĻžāϰ URL āĻ
āĻŦā§āϧ"
|
invalidNameTitle: "āĻĒā§āώā§āĻ āĻžāϰ URL āĻ
āĻŦā§āϧ"
|
||||||
@@ -1265,6 +1351,8 @@ _pages:
|
|||||||
eyeCatchingImageRemove: "āĻĨāĻžāĻŽā§āĻŦāύā§āĻāϞ āϏāϰāĻžāύ"
|
eyeCatchingImageRemove: "āĻĨāĻžāĻŽā§āĻŦāύā§āĻāϞ āϏāϰāĻžāύ"
|
||||||
chooseBlock: "āĻŦā§āϞāĻ āϝā§āĻ āĻāϰā§āύ"
|
chooseBlock: "āĻŦā§āϞāĻ āϝā§āĻ āĻāϰā§āύ"
|
||||||
selectType: "āϧāϰāύ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ"
|
selectType: "āϧāϰāύ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ"
|
||||||
|
enterVariableName: "āĻāϞāĻā§āϰ āύāĻžāĻŽ āϞāĻŋāĻā§āύ"
|
||||||
|
variableNameIsAlreadyUsed: "āĻāϞāĻā§āϰ āύāĻžāĻŽāĻāĻŋ āĻāϤāĻŋāĻĒā§āϰā§āĻŦā§ āĻŦā§āϝāĻžāĻŦāĻšā§āϤ āĻšā§ā§āĻā§"
|
||||||
contentBlocks: "āĻŦāĻŋāώā§āĻŦāϏā§āϤā§"
|
contentBlocks: "āĻŦāĻŋāώā§āĻŦāϏā§āϤā§"
|
||||||
inputBlocks: "āĻāύāĻĒā§āĻ"
|
inputBlocks: "āĻāύāĻĒā§āĻ"
|
||||||
specialBlocks: "āĻŦāĻŋāĻļā§āώ"
|
specialBlocks: "āĻŦāĻŋāĻļā§āώ"
|
||||||
@@ -1274,11 +1362,249 @@ _pages:
|
|||||||
section: "āĻŦāĻŋāĻāĻžāĻ"
|
section: "āĻŦāĻŋāĻāĻžāĻ"
|
||||||
image: "āĻāĻŦāĻŋ"
|
image: "āĻāĻŦāĻŋ"
|
||||||
button: "āĻŦāĻžāĻāύ"
|
button: "āĻŦāĻžāĻāύ"
|
||||||
|
if: "āϝāĻĻāĻŋ"
|
||||||
|
_if:
|
||||||
|
variable: "āĻāϞāĻāĻā§āϞāĻŋ"
|
||||||
|
post: "āύā§āĻ āϞāĻŋāĻā§āύ"
|
||||||
|
_post:
|
||||||
|
text: "āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤā§"
|
||||||
|
attachCanvasImage: "āĻā§āϝāĻžāύāĻāĻžāϏ āĻāĻŦāĻŋāϏāĻš āĻĒā§āϏā§āĻ āĻāϰā§āύ"
|
||||||
|
canvasId: "āĻā§āϝāĻžāύāĻāĻžāϏ ID"
|
||||||
|
textInput: "āĻā§āĻā§āϏāĻ āĻāύāĻĒā§āĻ"
|
||||||
|
_textInput:
|
||||||
|
name: "āĻāϞāĻā§āϰ āύāĻžāĻŽ"
|
||||||
|
text: "āĻļāĻŋāϰā§āύāĻžāĻŽ"
|
||||||
|
default: "āĻĄāĻŋāĻĢāϞā§āĻ āĻŽāĻžāύ"
|
||||||
|
textareaInput: "āĻāĻāĻžāϧāĻŋāĻ āϞāĻžāĻāύā§āϰ āĻā§āĻā§āϏāĻ āĻāύāĻĒā§āĻ"
|
||||||
|
_textareaInput:
|
||||||
|
name: "āĻāϞāĻā§āϰ āύāĻžāĻŽ"
|
||||||
|
text: "āĻļāĻŋāϰā§āύāĻžāĻŽ"
|
||||||
|
default: "āĻĄāĻŋāĻĢāϞā§āĻ āĻŽāĻžāύ"
|
||||||
|
numberInput: "āϏāĻāĻā§āϝāĻž āĻāύāĻĒā§āĻ"
|
||||||
|
_numberInput:
|
||||||
|
name: "āĻāϞāĻā§āϰ āύāĻžāĻŽ"
|
||||||
|
text: "āĻļāĻŋāϰā§āύāĻžāĻŽ"
|
||||||
|
default: "āĻĄāĻŋāĻĢāϞā§āĻ āĻŽāĻžāύ"
|
||||||
|
canvas: "āĻā§āϝāĻžāύāĻāĻžāϏ"
|
||||||
|
_canvas:
|
||||||
|
id: "āĻā§āϝāĻžāύāĻāĻžāϏ ID"
|
||||||
|
width: "āĻĒā§āϰāϏā§āĻĨ"
|
||||||
|
height: "āĻāĻā§āĻāϤāĻž"
|
||||||
note: "āĻāĻŽā§āĻŦā§āĻĄ āύā§āĻ"
|
note: "āĻāĻŽā§āĻŦā§āĻĄ āύā§āĻ"
|
||||||
_note:
|
_note:
|
||||||
id: "āύā§āĻ ID"
|
id: "āύā§āĻ ID"
|
||||||
idDescription: "āĻāĻĒāύāĻŋ āĻāϰ āĻŦāĻĻāϞ⧠āύā§āĻā§āϰ URL āĻĒā§āϏā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ."
|
idDescription: "āĻāĻĒāύāĻŋ āĻāϰ āĻŦāĻĻāϞ⧠āύā§āĻā§āϰ URL āĻĒā§āϏā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ."
|
||||||
detailed: "āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻĻā§āĻā§āύ"
|
detailed: "āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻĻā§āĻā§āύ"
|
||||||
|
switch: "āϏā§āĻāĻ"
|
||||||
|
_switch:
|
||||||
|
name: "āĻāϞāĻā§āϰ āύāĻžāĻŽ"
|
||||||
|
text: "āĻļāĻŋāϰā§āύāĻžāĻŽ"
|
||||||
|
default: "āĻĄāĻŋāĻĢāϞā§āĻ āĻŽāĻžāύ"
|
||||||
|
counter: "āĻāĻžāĻāύā§āĻāĻžāϰ"
|
||||||
|
_counter:
|
||||||
|
name: "āĻāϞāĻā§āϰ āύāĻžāĻŽ"
|
||||||
|
text: "āĻļāĻŋāϰā§āύāĻžāĻŽ"
|
||||||
|
inc: "āĻāĻāĻžāĻŦā§ āĻŽāĻžāύ āĻŦāĻžāĻĄāĻŧāĻžāύ"
|
||||||
|
_button:
|
||||||
|
text: "āĻļāĻŋāϰā§āύāĻžāĻŽ"
|
||||||
|
colored: "āϰāĻā§āĻāĻŋāύ"
|
||||||
|
action: "āĻŦāĻžāĻāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāϞ⧠āϝāĻž āĻšāĻŦā§"
|
||||||
|
_action:
|
||||||
|
dialog: "āĻĄāĻžā§āĻžāϞāĻ āĻĻā§āĻāĻžāύ "
|
||||||
|
_dialog:
|
||||||
|
content: "āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤā§"
|
||||||
|
resetRandom: "āϰâā§āϝāĻžāύāĻĄāĻŽ āϏāĻŋāĻĄ āϰāĻŋāϏā§āĻ āĻāϰā§āύ"
|
||||||
|
pushEvent: "āĻāĻā§āύā§āĻ āĻĒāĻžāĻ āĻžāύ"
|
||||||
|
_pushEvent:
|
||||||
|
event: "āĻāĻā§āύā§āĻā§āϰ āύāĻžāĻŽ"
|
||||||
|
message: "āĻāĻžāϞ⧠āĻšāϞ⧠āĻĒā§āϰāĻĻāϰā§āĻļāύā§āϰ āĻāύā§āϝ āĻŦāĻžāϰā§āϤāĻž"
|
||||||
|
variable: "āĻĒāĻžāĻ āĻžāύ⧠āĻāϞāĻ"
|
||||||
|
no-variable: "āĻāĻŋāĻā§āĻ āύāĻž"
|
||||||
|
callAiScript: "AiScript āĻāĻžāϞāĻžāύ"
|
||||||
|
_callAiScript:
|
||||||
|
functionName: "āĻĢāĻžāĻāĻļāύā§āϰ āύāĻžāĻŽ"
|
||||||
|
radioButton: "āĻŦāĻšā§āύāĻŋāϰā§āĻŦāĻžāĻāύā§"
|
||||||
|
_radioButton:
|
||||||
|
name: "āĻāϞāĻā§āϰ āύāĻžāĻŽ"
|
||||||
|
title: "āĻļāĻŋāϰā§āύāĻžāĻŽ"
|
||||||
|
values: "āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋāĻā§ āĻāϞāĻžāĻĻāĻž āϞāĻžāĻāύ⧠āϞāĻŋāĻā§āύ"
|
||||||
|
default: "āĻĄāĻŋāĻĢāϞā§āĻ āĻŽāĻžāύ"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
flow: "āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ"
|
||||||
|
logical: "āϞāĻāĻŋāĻā§āϝāĻžāϞ āĻ
āĻĒāĻžāϰā§āĻļāύ"
|
||||||
|
operation: "āĻšāĻŋāϏāĻžāĻŦ-āύāĻŋāĻāĻžāĻļ"
|
||||||
|
comparison: "āϤā§āϞāύāĻž"
|
||||||
|
random: "āϰâā§āϝāĻžāύā§āĻĄāĻŽ"
|
||||||
|
value: "āĻŽāĻžāύ"
|
||||||
|
fn: "āĻĢāĻžāĻāĻļāύ"
|
||||||
|
text: "āĻā§āĻā§āϏāĻ āĻŽā§āϝāĻžāύāĻŋāĻĒā§āϞā§āĻļāύ"
|
||||||
|
convert: "āϰā§āĻĒāĻžāύā§āϤāϰ"
|
||||||
|
list: "āϞāĻŋāϏā§āĻ"
|
||||||
|
blocks:
|
||||||
|
text: "āϞā§āĻāĻž"
|
||||||
|
multiLineText: "āϞā§āĻāĻž (āĻāĻāĻžāϧāĻŋāĻ āϞāĻžāĻāύ)"
|
||||||
|
textList: "āϞā§āĻāĻžāϰ āϞāĻŋāϏā§āĻ"
|
||||||
|
_textList:
|
||||||
|
info: "āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāύā§āĻā§āϰāĻŋāĻā§ āĻāϞāĻžāĻĻāĻž āϞāĻžāĻāύ⧠āϞāĻŋāĻā§āύ"
|
||||||
|
strLen: "āϞā§āĻāĻžāϰ āĻĻā§āϰā§āĻā§āϝ"
|
||||||
|
_strLen:
|
||||||
|
arg1: "āϞā§āĻāĻž"
|
||||||
|
strPick: "āĻ
āĻā§āώāϰ āĻŦā§āϰ āĻāϰ⧠āĻāύā§āύ"
|
||||||
|
_strPick:
|
||||||
|
arg1: "āϞā§āĻāĻž"
|
||||||
|
arg2: "āĻ
āĻā§āώāϰā§āϰ āĻ
āĻŦāϏā§āĻĨāĻžāύ"
|
||||||
|
strReplace: "āϞā§āĻāĻž āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ"
|
||||||
|
_strReplace:
|
||||||
|
arg1: "āϞā§āĻāĻž"
|
||||||
|
arg2: "āϝ⧠āϞā§āĻāĻž āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻž āĻšāĻŦā§"
|
||||||
|
arg3: "āϝāĻž āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻž āĻšāĻŦā§"
|
||||||
|
strReverse: "āϞā§āĻāĻž āĻāϞā§āĻāĻžāύ"
|
||||||
|
_strReverse:
|
||||||
|
arg1: "āϞā§āĻāĻž"
|
||||||
|
join: "āϞā§āĻāĻž āϝā§āĻā§āϤ āĻāϰā§āύ"
|
||||||
|
_join:
|
||||||
|
arg1: "āϞāĻŋāϏā§āĻ"
|
||||||
|
arg2: "āĻŦāĻŋāĻāĻžāĻāĻ"
|
||||||
|
add: "āϝā§āĻ"
|
||||||
|
_add:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
subtract: "āĻŦāĻŋāϝāĻŧā§āĻ"
|
||||||
|
_subtract:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
multiply: "āĻā§āύ"
|
||||||
|
_multiply:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
divide: "āĻāĻžāĻ"
|
||||||
|
_divide:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
mod: "āĻāĻžāĻāĻļā§āώ"
|
||||||
|
_mod:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
round: "āĻĻāĻļāĻŽāĻŋāĻ āϰāĻžāĻāύā§āĻĄ āĻāϰā§āύ"
|
||||||
|
_round:
|
||||||
|
arg1: "āϏāĻāĻā§āϝāĻž"
|
||||||
|
eq: "A āĻ B āϏāĻŽāĻžāύ"
|
||||||
|
_eq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
notEq: "A āĻ B āϏāĻŽāĻžāύ āύāĻž"
|
||||||
|
_notEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
and: "A āĻāĻŦāĻ B"
|
||||||
|
_and:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
or: "A āĻ
āĻĨāĻŦāĻž B"
|
||||||
|
_or:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
lt: "< A , B āĻšāϤ⧠āĻāĻŽ"
|
||||||
|
_lt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gt: "> A , B āĻšāϤ⧠āĻŦā§āĻļā§"
|
||||||
|
_gt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
ltEq: "<= A , B āĻšāϤ⧠āĻāĻŽ āĻŦāĻž āϏāĻŽāĻžāύ"
|
||||||
|
_ltEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gtEq: ">= A , B āĻšāϤ⧠āĻŦā§āĻļā§ āĻŦāĻž āϏāĻŽāĻžāύ"
|
||||||
|
_gtEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
if: "āϝāĻĻāĻŋ"
|
||||||
|
_if:
|
||||||
|
arg1: "āϝāĻĻāĻŋ"
|
||||||
|
arg2: "āϤāĻžāĻšāϞā§"
|
||||||
|
arg3: "āϤāĻžāĻāĻžā§āĻž"
|
||||||
|
not: "āύāĻž"
|
||||||
|
_not:
|
||||||
|
arg1: "āύāĻž"
|
||||||
|
random: "āϰâā§āϝāĻžāύā§āĻĄāĻŽ"
|
||||||
|
_random:
|
||||||
|
arg1: "āϏāĻŽā§āĻāĻžāĻŦā§āϝāϤāĻž"
|
||||||
|
rannum: "āϰâā§āϝāĻžāύāĻĄāĻŽ āϏāĻāĻā§āϝāĻž"
|
||||||
|
_rannum:
|
||||||
|
arg1: "āύā§āϝā§āύāϤāĻŽ āĻŽāĻžāύ"
|
||||||
|
arg2: "āϏāϰā§āĻŦā§āĻā§āĻ āĻŽāĻžāύ"
|
||||||
|
randomPick: "āϤāĻžāϞāĻŋāĻāĻž āĻĨā§āĻā§ āĻĻā§āĻŦāĻā§āύ āĻāϰā§āύ"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "āϞāĻŋāϏā§āĻ"
|
||||||
|
dailyRandom: "āϰâā§āϝāĻžāύā§āĻĄāĻŽ āϏāĻāĻā§āϝāĻž (āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻĒā§āϰāϤāĻŋāĻĻāĻŋāύ āĻĒāϰāĻŋāĻŦāϰā§āϤā§āϤ āĻšā§)"
|
||||||
|
_dailyRandom:
|
||||||
|
arg1: "āϏāĻŽā§āĻāĻžāĻŦā§āϝāϤāĻž"
|
||||||
|
dailyRannum: "āϰâā§āϝāĻžāύā§āĻĄāĻŽ āϏāĻāĻā§āϝāĻž (āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻĒā§āϰāϤāĻŋāĻĻāĻŋāύ āĻĒāϰāĻŋāĻŦāϰā§āϤā§āϤ āĻšā§)"
|
||||||
|
_dailyRannum:
|
||||||
|
arg1: "āύā§āϝā§āύāϤāĻŽ āĻŽāĻžāύ"
|
||||||
|
arg2: "āϏāϰā§āĻŦā§āĻā§āĻ āĻŽāĻžāύ"
|
||||||
|
dailyRandomPick: "āϤāĻžāϞāĻŋāĻāĻž āĻĨā§āĻā§ āĻāϞā§āĻŽā§āϞā§āĻāĻžāĻŦā§ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ (āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻĒā§āϰāϤāĻŋāĻĻāĻŋāύ āĻĒāϰāĻŋāĻŦāϰā§āϤā§āϤ āĻšā§)"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "āϞāĻŋāϏā§āĻ"
|
||||||
|
seedRandom: "āϰâā§āϝāĻžāύāĻĄāĻŽ (āϏā§āĻĄ āĻĻā§āĻŦāĻžāϰāĻž)"
|
||||||
|
_seedRandom:
|
||||||
|
arg1: "āϏā§āĻĄ"
|
||||||
|
arg2: "āϏāĻŽā§āĻāĻžāĻŦā§āϝāϤāĻž"
|
||||||
|
seedRannum: "āϰâā§āϝāĻžāύāĻĄāĻŽ āϏāĻāĻā§āϝāĻž (āϏā§āĻĄ āĻĻā§āĻŦāĻžāϰāĻž)"
|
||||||
|
_seedRannum:
|
||||||
|
arg1: "āϏā§āĻĄ"
|
||||||
|
arg2: "āύā§āϝā§āύāϤāĻŽ āĻŽāĻžāύ"
|
||||||
|
arg3: "āϏāϰā§āĻŦā§āĻā§āĻ āĻŽāĻžāύ"
|
||||||
|
seedRandomPick: "āϤāĻžāϞāĻŋāĻāĻž āĻĨā§āĻā§ āĻĻā§āĻŦāĻā§āύ āĻāϰā§āύ (āϏā§āĻĄ āĻĻā§āĻŦāĻžāϰāĻž)"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg1: "āϏā§āĻĄ"
|
||||||
|
arg2: "āϞāĻŋāϏā§āĻ"
|
||||||
|
DRPWPM: "āϏāĻŽā§āĻāĻžāĻŦā§āϝāϤāĻž āϏāĻš āĻāĻāĻāĻŋ āϤāĻžāϞāĻŋāĻāĻž āĻĨā§āĻā§ āĻāϞā§āĻŽā§āϞā§āĻāĻžāĻŦā§ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ (āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻĒā§āϰāϤāĻŋāĻĻāĻŋāύ)"
|
||||||
|
_DRPWPM:
|
||||||
|
arg1: "āϞā§āĻāĻžāϰ āϞāĻŋāϏā§āĻ"
|
||||||
|
pick: "āϤāĻžāϞāĻŋāĻāĻž āĻĨā§āĻā§ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ"
|
||||||
|
_pick:
|
||||||
|
arg1: "āϞāĻŋāϏā§āĻ"
|
||||||
|
arg2: "āĻ
āĻŦāϏā§āĻĨāĻžāύ"
|
||||||
|
listLen: "āϞāĻŋāϏā§āĻā§āϰ āĻĻā§āϰā§āĻā§āϝ āĻĒāĻžāύ"
|
||||||
|
_listLen:
|
||||||
|
arg1: "āϞāĻŋāϏā§āĻ"
|
||||||
|
number: "āϏāĻāĻā§āϝāĻž"
|
||||||
|
stringToNumber: "āĻĒāĻžāĻ ā§āϝ āĻĨā§āĻā§ āϏāĻāĻā§āϝāĻž"
|
||||||
|
_stringToNumber:
|
||||||
|
arg1: "āϞā§āĻāĻž"
|
||||||
|
numberToString: "āϏāĻāĻā§āϝāĻž āĻĨā§āĻā§ āĻĒāĻžāĻ ā§āϝ"
|
||||||
|
_numberToString:
|
||||||
|
arg1: "āϏāĻāĻā§āϝāĻž"
|
||||||
|
splitStrByLine: "āĻĒāĻžāĻ ā§āϝāĻā§ āϞāĻžāĻāύ⧠āĻŦāĻŋāĻāĻā§āϤ āĻāϰā§āύ"
|
||||||
|
_splitStrByLine:
|
||||||
|
arg1: "āϞā§āĻāĻž"
|
||||||
|
ref: "āĻāϞāĻ"
|
||||||
|
aiScriptVar: "AiScript āĻāϞāĻ"
|
||||||
|
fn: "āĻĢāĻžāĻāĻļāύ"
|
||||||
|
_fn:
|
||||||
|
slots: "āϏā§āϞāĻāĻā§āϞāĻŋ"
|
||||||
|
slots-info: "āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏā§āϞāĻāĻā§ āĻāϞāĻžāĻĻāĻž āϞāĻžāĻāύ⧠āϞāĻŋāĻā§āύ"
|
||||||
|
arg1: "āĻāĻāĻāĻĒā§āĻ"
|
||||||
|
for: "for-āϞā§āĻĒ"
|
||||||
|
_for:
|
||||||
|
arg1: "āĻāϤāĻŦāĻžāϰ āĻāϞāĻŦā§"
|
||||||
|
arg2: "āĻ
ā§āϝāĻžāĻāĻļāύ"
|
||||||
|
typeError: "āϏā§āϞāĻ {slot}, {expect} āϧāϰāύā§āϰ āĻŽāĻžāύ āĻā§āϰāĻšāĻŖ āĻāϰā§, āĻāĻŋāύā§āϤ⧠{actual} āϧāϰāύā§āϰ āĻŽāĻžāύ āĻĻā§āĻā§āĻž āĻšā§ā§āĻā§!"
|
||||||
|
thereIsEmptySlot: "āϏā§āϞāĻ {slot} āĻāĻžāϞāĻŋīŧ"
|
||||||
|
types:
|
||||||
|
string: "āϞā§āĻāĻž"
|
||||||
|
number: "āϏāĻāĻā§āϝāĻž"
|
||||||
|
boolean: "āĻĢā§āϞā§āϝāĻžāĻ"
|
||||||
|
array: "āϞāĻŋāϏā§āĻ"
|
||||||
|
stringArray: "āϞā§āĻāĻžāϰ āϞāĻŋāϏā§āĻ"
|
||||||
|
emptySlot: "āĻāĻžāϞāĻŋ āϏā§āϞāĻ"
|
||||||
|
enviromentVariables: "āĻāύāĻāĻžāĻāϰāύāĻŽā§āύā§āĻ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ"
|
||||||
|
pageVariables: "āĻĒā§āĻā§āϰ āĻāϞāĻ"
|
||||||
|
argVariables: "āĻāύāĻĒā§āĻā§āϰ āĻāĻžā§āĻāĻž"
|
||||||
_relayStatus:
|
_relayStatus:
|
||||||
requesting: "āĻ
āĻĒā§āĻā§āώāĻŽāĻžāύ"
|
requesting: "āĻ
āĻĒā§āĻā§āώāĻŽāĻžāύ"
|
||||||
accepted: "āĻ
āύā§āĻŽā§āĻĻāĻŋāϤ"
|
accepted: "āĻ
āύā§āĻŽā§āĻĻāĻŋāϤ"
|
||||||
@@ -1289,9 +1615,13 @@ _notification:
|
|||||||
youGotReply: "{name} āĻāĻĒāύāĻžāĻā§ āĻāĻŦāĻžāĻŦ āĻĻāĻŋā§ā§āĻā§"
|
youGotReply: "{name} āĻāĻĒāύāĻžāĻā§ āĻāĻŦāĻžāĻŦ āĻĻāĻŋā§ā§āĻā§"
|
||||||
youGotQuote: "{name} āĻāĻĒāύāĻžāĻā§ āĻāĻĻā§āϧā§āϤ āĻāϰā§āĻā§"
|
youGotQuote: "{name} āĻāĻĒāύāĻžāĻā§ āĻāĻĻā§āϧā§āϤ āĻāϰā§āĻā§"
|
||||||
youRenoted: "{name} āĻāϰ Renote"
|
youRenoted: "{name} āĻāϰ Renote"
|
||||||
|
youGotPoll: "{name} āĻāĻĒāύāĻžāϰ āĻĒā§āϞ⧠āĻā§āĻ āĻĻāĻŋā§ā§āĻā§"
|
||||||
|
youGotMessagingMessageFromUser: "{name} āĻāĻĒāύāĻžāĻā§ āĻŽā§āϏā§āĻ āĻāϰā§āĻā§"
|
||||||
|
youGotMessagingMessageFromGroup: "{name} āĻā§āϰā§āĻĒā§ āĻāĻāĻāĻŋ āύāϤā§āύ āĻŽā§āϏā§āĻ āĻāĻā§"
|
||||||
youWereFollowed: "āĻāĻĒāύāĻžāĻā§ āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻā§"
|
youWereFollowed: "āĻāĻĒāύāĻžāĻā§ āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻā§"
|
||||||
youReceivedFollowRequest: "āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻžāϰ āĻāύā§āϝ āĻ
āύā§āϰā§āϧ āĻĒāĻžāĻā§āĻž āĻā§āĻā§"
|
youReceivedFollowRequest: "āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻžāϰ āĻāύā§āϝ āĻ
āύā§āϰā§āϧ āĻĒāĻžāĻā§āĻž āĻā§āĻā§"
|
||||||
yourFollowRequestAccepted: "āĻāĻĒāύāĻžāϰ āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻžāϰ āĻ
āύā§āϰā§āϧ āĻā§āĻšā§āϤ āĻšā§ā§āĻā§"
|
yourFollowRequestAccepted: "āĻāĻĒāύāĻžāϰ āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻžāϰ āĻ
āύā§āϰā§āϧ āĻā§āĻšā§āϤ āĻšā§ā§āĻā§"
|
||||||
|
youWereInvitedToGroup: "āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻā§āϰā§āĻĒā§ āĻāĻŽāύā§āϤā§āϰāĻŋāϤ āĻšā§ā§āĻā§āύ"
|
||||||
pollEnded: "āĻĒā§āϞā§āϰ āĻĢāϞāĻžāĻĢāϞ āĻĻā§āĻāĻž āϝāĻžāĻŦā§"
|
pollEnded: "āĻĒā§āϞā§āϰ āĻĢāϞāĻžāĻĢāϞ āĻĻā§āĻāĻž āϝāĻžāĻŦā§"
|
||||||
emptyPushNotificationMessage: "āĻāĻĒāĻĄā§āĻ āĻāϰāĻž āĻĒā§āĻļ āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ"
|
emptyPushNotificationMessage: "āĻāĻĒāĻĄā§āĻ āĻāϰāĻž āĻĒā§āĻļ āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ"
|
||||||
_types:
|
_types:
|
||||||
@@ -1302,10 +1632,11 @@ _notification:
|
|||||||
renote: "āϰāĻŋāύā§āĻ"
|
renote: "āϰāĻŋāύā§āĻ"
|
||||||
quote: "āĻāĻĻā§āϧā§āϤāĻŋ"
|
quote: "āĻāĻĻā§āϧā§āϤāĻŋ"
|
||||||
reaction: "āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž"
|
reaction: "āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž"
|
||||||
|
pollVote: "āĻĒā§āϞ⧠āĻā§āĻ āĻāĻā§"
|
||||||
pollEnded: "āĻĒā§āϞ āĻļā§āώ"
|
pollEnded: "āĻĒā§āϞ āĻļā§āώ"
|
||||||
receiveFollowRequest: "āĻĒā§āϰāĻžāĻĒā§āϤ āĻ
āύā§āϏāϰāĻŖā§āϰ āĻ
āύā§āϰā§āϧāϏāĻŽā§āĻš"
|
receiveFollowRequest: "āĻĒā§āϰāĻžāĻĒā§āϤ āĻ
āύā§āϏāϰāĻŖā§āϰ āĻ
āύā§āϰā§āϧāϏāĻŽā§āĻš"
|
||||||
followRequestAccepted: "āĻā§āĻšā§āϤ āĻ
āύā§āϏāϰāĻŖā§āϰ āĻ
āύā§āϰā§āϧāϏāĻŽā§āĻš"
|
followRequestAccepted: "āĻā§āĻšā§āϤ āĻ
āύā§āϏāϰāĻŖā§āϰ āĻ
āύā§āϰā§āϧāϏāĻŽā§āĻš"
|
||||||
login: "āĻĒā§āϰāĻŦā§āĻļ āĻāϰā§āύ"
|
groupInvited: "āĻā§āϰā§āĻĒā§āϰ āĻāĻŽāύā§āϤā§āϰāύāϏāĻŽā§āĻš"
|
||||||
app: "āϞāĻŋāĻā§āĻ āĻāϰāĻž āĻ
ā§āϝāĻžāĻĒ āĻĨā§āĻā§ āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ"
|
app: "āϞāĻŋāĻā§āĻ āĻāϰāĻž āĻ
ā§āϝāĻžāĻĒ āĻĨā§āĻā§ āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "āĻĢāϞ⧠āĻŦā§āϝāĻžāĻ āĻāϰā§āĻā§"
|
followBack: "āĻĢāϞ⧠āĻŦā§āϝāĻžāĻ āĻāϰā§āĻā§"
|
||||||
@@ -1330,24 +1661,5 @@ _deck:
|
|||||||
tl: "āĻāĻžāĻāĻŽāϞāĻžāĻāύ"
|
tl: "āĻāĻžāĻāĻŽāϞāĻžāĻāύ"
|
||||||
antenna: "āĻ
ā§āϝāĻžāύā§āĻā§āύāĻž"
|
antenna: "āĻ
ā§āϝāĻžāύā§āĻā§āύāĻž"
|
||||||
list: "āϞāĻŋāϏā§āĻ"
|
list: "āϞāĻŋāϏā§āĻ"
|
||||||
channel: "āĻā§āϝāĻžāύā§āϞāĻā§āϞāĻŋ"
|
|
||||||
mentions: "āĻāϞā§āϞā§āĻāϏāĻŽā§āĻš"
|
mentions: "āĻāϞā§āϞā§āĻāϏāĻŽā§āĻš"
|
||||||
direct: "āĻĄāĻžāĻāϰā§āĻā§āĻ āύā§āĻāĻā§āϞāĻŋ"
|
direct: "āĻĄāĻžāĻāϰā§āĻā§āĻ āύā§āĻāĻā§āϞāĻŋ"
|
||||||
_webhookSettings:
|
|
||||||
name: "āύāĻžāĻŽ"
|
|
||||||
active: "āĻāĻžāϞā§"
|
|
||||||
_abuseReport:
|
|
||||||
_notificationRecipient:
|
|
||||||
_recipientType:
|
|
||||||
mail: "āĻāĻŽā§āĻāϞ"
|
|
||||||
_moderationLogTypes:
|
|
||||||
suspend: "āϏā§āĻĨāĻāĻŋāϤ āĻāϰāĻž"
|
|
||||||
resetPassword: "āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āϰāĻŋāϏā§āĻ āĻāϰā§āύ"
|
|
||||||
_reversi:
|
|
||||||
total: "āĻŽā§āĻ"
|
|
||||||
_remoteLookupErrors:
|
|
||||||
_noSuchObject:
|
|
||||||
title: "āĻĒāĻžāĻā§āĻž āϝāĻžā§āύāĻŋ"
|
|
||||||
_search:
|
|
||||||
searchScopeAll: "āϏāĻŦāĻā§āϞā§"
|
|
||||||
searchScopeLocal: "āϏā§āĻĨāĻžāύā§āϝāĻŧ"
|
|
||||||
|
2805
locales/ca-ES.yml
2805
locales/ca-ES.yml
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user