Resolve merge conflict

This commit is contained in:
Joel Lee committed 2021-05-03 19:40:39 +08:00
commit 94c059eed6
26 files changed
+18130 -9

No files matched your search

+6 -2
View File
@@ -1,5 +1,5 @@
<p align="center">
<img width="300" src="https://gitcdn.xyz/repo/supabase/supabase/master/web/static/supabase-light.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-with-background.svg"/>
</p>
---
@@ -75,10 +75,14 @@ Our client library is modular. Each sub-library is a standalone implementation f
## Translations
- [English](https://github.com/supabase/supabase)
- [French](https://github.com/supabase/supabase/blob/master/i18n/README.fr.md)
- [German](https://github.com/supabase/supabase/blob/master/i18n/README.de.md)
- [Japanese](https://github.com/supabase/supabase/blob/master/i18n/README.jp.md)
- [English](https://github.com/supabase/supabase)
- [Turkish](https://github.com/supabase/supabase/blob/master/i18n/README.tr.md)
- [Traditional Chinese](https://github.com/supabase/supabase/blob/master/i18n/README.zh-tw.md)
- [Spanish](https://github.com/supabase/supabase/blob/master/i18n/README.es.md)
- [Hindi](https://github.com/supabase/supabase/blob/master/i18n/README.hi.md)
- [Chinese](https://github.com/supabase/supabase/blob/master/i18n/README.cn.md)
---
+3
View File
@@ -0,0 +1,3 @@
# Update these with your Supabase details from your project settings > API
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
+34
View File
@@ -0,0 +1,34 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# local env files
.env.local
.env.development.local
.env.test.local
.env.production.local
# vercel
.vercel
+5
View File
@@ -0,0 +1,5 @@
# Example: Supabase authentication client- and server-side (API routes), and SSR with auth cookie.
This example shows how to use Supabase auth both on the client and server in both [API routes](https://nextjs.org/docs/api-routes/introduction) and when using [server side rendering (SSR)](https://nextjs.org/docs/basic-features/pages#server-side-rendering).
This example is the same as [nextjs-with-supabase-auth](https://github.com/supabase/supabase/tree/master/examples/nextjs-with-supabase-auth) however it does not use the @supabase/ui Auth component.
+209
View File
@@ -0,0 +1,209 @@
import React, { useEffect, useState } from 'react'
function Auth(props) {
const { supabaseClient, authView, setAuthView } = props
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
const [message, setMessage] = useState('')
const [error, setError] = useState('')
const [loading, setLoading] = useState(false)
const handleSignIn = async (e) => {
e.preventDefault()
setError('')
setLoading(true)
const { error: signInError } = await supabaseClient.auth.signIn({
email,
password,
})
if (signInError) setError(signInError.message)
setLoading(false)
}
const handleSignUp = async (e) => {
e.preventDefault()
setError('')
setLoading(true)
const { error: signUpError } = await supabaseClient.auth.signUp({
email,
password,
})
if (signUpError) setError(signUpError.message)
setLoading(false)
}
const handlePasswordReset = async (e) => {
e.preventDefault()
setError('')
setMessage('')
setLoading(true)
const { error } = await supabaseClient.auth.api.resetPasswordForEmail(email)
if (error) setError(error.message)
else setMessage('Check your email for the password reset link')
setLoading(false)
}
const handleMagicLinkSignIn = async (e) => {
e.preventDefault()
setError('')
setMessage('')
setLoading(true)
const { error } = await supabaseClient.auth.signIn({ email })
if (error) setError(error.message)
else setMessage('Check your email for the magic link')
setLoading(false)
}
return (
<>
{loading && <h3>Loading..</h3>}
{error && <div style={{ color: 'red' }}>{error}</div>}
{message && <div style={{ color: 'green' }}>{message}</div>}
{authView === 'sign_in' ? (
<>
<h4>Sign in</h4>
<form onSubmit={(e) => handleSignIn(e)}>
<label for="sign-in__email">Email</label>
<input
id="sign-in__email"
label="Email address"
autoComplete="email"
placeholder="Type in your email address"
defaultValue={email}
onChange={(e) => setEmail(e.target.value)}
/>
<label for="sign-in__password">Password</label>
<input
id="sign-in__password"
label="Password"
type="password"
defaultValue={password}
autoComplete="current-password"
onChange={(e) => setPassword(e.target.value)}
/>
<button type="submit">SignIn</button>
</form>
<hr />
<a onClick={() => setAuthView('sign_up')}>Don't have an account? Sign up</a>
<a onClick={() => setAuthView('forgotten_password')}>Forgot my password</a>
<hr />
<a onClick={() => setAuthView('magic_link')}>Send magic link email</a>
</>
) : authView === 'sign_up' ? (
<>
<h4>Sign up</h4>
<form onSubmit={(e) => handleSignUp(e)}>
<label for="sign-up__email">Email</label>
<input
id="sign-up__email"
label="Email address"
autoComplete="email"
placeholder="Type in your email address"
defaultValue={email}
onChange={(e) => setEmail(e.target.value)}
/>
<label for="sign-up__password">Password</label>
<input
id="sign-up__password"
label="Password"
type="password"
defaultValue={password}
autoComplete="current-password"
onChange={(e) => setPassword(e.target.value)}
/>
<button type="submit">SignUp</button>
</form>
<hr />
<a onClick={() => setAuthView('sign_in')}>Already have an account, Sign in</a>
<a onClick={() => setAuthView('forgotten_password')}>Forgot my password</a>
<hr />
<a onClick={() => setAuthView('magic_link')}>Send magic link email</a>
</>
) : authView === 'forgotten_password' ? (
<>
<h4>Forgotten password</h4>
<form onSubmit={handlePasswordReset}>
<label for="forgotten_password__email">Email</label>
<input
id="forgotten_password__email"
label="Email address"
autoComplete="email"
placeholder="Type in your email address"
defaultValue={email}
onChange={(e) => setEmail(e.target.value)}
/>
<button type="submit">Send reset password instructions</button>
</form>
<hr />
<a onClick={() => setAuthView('sign_up')}>Don't have an account? Sign up</a>
<a onClick={() => setAuthView('sign_in')}>Already have an account, Sign in</a>
<hr />
<a onClick={() => setAuthView('magic_link')}>Send magic link email</a>
</>
) : authView === 'magic_link' ? (
<>
<h4>Magic link</h4>
<form onSubmit={handleMagicLinkSignIn}>
<input
label="Email address"
autoComplete="email"
placeholder="Type in your email address"
defaultValue={email}
onChange={(e) => setEmail(e.target.value)}
/>
<button type="submit">Send magic link</button>
</form>
<hr />
<a onClick={() => setAuthView('sign_up')}>Don't have an account? Sign up</a>
<a onClick={() => setAuthView('sign_in')}>Already have an account, Sign in</a>
</>
) : null}
</>
)
}
function UpdatePassword({ supabaseClient }) {
const [password, setPassword] = useState('')
const [error, setError] = useState('')
const [message, setMessage] = useState('')
const [loading, setLoading] = useState(false)
const handlePasswordReset = async (e) => {
e.preventDefault()
setError('')
setMessage('')
setLoading(true)
const { error } = await supabaseClient.auth.update({ password })
if (error) setError(error.message)
else setMessage('Your password has been updated')
setLoading(false)
}
return (
<>
{loading && <h3>Loading..</h3>}
{error && <div style={{ color: 'red' }}>{error}</div>}
{message && <div style={{ color: 'green' }}>{message}</div>}
<h4>Set a new password</h4>
<form onSubmit={handlePasswordReset}>
<input
label="New password"
placeholder="Enter your new password"
type="password"
onChange={(e) => setPassword(e.target.value)}
/>
<button block size="large" htmlType="submit">
Update password
</button>
</form>
</>
)
}
Auth.UpdatePassword = UpdatePassword
export default Auth
+39
View File
@@ -0,0 +1,39 @@
import React, { useEffect, useState, createContext, useContext } from 'react'
import { SupabaseClient, Session, User } from '@supabase/supabase-js'
const UserContext = createContext({ user: null, session: null })
export const UserContextProvider = (props) => {
const { supabaseClient } = props
const [session, setSession] = useState(null)
const [user, setUser] = useState(null)
useEffect(() => {
const session = supabaseClient.auth.session()
setSession(session)
setUser(session?.user ?? null)
const { data: authListener } = supabaseClient.auth.onAuthStateChange(async (event, session) => {
setSession(session)
setUser(session?.user ?? null)
})
return () => {
authListener.unsubscribe()
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
const value = {
session,
user,
}
return <UserContext.Provider value={value} {...props} />
}
export const useUser = () => {
const context = useContext(UserContext)
if (context === undefined) {
throw new Error(`useUser must be used within a UserContextProvider.`)
}
return context
}
File diff suppressed because it is too large. Load diff
+17
View File
@@ -0,0 +1,17 @@
{
"name": "with-supabase-auth",
"version": "1.0.0",
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
},
"dependencies": {
"@supabase/supabase-js": "^1.2.1",
"next": "latest",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"swr": "0.2.3"
},
"license": "MIT"
}
+13
View File
@@ -0,0 +1,13 @@
import { UserContextProvider } from '../lib/UserContext'
import { supabase } from '../utils/initSupabase'
import './../style.css'
export default function MyApp({ Component, pageProps }) {
return (
<main>
<UserContextProvider supabaseClient={supabase}>
<Component {...pageProps} />
</UserContextProvider>
</main>
)
}
+8
View File
@@ -0,0 +1,8 @@
/**
* NOTE: this file is only needed if you're doing SSR (getServerSideProps)!
*/
import { supabase } from '../../utils/initSupabase'
export default function handler(req, res) {
supabase.auth.api.setAuthCookie(req, res)
}
+13
View File
@@ -0,0 +1,13 @@
import { supabase } from '../../utils/initSupabase'
// Example of how to verify and get user data server-side.
const getUser = async (req, res) => {
const token = req.headers.token
const { data: user, error } = await supabase.auth.api.getUser(token)
if (error) return res.status(401).json({ error: error.message })
return res.status(200).json(user)
}
export default getUser
+95
View File
@@ -0,0 +1,95 @@
import Link from 'next/link'
import useSWR from 'swr'
import { supabase } from '../utils/initSupabase'
import { useEffect, useState } from 'react'
import Auth from './../components/Auth'
import { useUser } from '../lib/UserContext'
const fetcher = (url, token) =>
fetch(url, {
method: 'GET',
headers: new Headers({ 'Content-Type': 'application/json', token }),
credentials: 'same-origin',
}).then((res) => res.json())
const Index = () => {
const { user, session } = useUser()
const { data, error } = useSWR(session ? ['/api/getUser', session.access_token] : null, fetcher)
const [authView, setAuthView] = useState('sign_in')
useEffect(() => {
const { data: authListener } = supabase.auth.onAuthStateChange((event, session) => {
if (event === 'PASSWORD_RECOVERY') setAuthView('update_password')
if (event === 'USER_UPDATED') setTimeout(() => setAuthView('sign_in'), 1000)
// Send session to /api/auth route to set the auth cookie.
// NOTE: this is only needed if you're doing SSR (getServerSideProps)!
fetch('/api/auth', {
method: 'POST',
headers: new Headers({ 'Content-Type': 'application/json' }),
credentials: 'same-origin',
body: JSON.stringify({ event, session }),
}).then((res) => res.json())
})
return () => {
authListener.unsubscribe()
}
}, [])
const View = () => {
if (!user)
return (
<>
<div>
<img src="https://app.supabase.io/img/supabase-dark.svg" width="96" />
<h2>
Supabase Auth <br />
with NextJS SSR
</h2>
</div>
<Auth supabaseClient={supabase} authView={authView} setAuthView={setAuthView} />
</>
)
return (
<>
{authView === 'update_password' && <Auth.UpdatePassword supabaseClient={supabase} />}
{user && (
<>
<h4>You're signed in</h4>
<h5>Email: {user.email}</h5>
<button type="outline" onClick={() => supabase.auth.signOut()}>
Log out
</button>
<hr />
{error && <div style={{ color: 'red' }}>Failed to fetch user!</div>}
{data && !error ? (
<>
<div style={{ color: 'green' }}>
User data retrieved server-side (in API route):
</div>
<pre>{JSON.stringify(data, null, 2)}</pre>
</>
) : (
<div>Loading...</div>
)}
<Link href="/profile">
<a>SSR example with getServerSideProps</a>
</Link>
</>
)}
</>
)
}
return (
<div style={{ maxWidth: '520px', margin: '96px auto' }}>
<View />
</div>
)
}
export default Index
+37
View File
@@ -0,0 +1,37 @@
import Link from 'next/link'
import { supabase } from '../utils/initSupabase'
export default function Profile({ user }) {
return (
<div style={{ maxWidth: '520px', margin: '96px auto' }}>
<h4>You're signed in</h4>
<h5>Email: {user.email}</h5>
<hr />
<div style={{ color: 'green' }}>
User data retrieved server-side (from Cookie in getServerSideProps):
</div>
<div>
<pre>{JSON.stringify(user, null, 2)}</pre>
</div>
<div>
<Link href="/">
<a>Static example with useSWR</a>
</Link>
</div>
</div>
)
}
export async function getServerSideProps({ req }) {
const { user } = await supabase.auth.api.getUserByCookie(req)
if (!user) {
// If no user, redirect to index.
return { props: {}, redirect: { destination: '/', permanent: false } }
}
// If there is a user, return it.
return { props: { user } }
}
+29
View File
@@ -0,0 +1,29 @@
body {
font-family: Helvetica, Arial, Sans-Serif;
}
a {
display: block;
margin-bottom: 8px;
cursor: pointer;
text-decoration: underline;
}
input {
display: block;
width: 320px;
font-size: 16px;
padding: 8px;
margin-bottom: 16px;
}
button {
margin-bottom: 32px;
cursor: pointer;
}
pre {
background: black;
color: white;
padding: 16px;
}
@@ -0,0 +1,6 @@
import { createClient } from '@supabase/supabase-js'
export const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY
)
File diff suppressed because it is too large. Load diff
+3 -3
View File
@@ -29,9 +29,9 @@ Github Issues: 适用于: 报告使用 Supabase 时遇到的问题。
## 发展现状
- [x] Alpha: 我们正在对有限的一批客户进行 Supabase 测试
- [x] Public Alpha: 任何人都可以在[app.supabase.io](https://app.supabase.io)上进行注册。
- [x] Public Beta: 稳定,可以支持大多数非企业用例
- [ ] Public: 生产就绪软件
- [x] 公开 Alpha: 任何人都可以在[app.supabase.io](https://app.supabase.io)上进行注册。
- [x] 公开 Beta: 稳定,可以支持大多数非企业用例
- [ ] 公开: 生产就绪软件
我们目前处于公开测试阶段。访问这个存储库的发布页面以获得关于主要更新的通知。
+1 -1
View File
@@ -1,5 +1,5 @@
<p align="center">
<img width="300" src="https://gitcdn.xyz/repo/supabase/supabase/master/web/static/supabase-light.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-with-background.svg"/>
</p>
---
+88
View File
@@ -0,0 +1,88 @@
<p align="center">
<img width="300" src="https://gitcdn.xyz/repo/supabase/supabase/master/web/static/supabase-light.svg"/>
</p>
---
# Supabase
[Supabase](https://supabase.io) es una alternativa de código abierto a Firebase. Estamos construyendo las funcionalidades de Firebase usando herramientas de código abierto de nivel empresarial.
- [x] Alojamiento de base de datos Postgres
- [x] Suscripciones en tiempo real
- [x] Autenticación y autorización
- [x] API autogenerada
- [x] Panel de control
- [x] Almacenamiento
- [ ] Funciones (próximamente)
## Documentación
Para ver la documentación completa, visita [supabase.io/docs](https://supabase.io/docs).
## Comunidad y soporte
- [Foro de la comunidad](https://github.com/supabase/supabase/discussions). Mejor para: ayuda construyendo, discusiones acerca de las mejores practicas de base de datos.
- [GitHub Issues](https://github.com/supabase/supabase/issues). Mejor para: bugs y errores que te puedes encontrar utilizando Supabase.
- [Soporte por e-mail](https://supabase.io/docs/support#business-support). Mejor para: problemas con la base de datos o infraestructura.
## Estatus
- [x] Alfa: Estamos probando Supabase con un círculo cerrado de clientes.
- [x] Alfa pública: Cualquiera puede registrarse en [app.supabase.io](https://app.supabase.io). Pero sé flexible con nosotros, aún pueden existir obstáculos.
- [x] Beta pública: Suficientemente estable para la mayoría de los casos no empresariales.
- [ ] Público: Listo para producción.
Actualmente estamos en la fase de beta pública. Puedes suscribirte a los "releases" de este repositorio para mantenerte notificado de actualizaciones mayores.
<kbd><img src="https://gitcdn.link/repo/supabase/supabase/master/web/static/watch-repo.gif" alt="Seguir este repositorio"/></kbd>
---
## Cómo funciona
Supabase es una combinación de herramientas de código abierto. Estamos construyendo las funcionalidades de Firebase utilizando soluciones de código abierto de nivel empresarial. Si las herramientas y comunidades existen con una licencia abierta MIT, Apache 2 o equivalente, usaremos y apoyaremos tal herramienta. Si la herramienta no existe, la desarrollaremos y la lanzaremos como herramienta de código abierto nosotros mismos. Supabase no es un mapeo 1-1 de Firebase. Nuestro objetivo es dar a los desarrolladores una experiencia parecida a la de Firebase utilizando herramientas de código abierto.
**Arquitectura actual**
Supabase es una [plataforma alojada](https://app.supabase.io). Te puedes registrar y comenzar a utilizar Supabase sin instalar nada. Aún estamos creando la experiencia de desarrollo local - actualmente es en lo que nos estamos enfocando, junto con la estabilidad de la plataforma.
![Arquitectura](https://supabase.io/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png)
- [PostgreSQL](https://www.postgresql.org/) es un sistema de base de datos objeto-relacional con más de 30 años de desarrollo activo que se ha ganado su fuerte reputación por ser confiable, robusto y de alto rendimiento.
- [Tiempo Real](https://github.com/supabase/realtime) es un server construido en Elixir que permite escuchar a los _inserts_, _updates_ y _deletes_ de PostgreSQL utilizando websockets. Supabase escucha a la funcionalidad de replicación integrada de PostgreSQL, convierte el bite de replicación en un JSON, despues transmite el JSON a través de websockets.
- [PostgREST](http://postgrest.org/) es un servidor web que convierte la base de datos PostgreSQL directamente en una API RESTful.
- [Almacenamiento](https://github.com/supabase/storage-api) proporciona una interfaz RESTful para manipular los archivos alojados en S3, utilizando Postgres para manejar los permisos.
- [postgres-meta](https://github.com/supabase/postgres-meta) es una API RESTful para manejar Postgres, permite obtener información de tablas, agregar roles, ejecutar consultas, etc.
- [GoTrue](https://github.com/netlify/gotrue) es una API basada en SWT para administrar usuarios y distribuir tokens SWT.
- [Kong](https://github.com/Kong/kong) es un API gateway nativo alojado en la nube.
#### Librerías de cliente
Nuestra librería de cliente es modular. Cada sub-librería es una implementación independiente para cada sistema externo. Esta es una de las formas de apoyar las herramientas existentes.
- **`supabase-{lang}`**: Combina librerías y agrega mejoras.
- `postgrest-{lang}`: Librería de cliente para trabajar con [PostgREST](https://github.com/postgrest/postgrest)
- `realtime-{lang}`: Librería de cliente para trabajar con [Realtime](https://github.com/supabase/realtime)
- `gotrue-{lang}`: Librería de cliente para trabajar con [GoTrue](https://github.com/netlify/gotrue)
| Repo | Oficial | Comunidad |
| --------------------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`supabase-{lang}`** | [`JS`](https://github.com/supabase/supabase-js) | [`C#`](https://github.com/supabase/supabase-csharp) \| [`Dart`](https://github.com/supabase/supabase-dart) \| [`Python`](https://github.com/supabase/supabase-py) \| `Rust` |
| `postgrest-{lang}` | [`JS`](https://github.com/supabase/postgrest-js) | [`C#`](https://github.com/supabase/postgrest-csharp) \| [`Dart`](https://github.com/supabase/postgrest-dart) \| [`Python`](https://github.com/supabase/postgrest-py) \| [`Rust`](https://github.com/supabase/postgrest-rs) |
| `realtime-{lang}` | [`JS`](https://github.com/supabase/realtime-js) | [`C#`](https://github.com/supabase/realtime-csharp) \| [`Dart`](https://github.com/supabase/realtime-dart) \| [`Python`](https://github.com/supabase/realtime-py) \| `Rust` |
| `gotrue-{lang}` | [`JS`](https://github.com/supabase/gotrue-js) | [`C#`](https://github.com/supabase/gotrue-csharp) \| [`Dart`](https://github.com/supabase/gotrue-dart) \| [`Python`](https://github.com/supabase/gotrue-py) \| `Rust` |
## Traducciones
- [Alemán](https://github.com/supabase/supabase/blob/master/i18n/README.de.md)
- [Japonés](https://github.com/supabase/supabase/blob/master/i18n/README.jp.md)
- [Inglés](https://github.com/supabase/supabase)
- [Turco](https://github.com/supabase/supabase/blob/master/i18n/README.tr.md)
- [Español](https://github.com/supabase/supabase/blob/master/i18n/README.es.md)
---
## Patrocinadores
[![Nuevo Patrocinador](https://user-images.githubusercontent.com/10214025/90518111-e74bbb00-e198-11ea-8f88-c9e3c1aa4b5b.png)](https://github.com/sponsors/supabase)
+87
View File
@@ -0,0 +1,87 @@
<p align="center">
<img width="300" src="https://gitcdn.xyz/repo/supabase/supabase/master/web/static/supabase-light.svg"/>
</p>
---
# Supabase
[Supabase](https://supabase.io) est une alternative open source à Firebase. Nous développons les fonctionnalités de Firebase en utilisant des outils open source de qualité professionnelle.
- [x] Base de données Postgres hébergée
- [x] Abonnements en temps réel
- [x] Authentification et autorisation
- [x] API générées automatiquement
- [x] Tableau de bord
- [x] Stockage
- [ ] Fonctions (à venir)
## Documentation
Pour une documentation complète, visitez [supabase.io/docs](https://supabase.io/docs)
## Communauté et Support
- [Forum communautaire](https://github.com/supabase/supabase/discussions). Idéal pour : aide à la construction, discussion sur les meilleures pratiques en matière de bases de données.
- [GitHub Issues](https://github.com/supabase/supabase/issues). Idéal pour : les bugs et les erreurs que vous rencontrez en utilisant Supabase.
- [Support par e-mail](https://supabase.io/docs/support#business-support). Idéal pour : les problèmes avec votre base de données ou votre infrastructure.
## Statut
- [x] Alpha : Nous testons Supabase avec un groupe fermé de clients.
- [X] Alpha publique : Tout le monde peut s'inscrire sur [app.supabase.io]((https://app.supabase.io)). Mais allez-y doucement, il y a quelques problèmes.
- [x] Bêta publique : Assez stable pour la plupart des cas d'utilisation hors entreprise
- [ ] Public : Prêt pour la production
Nous sommes actuellement en version bêta publique. Surveillez les "releases" de ce repo pour être informé des mises à jour majeures.
<kbd><img src="https://gitcdn.link/repo/supabase/supabase/master/web/static/watch-repo.gif" alt="Watch this repo"/></kbd>
---
## Comment ça marche
Supabase est une combinaison d'outils open source. Nous développons les fonctionnalités de Firebase en utilisant des produits open source de qualité professionnelle. Si les outils et les communautés existent, avec une licence ouverte MIT, Apache 2 ou équivalente, nous utiliserons et soutiendrons cet outil. Si l'outil n'existe pas, nous le construisons et l'exploitons nous-mêmes. Supabase n'est pas une correspondance 1 à 1 de Firebase. Notre objectif est de donner aux développeurs une expérience similaire à celle de Firebase en utilisant des outils open source.
**Architecture actuelle**
Supabase est une [plateforme hébergée](https://app.supabase.io). Vous pouvez vous inscrire et commencer à utiliser Supabase sans rien installer. Nous sommes toujours en train de créer l'expérience de développement local - c'est maintenant notre objectif principal, ainsi que la stabilité de la plateforme.
![Architecture](https://supabase.io/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png)
- [PostgreSQL](https://www.postgresql.org/) est un système de base de données relationnel-objet dont le développement actif depuis plus de 30 ans lui a valu une solide réputation de fiabilité, de robustesse des fonctionnalités et de performance.
- [Realtime](https://github.com/supabase/realtime) est un serveur Elixir qui vous permet d'écouter les insertions, mises à jour et suppressions PostgreSQL à l'aide de websockets. Supabase écoute la fonctionnalité de réplication intégrée de Postgres, convertit le flux d'octets de réplication en JSON, puis diffuse le JSON sur des websockets.
- [PostgREST](http://postgrest.org/) est un serveur web qui transforme votre base de données PostgreSQL en une API RESTful.
- [Storage](https://github.com/supabase/storage-api) fournit une interface RESTful pour gérer les fichiers stockés dans S3, en utilisant Postgres pour gérer les permissions.
- [postgres-meta](https://github.com/supabase/postgres-meta) est une API RESTful pour la gestion de votre Postgres, qui vous permet d'extraire des tables, d'ajouter des rôles, d'exécuter des requêtes, etc.
- [GoTrue](https://github.com/netlify/gotrue) est une API basée sur SWT pour gérer les utilisateurs et émettre des jetons SWT.
- [Kong](https://github.com/Kong/kong) est une passerelle API native cloud.
#### Bibliothèques clients
Notre bibliothèque client est modulaire. Chaque sous-bibliothèque est une implémentation autonome pour un seul système externe. C'est l'une des façons dont nous soutenons les outils existants.
- **`supabase-{lang}`**: Combine les bibliothèques et ajoute des enrichissements.
- `postgrest-{lang}`: Bibliothèque client pour travailler avec [PostgREST](https://github.com/postgrest/postgrest)
- `realtime-{lang}`: Bibliothèque client pour travailler avec [Realtime](https://github.com/supabase/realtime)
- `gotrue-{lang}`: Bibliothèque client pour travailler avec [GoTrue](https://github.com/netlify/gotrue)
| Repo | Officiel | Communauté |
| --------------------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`supabase-{lang}`** | [`JS`](https://github.com/supabase/supabase-js) | [`C#`](https://github.com/supabase/supabase-csharp) \| [`Dart`](https://github.com/supabase/supabase-dart) \| [`Python`](https://github.com/supabase/supabase-py) \| `Rust` |
| `postgrest-{lang}` | [`JS`](https://github.com/supabase/postgrest-js) | [`C#`](https://github.com/supabase/postgrest-csharp) \| [`Dart`](https://github.com/supabase/postgrest-dart) \| [`Python`](https://github.com/supabase/postgrest-py) \| [`Rust`](https://github.com/supabase/postgrest-rs) |
| `realtime-{lang}` | [`JS`](https://github.com/supabase/realtime-js) | [`C#`](https://github.com/supabase/realtime-csharp) \| [`Dart`](https://github.com/supabase/realtime-dart) \| [`Python`](https://github.com/supabase/realtime-py) \| `Rust` |
| `gotrue-{lang}` | [`JS`](https://github.com/supabase/gotrue-js) | [`C#`](https://github.com/supabase/gotrue-csharp) \| [`Dart`](https://github.com/supabase/gotrue-dart) \| [`Python`](https://github.com/supabase/gotrue-py) \| `Rust` |
## Traductions
- [Allemand](https://github.com/supabase/supabase/blob/master/i18n/README.de.md)
- [Japonais](https://github.com/supabase/supabase/blob/master/i18n/README.jp.md)
- [Anglais](https://github.com/supabase/supabase)
- [Turque](https://github.com/supabase/supabase/blob/master/i18n/README.tr.md)
---
## Sponsors
[![New Sponsor](https://user-images.githubusercontent.com/10214025/90518111-e74bbb00-e198-11ea-8f88-c9e3c1aa4b5b.png)](https://github.com/sponsors/supabase)
+89
View File
@@ -0,0 +1,89 @@
<p align="center">
<img width="300" src="https://gitcdn.xyz/repo/supabase/supabase/master/web/static/supabase-light.svg"/>
</p>
---
# Supabase
[सुपबेस](https://supabase.io) एक खुला स्रोत फायरबेस विकल्प है। हम एंटरप्राइज़-ग्रेड ओपन सोर्स टूल का उपयोग करके फायरबेस की सुविधाओं का निर्माण कर रहे हैं।
- [x] होस्टेड पोस्टग्रेज डेटाबेस
- [x] रीयलटाइम सदस्यता
- [x] सत्यापन और प्राधिकरण
- [x] स्वतः जनरेट किए गए API
- [x] डैशबोर्ड
- [x] भंडारण
- [ ] कार्यों (जल्द आ रहा है)
## प्रलेखन
पूर्ण प्रलेखन के लिए, [supabase.io/docs](https://supabase.io/docs) पर जाएँ
## सामुदायिक तथा सहयोग
- [सामुदायिक मंच](https://github.com/supabase/supabase/discussions). सर्वोत्कृष्ट: निर्माण करने में मदद, डेटाबेस सर्वोत्तम प्रथाओं के बारे में चर्चा।
- [गिटहब मुद्दे](https://github.com/supabase/supabase/issues). सर्वोत्कृष्ट: दोष और त्रुटियां जो आप का सामना कर रहे हैं Supabase।
- [ई-मेल समर्थन](https://supabase.io/docs/support#business-support). सर्वोत्कृष्ट: आपके डेटाबेस या आधारिक संरचना के साथ समस्याएं।
## स्थिति
- [x] अल्फा: हम चुनिंदा ग्राहकों के साथ सुपरबास का परीक्षण कर रहे हैं
- [x] सार्वजनिक अल्फा: कोई भी [app.supabase.io](https://app.supabase.io) के जरिए शामिल हो सकता है। लेकिन हम पर आसान हो जाओ, कुछ मोड़ हैं।
- [x] सार्वजनिक बीटा: अधिकांश गैर-एंटरप्राइज़ उपयोग-मामलों के लिए पर्याप्त स्थिर
- [ ] सार्वजनिक: उत्पादन-तैयार
हम इस समय सार्वजनिक बीटा में हैं। प्रमुख अद्यतन की सूचना पाने के लिए इस रेपो का "रिलीज़" देखें।
<kbd><img src="https://gitcdn.link/repo/supabase/supabase/master/web/static/watch-repo.gif" alt="इस रेपो को देखें"/></kbd>
---
## यह किस प्रकार काम करता है
सुपबेस ओपन सोर्स टूल्स का एक संयोजन है। हम एंटरप्राइज़-ग्रेड, ओपन सोर्स उत्पादों का उपयोग करके फायरबेस की सुविधाओं का निर्माण कर रहे हैं। यदि उपकरण और समुदाय मौजूद हैं, तो MIT, Apache 2 या समकक्ष ओपन लाइसेंस के साथ, हम उस टूल का उपयोग और समर्थन करेंगे। यदि उपकरण मौजूद नहीं है, तो हम इसे स्वयं बनाते हैं और स्रोत खोलते हैं। सुपबेस फायरबेस की 1 से 1 मैपिंग नहीं है। हमारा उद्देश्य डेवलपर्स को ओपन सोर्स टूल्स का उपयोग करके फायरबेस जैसा डेवलपर अनुभव देना है।
**वर्तमान वास्तुकला**
सुपबेस [होस्टेड प्लेटफार्म](https://app.supabase.io). आप साइन अप कर सकते हैं और कुछ भी स्थापित किए बिना सुपबेस का उपयोग करना शुरू कर सकते हैं। हम अभी भी स्थानीय विकास का अनुभव पैदा कर रहे हैं - यह अब मंच स्थिरता के साथ-साथ हमारा मुख्य फोकस है।
![आर्किटेक्चर](https://supabase.io/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png)
- [PostgreSQL](https://www.postgresql.org/) 30 से अधिक वर्षों के सक्रिय विकास के साथ एक वस्तु-संबंधपरक डेटाबेस प्रणाली है जिसने इसे विश्वसनीयता, सुविधा मजबूती और प्रदर्शन के लिए एक मजबूत प्रतिष्ठा अर्जित की है।
- [Realtime](https://github.com/supabase/realtime) एक एलिक्जिर सर्वर है जो आपको पोस्टग्रॉसीक्यूएल आवेषण, अपडेट्स को सुनने की अनुमति देता है और वेबसोकेट का उपयोग करके हटाता है। सुपबेस पोस्टग्रेज की अंतर्निहित प्रतिकृति कार्यक्षमता को सुनता है, प्रतिकृति बाइट स्ट्रीम को JSON में परिवर्तित करता है, फिर JSON को वेबस्कॉक पर प्रसारित करता है।
- [PostgREST](http://postgrest.org/) एक वेब सर्वर है जो आपके पोस्टग्रेससीक्यूएल डेटाबेस को सीधे RESTful एपीआई में बदल देता है
- [Storage](https://github.com/supabase/storage-api) अनुमतियाँ प्रबंधित करने के लिए पोस्टग्रेस का उपयोग करके S3 में संग्रहीत फ़ाइलों के प्रबंधन के लिए एक RESTful इंटरफ़ेस प्रदान करता है।
- [postgres-meta](https://github.com/supabase/postgres-meta) आपके पोस्टग्रेज के प्रबंधन के लिए एक RESTful एपीआई है, जिससे आप टेबल प्राप्त कर सकते हैं, भूमिकाएँ जोड़ सकते हैं और क्वेरीज़ आदि चला सकते हैं।
- [GoTrue](https://github.com/netlify/gotrue) उपयोगकर्ताओं को प्रबंधित करने और SWT टोकन जारी करने के लिए एक SWT आधारित एपीआई है।
- [Kong](https://github.com/Kong/kong) एक क्लाउड-नेटिव एपीआई गेटवे है।
#### ग्राहक पुस्तकालय
हमारे ग्राहक पुस्तकालय मॉड्यूलर है। प्रत्येक उप-पुस्तकालय एकल बाह्य प्रणाली के लिए एक स्टैंडअलोन कार्यान्वयन है। यह उन तरीकों में से एक है जो हम मौजूदा उपकरणों का समर्थन करते हैं।
- **`supabase-{lang}`**: पुस्तकालयों को जोड़ता है और संवर्धन को जोड़ता है।
- `postgrest-{lang}`: ग्राहक पुस्तकालय के साथ काम करने के लिए [PostgREST](https://github.com/postgrest/postgrest)
- `realtime-{lang}`: ग्राहक पुस्तकालय के साथ काम करने के लिए [Realtime](https://github.com/supabase/realtime)
- `gotrue-{lang}`: ग्राहक पुस्तकालय के साथ काम करने के लिए [GoTrue](https://github.com/netlify/gotrue)
| Repo | आधिकारिक | समुदाय |
| --------------------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`supabase-{lang}`** | [`JS`](https://github.com/supabase/supabase-js) | [`C#`](https://github.com/supabase/supabase-csharp) \| [`Dart`](https://github.com/supabase/supabase-dart) \| [`Python`](https://github.com/supabase/supabase-py) \| `Rust` |
| `postgrest-{lang}` | [`JS`](https://github.com/supabase/postgrest-js) | [`C#`](https://github.com/supabase/postgrest-csharp) \| [`Dart`](https://github.com/supabase/postgrest-dart) \| [`Python`](https://github.com/supabase/postgrest-py) \| [`Rust`](https://github.com/supabase/postgrest-rs) |
| `realtime-{lang}` | [`JS`](https://github.com/supabase/realtime-js) | [`C#`](https://github.com/supabase/realtime-csharp) \| [`Dart`](https://github.com/supabase/realtime-dart) \| [`Python`](https://github.com/supabase/realtime-py) \| `Rust` |
| `gotrue-{lang}` | [`JS`](https://github.com/supabase/gotrue-js) | [`C#`](https://github.com/supabase/gotrue-csharp) \| [`Dart`](https://github.com/supabase/gotrue-dart) \| [`Python`](https://github.com/supabase/gotrue-py) \| `Rust` |
## अनुवाद
- [जर्मन](https://github.com/supabase/supabase/blob/master/i18n/README.de.md)
- [जापानी](https://github.com/supabase/supabase/blob/master/i18n/README.jp.md)
- [अंग्रेज़ी](https://github.com/supabase/supabase)
- [तुर्की](https://github.com/supabase/supabase/blob/master/i18n/README.tr.md)
- [परंपरागत चीनी](https://github.com/supabase/supabase/blob/master/i18n/README.zh-tw.md)
- [फ्रेंच](https://github.com/supabase/supabase/blob/master/i18n/README.fr.md)
- [स्पेनिश](https://github.com/supabase/supabase/blob/master/i18n/README.es.md)
---
## प्रायोजकों
[![नया प्रायोजक](https://user-images.githubusercontent.com/10214025/90518111-e74bbb00-e198-11ea-8f88-c9e3c1aa4b5b.png)](https://github.com/sponsors/supabase)
+8 -1
View File
@@ -1,5 +1,5 @@
<p align="center">
<img width="300" src="https://gitcdn.xyz/repo/supabase/supabase/master/web/static/supabase-light.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-with-background.svg"/>
</p>
---
@@ -74,6 +74,13 @@ Supabaseクライアント・ライブラリはモジュール化されていま
| `realtime-{lang}` | [`JS`](https://github.com/supabase/realtime-js) | [`C#`](https://github.com/supabase/realtime-csharp) \| [`Dart`](https://github.com/supabase/realtime-dart) \| [`Python`](https://github.com/supabase/realtime-py) \| `Rust` |
| `gotrue-{lang}` | [`JS`](https://github.com/supabase/gotrue-js) | [`C#`](https://github.com/supabase/gotrue-csharp) \| [`Dart`](https://github.com/supabase/gotrue-dart) \| [`Python`](https://github.com/supabase/gotrue-py) \| `Rust` |
## 翻訳
- [ドイツ語](https://github.com/supabase/supabase/blob/master/i18n/README.de.md)
- [日本語](https://github.com/supabase/supabase/blob/master/i18n/README.jp.md)
- [英語](https://github.com/supabase/supabase)
- [トルコ語](https://github.com/supabase/supabase/blob/master/i18n/README.tr.md)
---
## スポンサー
+1 -1
View File
@@ -1,5 +1,5 @@
<p align="center">
<img width="300" src="https://gitcdn.xyz/repo/supabase/supabase/master/web/static/supabase-light.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-with-background.svg"/>
</p>
---
+80
View File
@@ -0,0 +1,80 @@
<p align="center">
<img width="300" src="https://gitcdn.xyz/repo/supabase/supabase/master/web/static/supabase-light.svg"/>
</p>
---
# Supabase
[Supabase](https://supabase.io) 是 Firebase 的開放原始碼替代方案。我們以企業等級的開放原始碼工具,打造 Firebase 的功能。
- [x] Postgres 資料庫託管
- [x] 即時訂閱
- [x] 認證與授權
- [x] 自動產生的 API
- [x] 儀表版
- [x] Storage
- [ ] Functions(即將推出)
## 說明文件
完整的說明文件請見:[supabase.io/docs](https://supabase.io/docs)
## 社群與支援
- [社群論壇](https://github.com/supabase/supabase/discussions)。適合:打造、討論資料庫最佳作法的協助。
- [GitHub Issues](https://github.com/supabase/supabase/issues)。適合:在使用 Supabase 的時候遇到臭蟲和錯誤。
- [電子郵件支援](https://supabase.io/docs/support#business-support)。適合:資料庫或基礎建設遇到的問題。
## 狀態
- [x] Alpha:與少部分特定客戶測試 Supabase。
- [x] 公開 Alpha:任何人都可以在 [app.supabase.io](https://app.supabase.io) 報名。只是務必手下留情,還有一些糾結的地方。
- [x] 公開 Beta:已能夠穩定在大多數非企業情境使用
- [ ] 公開:可以在正式環境使用
我們現在是公開 Beta。追蹤 "Releases" 就可以收到此 Repo 的主要更新通知。
<kbd><img src="https://gitcdn.link/repo/supabase/supabase/master/web/static/watch-repo.gif" alt="Watch this repo"/></kbd>
---
## 運作方法
Supabase 是一套開放原始碼工具的組合包。我們以企業等級的開放原始碼產品,打造 Firebase 的功能。如果是既有的工具和社群,且具有 MIT、Apache 2 或相等的開放授權,就會採用並支援該工具。如果是不存在的工具,則自行打造並開放原始碼。Supabase 並非 1-1 對應 Firebase 功能。我們的目標是讓開發者以開放原始碼工具,獲得類似 Firebase 的開發體驗。
**目前架構**
Supabase 是[託管平台](https://app.supabase.io)。只要註冊,不必安裝任何東西,就可以開始使用 Supabase。目前還在打造本地端開發體驗:連同平台的穩定度,這是我們專注的核心。
![架構](https://supabase.io/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png)
- [PostgreSQL](https://www.postgresql.org/) 是經歷 30 年活躍開發的關聯物件資料庫系統,因此擁有可靠度、功能細緻度與效能著稱。
- [Realtime](https://github.com/supabase/realtime) 是利用 Websocket 監聽 PostgreSQL 的 insert、update 和 delete 的 Elixir 伺服器。Supabase 監聽 Postgres 內建的複寫 (Replication) 功能,將複寫的 byte stream 轉換為 JSON 格式,接著透過 Websocket 將 JSON 進行廣播。
- [PostgREST](http://postgrest.org/) 是直接把 PostgreSQL 轉變成 RESTful API 的網頁伺服器
- [Storage](https://github.com/supabase/storage-api) 提供管理放置在 S3 檔案的 RESTful 介面,使用 Postgres 管理權限。
- [postgres-meta](https://github.com/supabase/postgres-meta) 是管理 Postgres 的 RESTful API,可以 fetch 資料表、新增角色以及執行查詢…等。
- [GoTrue](https://github.com/netlify/gotrue) 是基於 SWT 的 API,用來管理使用者,以及發送 SWT token。
- [Kong](https://github.com/Kong/kong) 是雲端原生的 API Gateway。
#### 客戶端 Library
客戶端 Library 是模組化的。每個子 Library 都是單一外部系統的獨立實作。這是支援既有工具的方法之一。
- **`supabase-{lang}`**: Combines libraries and adds enrichments.
- `postgrest-{lang}`: 銜接 [PostgREST](https://github.com/postgrest/postgrest) 的客戶端 Library
- `realtime-{lang}`: 銜接 [Realtime](https://github.com/supabase/realtime) 的客戶端 Library
- `gotrue-{lang}`: 銜接 [GoTrue](https://github.com/netlify/gotrue) 的客戶端 Library
| Repo | 官方 | 社群 |
| --------------------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`supabase-{lang}`** | [`JS`](https://github.com/supabase/supabase-js) | [`C#`](https://github.com/supabase/supabase-csharp) \| [`Dart`](https://github.com/supabase/supabase-dart) \| [`Python`](https://github.com/supabase/supabase-py) \| `Rust` |
| `postgrest-{lang}` | [`JS`](https://github.com/supabase/postgrest-js) | [`C#`](https://github.com/supabase/postgrest-csharp) \| [`Dart`](https://github.com/supabase/postgrest-dart) \| [`Python`](https://github.com/supabase/postgrest-py) \| [`Rust`](https://github.com/supabase/postgrest-rs) |
| `realtime-{lang}` | [`JS`](https://github.com/supabase/realtime-js) | [`C#`](https://github.com/supabase/realtime-csharp) \| [`Dart`](https://github.com/supabase/realtime-dart) \| [`Python`](https://github.com/supabase/realtime-py) \| `Rust` |
| `gotrue-{lang}` | [`JS`](https://github.com/supabase/gotrue-js) | [`C#`](https://github.com/supabase/gotrue-csharp) \| [`Dart`](https://github.com/supabase/gotrue-dart) \| [`Python`](https://github.com/supabase/gotrue-py) \| `Rust` |
---
## 贊助
[![加入贊助](https://user-images.githubusercontent.com/10214025/90518111-e74bbb00-e198-11ea-8f88-c9e3c1aa4b5b.png)](https://github.com/sponsors/supabase)
+1 -1
View File
@@ -375,7 +375,7 @@ alter publication supabase_realtime add table products;
alter publication supabase_realtime add table posts;
```
We are aiming to deliver enhanced realtime security by Q1 2021.
We're in the process of building enhanced realtime security.
## Next steps
@@ -0,0 +1,31 @@
<svg width="867" height="148" viewBox="0 0 867 148" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="867" height="148" fill="white"/>
<g clip-path="url(#clip0)">
<path d="M828.086 30H638.015C630.275 30 624 36.2745 624 44.0145V103.576C624 111.316 630.275 117.59 638.015 117.59H828.086C835.826 117.59 842.1 111.316 842.1 103.576V44.0145C842.1 36.2745 835.826 30 828.086 30Z" fill="#3ECF8E" fill-opacity="0.2"/>
<path d="M669.699 83.801V63.9433H674.144C679.41 63.9433 683.71 67.0355 683.71 73.8963C683.71 80.7571 679.41 83.801 674.144 83.801H669.699ZM674.434 91C684.773 91 691.683 84.4774 691.683 73.8963C691.683 63.3152 684.773 56.7443 674.482 56.7443H662.065V91H674.434ZM706.205 73.848C706.205 66.6973 711.327 63.4601 716.11 63.4601C720.845 63.4601 725.967 66.6973 725.967 73.848C725.967 80.9987 720.845 84.1875 716.11 84.1875C711.327 84.1875 706.205 80.9987 706.205 73.848ZM698.282 73.8963C698.282 84.719 706.447 91.7247 716.11 91.7247C725.725 91.7247 733.89 84.719 733.89 73.8963C733.89 63.0253 725.725 56.0195 716.11 56.0195C706.447 56.0195 698.282 63.0253 698.282 73.8963ZM758.27 91.7247C768.899 91.7247 773.441 84.4774 774.552 79.7425L767.257 77.6649C766.58 80.129 764.213 84.0909 758.27 84.0909C753.149 84.0909 748.414 80.3706 748.414 73.9446C748.414 66.7456 753.583 63.4601 758.173 63.4601C764.213 63.4601 766.387 67.4703 766.919 69.8378L774.118 67.567C773.006 62.6388 768.465 56.0195 758.173 56.0195C748.607 56.0195 740.49 63.2669 740.49 73.9446C740.49 84.6223 748.414 91.7247 758.27 91.7247ZM806.511 65.1512C805.786 61.141 802.549 56.0195 793.997 56.0195C787.427 56.0195 781.725 60.5612 781.725 67.0355C781.725 72.1086 785.252 75.9739 791.05 77.0851L795.737 77.9548C798.008 78.3896 799.409 79.6458 799.409 81.3852C799.409 83.5111 797.573 84.9606 794.577 84.9606C789.891 84.9606 787.765 82.2066 787.475 79.0661L780.469 80.7571C780.952 85.5887 785.011 91.7247 794.481 91.7247C802.646 91.7247 807.139 86.2651 807.139 80.902C807.139 76.0222 803.757 71.8187 797.235 70.6108L792.645 69.7412C790.277 69.3063 789.263 68.0984 789.263 66.4557C789.263 64.5714 791.099 62.7837 793.949 62.7837C798.104 62.7837 799.409 65.4894 799.65 67.0838L806.511 65.1512Z" fill="#3ECF8E"/>
<path d="M159.372 84.5501C159.972 90.1514 165.067 99.7535 179.852 99.7535C192.74 99.7535 198.934 91.5517 198.934 83.55C198.934 76.3483 194.039 70.447 184.348 68.4465L177.355 66.9462C174.657 66.4461 172.859 64.9458 172.859 62.5452C172.859 59.7445 175.656 57.6442 179.153 57.6442C184.748 57.6442 186.846 61.3449 187.245 64.2457L198.335 61.7451C197.735 56.4439 193.04 47.542 179.053 47.542C168.463 47.542 160.671 54.8436 160.671 63.6454C160.671 70.5469 164.967 76.2484 174.458 78.3487L180.951 79.8491C184.748 80.6492 186.246 82.4498 186.246 84.6502C186.246 87.2508 184.148 89.5513 179.752 89.5513C173.958 89.5513 171.061 85.9504 170.761 82.0495L159.372 84.5501Z" fill="#0E1218"/>
<path d="M241.396 98.253H254.084C253.885 96.5525 253.585 93.1518 253.585 89.3509V49.042H240.296V77.6483C240.296 83.3497 236.9 87.3505 231.006 87.3505C224.813 87.3505 222.015 82.9495 222.015 77.4483V49.042H208.728V80.149C208.728 90.8513 215.521 99.5532 227.409 99.5532C232.604 99.5532 238.3 97.5528 240.997 92.9518C240.997 94.9522 241.197 97.2527 241.396 98.253Z" fill="#0E1218"/>
<path d="M281.051 117.257V93.4521C283.448 96.7527 288.444 99.4534 295.238 99.4534C309.125 99.4534 318.414 88.4508 318.414 73.5475C318.414 58.9443 310.124 47.9419 295.738 47.9419C288.345 47.9419 282.85 51.2425 280.653 55.0435V49.0421H267.765V117.257H281.051ZM305.328 73.6476C305.328 82.4496 299.933 87.5506 293.139 87.5506C286.347 87.5506 280.852 82.3495 280.852 73.6476C280.852 64.9457 286.347 59.8445 293.139 59.8445C299.933 59.8445 305.328 64.9457 305.328 73.6476Z" fill="#0E1218"/>
<path d="M325.939 84.8502C325.939 92.552 332.333 99.6536 342.823 99.6536C350.115 99.6536 354.81 96.2527 357.308 92.3518C357.308 94.2523 357.507 96.9528 357.807 98.2533H369.996C369.696 96.5528 369.397 93.052 369.397 90.4515V66.246C369.397 56.3438 363.602 47.542 348.018 47.542C334.83 47.542 327.736 56.0437 326.938 63.7455L338.726 66.246C339.127 61.9451 342.323 58.2443 348.117 58.2443C353.712 58.2443 356.409 61.1449 356.409 64.6457C356.409 66.3462 355.511 67.7465 352.713 68.1465L340.625 69.9469C332.433 71.1472 325.939 76.0482 325.939 84.8502ZM345.619 89.7514C341.324 89.7514 339.225 86.9507 339.225 84.0501C339.225 80.2492 341.923 78.3487 345.321 77.8487L356.409 76.1483V78.3487C356.409 87.0508 351.215 89.7514 345.619 89.7514Z" fill="#0E1218"/>
<path d="M395.678 98.2531V92.2518C398.275 96.4528 403.469 99.4534 410.264 99.4534C424.251 99.4534 433.442 88.3509 433.442 73.4476C433.442 58.8442 425.149 47.7419 410.763 47.7419C403.469 47.7419 398.075 50.9426 395.878 54.4432V25.8369H382.791V98.2531H395.678ZM420.154 73.5475C420.154 82.5495 414.76 87.5506 407.965 87.5506C401.272 87.5506 395.678 82.4496 395.678 73.5475C395.678 64.5455 401.272 59.6445 407.965 59.6445C414.76 59.6445 420.154 64.5455 420.154 73.5475Z" fill="#0E1218"/>
<path d="M440.965 84.8502C440.965 92.552 447.358 99.6536 457.849 99.6536C465.14 99.6536 469.838 96.2527 472.333 92.3518C472.333 94.2523 472.535 96.9528 472.833 98.2533H485.021C484.723 96.5528 484.423 93.052 484.423 90.4515V66.246C484.423 56.3438 478.628 47.542 463.043 47.542C449.856 47.542 442.764 56.0437 441.964 63.7455L453.752 66.246C454.152 61.9451 457.349 58.2443 463.142 58.2443C468.738 58.2443 471.435 61.1449 471.435 64.6457C471.435 66.3462 470.537 67.7465 467.739 68.1465L455.651 69.9469C447.459 71.1472 440.965 76.0482 440.965 84.8502ZM460.646 89.7514C456.35 89.7514 454.251 86.9507 454.251 84.0501C454.251 80.2492 456.948 78.3487 460.346 77.8487L471.435 76.1483V78.3487C471.435 87.0508 466.24 89.7514 460.646 89.7514Z" fill="#0E1218"/>
<path d="M493.62 84.5501C494.218 90.1514 499.315 99.7535 514.099 99.7535C526.987 99.7535 533.181 91.5517 533.181 83.55C533.181 76.3483 528.286 70.447 518.595 68.4465L511.602 66.9462C508.905 66.4461 507.108 64.9458 507.108 62.5452C507.108 59.7445 509.904 57.6442 513.4 57.6442C518.996 57.6442 521.093 61.3449 521.494 64.2457L532.583 61.7451C531.982 56.4439 527.287 47.542 513.302 47.542C502.711 47.542 494.919 54.8436 494.919 63.6454C494.919 70.5469 499.214 76.2484 508.705 78.3487L515.199 79.8491C518.996 80.6492 520.495 82.4498 520.495 84.6502C520.495 87.2508 518.396 89.5513 514.001 89.5513C508.206 89.5513 505.309 85.9504 505.009 82.0495L493.62 84.5501Z" fill="#0E1218"/>
<path d="M553.36 68.0464C553.66 63.5455 557.457 58.3442 564.35 58.3442C571.942 58.3442 575.141 63.1455 575.34 68.0464H553.36ZM576.639 80.8494C575.04 85.2502 571.644 88.351 565.45 88.351C558.855 88.351 553.36 83.6499 553.062 77.1486H588.227C588.227 76.9484 588.427 74.948 588.427 73.0475C588.427 57.244 579.336 47.542 564.151 47.542C551.563 47.542 539.973 57.7441 539.973 73.4477C539.973 90.0513 551.861 99.7535 565.349 99.7535C577.437 99.7535 585.23 92.6519 587.728 84.15L576.639 80.8494Z" fill="#0E1218"/>
<path d="M87.683 128.073C84.8235 131.674 79.0255 129.701 78.9566 125.103L77.9491 57.8516H123.169C131.36 57.8516 135.928 67.3117 130.835 73.7263L87.683 128.073Z" fill="url(#paint0_linear)"/>
<path d="M87.683 128.073C84.8235 131.674 79.0255 129.701 78.9566 125.103L77.9491 57.8516H123.169C131.36 57.8516 135.928 67.3117 130.835 73.7263L87.683 128.073Z" fill="url(#paint1_linear)" fill-opacity="0.2"/>
<path d="M69.2924 19.8598C72.1519 16.2585 77.9498 18.2318 78.0187 22.8298L78.4603 90.081H33.8065C25.6157 90.081 21.0476 80.6209 26.1408 74.2063L69.2924 19.8598Z" fill="#3ECF8E"/>
</g>
<defs>
<linearGradient id="paint0_linear" x1="77.9491" y1="72.7628" x2="118.139" y2="89.6184" gradientUnits="userSpaceOnUse">
<stop stop-color="#249361"/>
<stop offset="1" stop-color="#3ECF8E"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="60.1311" y1="48.3669" x2="78.4598" y2="82.8695" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<clipPath id="clip0">
<rect width="819" height="112" fill="white" transform="translate(24 18)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 7.8 KiB