Merge pull request #13665 from supabase/master

Prod deploy dashboard
This commit is contained in:
Joshen Lim authored and GitHub committed 2023-04-13 13:28:43 +07:00
commit bddc3a1c79
107 files changed
+12243 -6433

No files matched your search

@@ -674,6 +674,7 @@ export const storage = {
items: [
{ name: 'Overview', url: '/guides/storage' },
{ name: 'Quickstart', url: '/guides/storage/quickstart' },
{ name: 'Uploads', url: '/guides/storage/uploads' },
{ name: 'Access Control', url: '/guides/storage/access-control' },
{ name: 'CDN', url: '/guides/storage/cdn' },
{ name: 'Image Transformations', url: '/guides/storage/image-transformations' },
@@ -847,6 +848,12 @@ export const self_hosting = {
{ name: 'Configuration', url: '/guides/self-hosting/analytics/config', items: [] },
],
},
{
name: 'Functions Server',
items: [
{ name: 'Reference', url: '/reference/self-hosting-functions/introduction', items: [] },
],
},
],
}
@@ -1081,6 +1088,13 @@ export const reference_self_hosting_analytics = {
parent: '/reference',
}
export const reference_self_hosting_functions = {
icon: 'reference-functions',
title: 'Self-Hosting Functions',
url: '/guides/reference/self-hosting/functions',
parent: '/reference',
}
// export const reference: [
// {
// label: 'Official'
@@ -25,6 +25,7 @@ import libCommonSections from '~/../../spec/common-client-libs-sections.json'
import authServerCommonSections from '~/../../spec/common-self-hosting-auth-sections.json'
import realtimeServerCommonSections from '~/../../spec/common-self-hosting-realtime-sections.json'
import analyticsServerCommonSections from '~/../../spec/common-self-hosting-analytics-sections.json'
import functionsServerCommonSections from '~/../../spec/common-self-hosting-functions-sections.json'
import storageServerCommonSections from '~/../../spec/common-self-hosting-storage-sections.json'
import { flattenSections } from '~/lib/helpers'
import NavigationMenuHome from './HomeMenu'
@@ -64,6 +65,7 @@ export type RefIdOptions =
| 'reference_self_hosting_storage'
| 'reference_self_hosting_realtime'
| 'reference_self_hosting_analytics'
| 'reference_self_hosting_functions'
export type RefKeyOptions =
| 'javascript'
@@ -77,6 +79,7 @@ export type RefKeyOptions =
| 'self-hosting-storage'
| 'self-hosting-realtime'
| 'self-hosting-analytics'
| 'self-hosting-functions'
const NavigationMenu = () => {
const router = useRouter()
@@ -171,6 +174,9 @@ const NavigationMenu = () => {
case url.includes(`/docs/reference/self-hosting-analytics`) && url:
menuState.setMenuLevelId('reference_self_hosting_analytics')
break
case url.includes(`/docs/reference/self-hosting-functions`) && url:
menuState.setMenuLevelId('reference_self_hosting_functions')
break
default:
break
@@ -216,6 +222,7 @@ const NavigationMenu = () => {
const isReference_Self_Hosting_Storage = 'reference_self_hosting_storage' === level
const isReference_Self_Hosting_Realtime = 'reference_self_hosting_realtime' === level
const isReference_Self_Hosting_Analytics = 'reference_self_hosting_analytics' === level
const isReference_Self_Hosting_Functions = 'reference_self_hosting_functions' === level
return (
<div className={['flex relative', 'justify-center lg:justify-start'].join(' ')}>
@@ -339,6 +346,13 @@ const NavigationMenu = () => {
commonSections={analyticsServerCommonSections}
lib="self-hosting-analytics"
/>
<NavigationMenuRefList
key={'reference-self-hosting-functions-menu'}
id={'reference_self_hosting_functions'}
active={isReference_Self_Hosting_Functions}
commonSections={functionsServerCommonSections}
lib="self-hosting-functions"
/>
</div>
)
}
@@ -0,0 +1,78 @@
---
id: introduction
title: Introduction
hideTitle: true
---
<div className="flex items-start gap-6 not-prose" id="introduction">
<img src="/docs/img/icons/menu/reference-analytics.svg" className="w-8 h-8 rounded" />
<div className="flex flex-col gap-2">
<h1 className="text-3xl text-scale-1200 m-0">Self-Hosting Functions</h1>
</div>
</div>
<RefSubLayout.EducationRow>
<RefSubLayout.Details>
A web server based on [Deno](https://deno.land) runtime, capable of running JavaScript, TypeScript, and WASM services.
You can use it to:
- Locally test and self-host Supabase's Edge Functions (or any Deno Edge Function)
- As a programmable HTTP Proxy: You can intercept / route HTTP requests
<Admonition type="info" label="Beta Version">
Self hosted Edge functions are in beta. There will be breaking changes to APIs / Configuration
Options.
</Admonition>
## How to run locally
```bash
./run.sh start --main-service /path/to/supabase/functions -p 9000
```
using Docker:
```bash
docker build -t edge-runtime .
docker run -it --rm -p 9000:9000 -v /path/to/supabase/functions:/usr/services supabase/edge-runtime start --main-service /usr/services
```
## How to update to a newer Deno version
- Select the Deno version to upgrade and visit its tag on GitHub (eg: https://github.com/denoland/deno/blob/v1.30.3/Cargo.toml)
- Open the `Cargo.toml` at the root of this repo and modify all `deno_*` modules to match to the selected tag of Deno.
## Self hosting Edge Functions on Fly.io
We have put together a demo on how to self-host edge functions on [Fly.io](http://Fly.io) (you can also use other providers like Digital Ocean or AWS).
To try it yourself,
1. Sign up for an [Fly.io](http://Fly.io) account and install [flyctl](https://fly.io/docs/hands-on/install-flyctl/)
2. Clone the demo repository to your machine - https://github.com/supabase/self-hosted-edge-functions-demo
3. Copy your Edge Function into the `./functions` directory in the demo repo.
4. Update the Dockerfile to pull the latest edge-runtime image (check [releases](https://github.com/supabase/edge-runtime/pkgs/container/edge-runtime))
5. [Optional] Edit `./functions/main/index.ts`, adding any other request preprocessing logic (for example, you can enable JWT validation, handle CORS requests)
6. Run `fly launch` to create a new app to serve your Edge Functions
7. Access your Edge Function by visiting:
`https://{your-app-name}.fly.dev/{your-function-name}`
You can view the logs for the Edge Runtime, by visiting Fly.io’s Dashboard > Your App > Metrics. Also, you can serve edge-runtime from multiple regions by running `fly regions add [REGION]`.
</RefSubLayout.Details>
<RefSubLayout.Examples>
### Client libraries
- [JavaScript](https://supabase.com/docs/reference/javascript/functions-invoke)
- [Dart](https://supabase.com/docs/reference/dart/functions-invoke)
### Additional Links
- [Source code](https://github.com/supabase/edge-runtime/)
</RefSubLayout.Examples>
</RefSubLayout.EducationRow>
+4
View File
@@ -118,6 +118,10 @@ const levelsData = {
icon: '/docs/img/icons/menu/reference-analytics',
name: 'Analytics Server Reference',
},
reference_self_hosting_functions: {
icon: '/docs/img/icons/menu/reference-functions',
name: 'Functions Server Reference',
},
}
const MobileHeader = memo(function MobileHeader() {
+13 -1
View File
@@ -6,6 +6,8 @@ import specRealtimeV0 from '~/../../spec/realtime_v0_config.yaml' assert { type:
import specAuthV1 from '~/../../spec/gotrue_v1_config.yaml' assert { type: 'yml' }
// @ts-expect-error
import specAnalyticsV0 from '~/../../spec/analytics_v0_config.yaml' assert { type: 'yml' }
// @ts-expect-error
import specFunctionsV0 from '~/../../spec/functions_v0_config.yaml' assert { type: 'yml' }
function getStorageConfigV0() {
return { ...specStorageV0 }
@@ -23,4 +25,14 @@ function getAnalyticsConfigV0() {
return { ...specAnalyticsV0 }
}
export { getStorageConfigV0, getRealtimeConfigV0, getAuthConfigV1, getAnalyticsConfigV0 }
function getFunctionsConfigV0() {
return { ...specFunctionsV0 }
}
export {
getStorageConfigV0,
getRealtimeConfigV0,
getAuthConfigV1,
getAnalyticsConfigV0,
getFunctionsConfigV0,
}
+1 -1
View File
@@ -64,7 +64,7 @@ function MyApp({ Component, pageProps }: AppPropsWithLayout) {
* Send page telemetry on first page load
*/
if (router.isReady) {
handlePageTelemetry(router.route)
handlePageTelemetry(router.asPath)
}
}, [router.isReady])
@@ -260,6 +260,9 @@ const App = () => (
<Auth
supabaseClient={supabase}
appearance={{
// If you want to extend the default styles instead of overriding it, set this to true
extend: false,
// Your custom classes
className: {
anchor: 'my-awesome-anchor',
button: 'my-awesome-button',
@@ -326,32 +326,7 @@ And then we can share this instance across our application with Outlet Context.
Since authentication happens client-side, we need to tell Remix to re-call all active loaders when the user signs in or out.
Remix does this automatically when an action completes. Let's create an empty action.
<Tabs
scrollable
size="small"
type="underlined"
defaultActiveId="js"
>
<TabPanel id="js" label="JavaScript">
```jsx title=app/routes/handle-supabase-auth.jsx
export const action = () => null
```
</TabPanel>
<TabPanel id="ts" label="TypeScript">
```tsx title=app/routes/handle-supabase-auth.tsx
export const action = () => null
```
</TabPanel>
</Tabs>
Remix provides a hook `useRevalidator` that can be used to revalidate all loaders on the current route.
Now to determine when to submit a post request to this action, we need to compare the server and client state for the user's access token.
@@ -434,7 +409,7 @@ export const loader = async ({ request }: LoaderArgs) => {
</Tabs>
And then use a `fetcher` to simulate submitting a form to our action, inside the `onAuthStateChange` hook.
And then use the revalidator, inside the `onAuthStateChange` hook.
<Tabs
scrollable
@@ -447,7 +422,7 @@ And then use a `fetcher` to simulate submitting a form to our action, inside the
```jsx title=app/root.jsx
const { env, session } = useLoaderData()
const fetcher = useFetcher()
const { revalidate } = useRevalidator()
const [supabase] = useState(() =>
createBrowserClient(env.SUPABASE_URL, env.SUPABASE_ANON_KEY)
@@ -461,11 +436,7 @@ useEffect(() => {
} = supabase.auth.onAuthStateChange((event, session) => {
if (session?.access_token !== serverAccessToken) {
// server and client are out of sync.
// Remix recalls active loaders after actions complete
fetcher.submit(null, {
method: 'post',
action: '/handle-supabase-auth',
})
revalidate()
}
})
@@ -481,7 +452,7 @@ useEffect(() => {
```tsx title=app/root.tsx
const { env, session } = useLoaderData<typeof loader>()
const fetcher = useFetcher()
const { revalidate } = useRevalidator()
const [supabase] = useState(() =>
createBrowserClient<Database>(env.SUPABASE_URL, env.SUPABASE_ANON_KEY)
@@ -493,13 +464,9 @@ useEffect(() => {
const {
data: { subscription },
} = supabase.auth.onAuthStateChange((event, session) => {
if (session?.access_token !== serverAccessToken) {
if (event !== "INITIAL_SESSION" && session?.access_token !== serverAccessToken) {
// server and client are out of sync.
// Remix recalls active loaders after actions complete
fetcher.submit(null, {
method: 'post',
action: '/handle-supabase-auth',
})
revalidate()
}
})
@@ -80,7 +80,8 @@ export const meta = {
import './index.css'
import { useState, useEffect } from 'react'
import { createClient } from '@supabase/supabase-js'
import { Auth, ThemeSupa } from '@supabase/auth-ui-react'
import { Auth } from '@supabase/auth-ui-react'
import { ThemeSupa } from '@supabase/auth-ui-shared'
const supabase = createClient('https://<project>.supabase.co', '<your-anon-key>')
@@ -115,6 +115,10 @@ Unofficial libraries [supported by the community](https://github.com/supabase-co
Supabase Storage makes it simple to store and serve files. [Docs](/docs/guides/storage).
### Resumable uploads
Upload large files easily using resumable uploads. [Docs](/docs/guides/storage/uploads).
### Storage CDN
Cache large files using the Supabase CDN. [Docs](/docs/guides/storage-cdn).
@@ -168,6 +172,7 @@ Both Postgres and the Supabase Platform are production-ready. Some tools we offe
| Storage | CDN | `GA` | 🚧 [Cloudflare](https://www.cloudflare.com) |
| Storage | Smart CDN | `beta` | 🚧 [Cloudflare](https://www.cloudflare.com) |
| Storage | Image Transformations | `beta` | ✅ |
| Storage | Resumable Uploads | `beta` | ✅ |
| Edge Functions | | `beta` | 🚧 [Deno Deploy](https://deno.com/deploy) |
| Auth | OAuth Providers | `beta` | ✅ |
| Auth | Passwordless | `beta` | ✅ |
@@ -237,7 +237,7 @@ class _LoginPageState extends State<LoginPage> {
});
try {
await supabase.auth.signInWithOtp(
email: _emailController.text,
email: _emailController.text.trim(),
emailRedirectTo:
kIsWeb ? null : 'io.supabase.flutterquickstart://login-callback/',
);
@@ -358,8 +358,8 @@ class _AccountPageState extends State<AccountPage> {
setState(() {
_loading = true;
});
final userName = _usernameController.text;
final website = _websiteController.text;
final userName = _usernameController.text.trim();
final website = _websiteController.text.trim();
final user = supabase.auth.currentUser;
final updates = {
'id': user!.id,
@@ -682,8 +682,8 @@ class _AccountPageState extends State<AccountPage> {
setState(() {
_loading = true;
});
final userName = _usernameController.text;
final website = _websiteController.text;
final userName = _usernameController.text.trim();
final website = _websiteController.text.trim();
final user = supabase.auth.currentUser;
final updates = {
'id': user!.id,
@@ -287,7 +287,7 @@ export default function Account({ session }) {
<label htmlFor="website">Website</label>
<input
id="website"
type="website"
type="url"
value={website || ''}
onChange={(e) => setWebsite(e.target.value)}
/>
@@ -417,7 +417,7 @@ export default function Account({ session }: { session: Session }) {
<label htmlFor="website">Website</label>
<input
id="website"
type="website"
type="url"
value={website || ''}
onChange={(e) => setWebsite(e.target.value)}
/>
@@ -192,7 +192,7 @@ async function signOut() {
</div>
<div>
<label for="website">Website</label>
<input id="website" type="website" v-model="website" />
<input id="website" type="url" v-model="website" />
</div>
<div>
@@ -414,7 +414,7 @@ async function signOut() {
</div>
<div>
<label for="website">Website</label>
<input id="website" type="website" v-model="website" />
<input id="website" type="url" v-model="website" />
</div>
<div>
@@ -200,7 +200,7 @@ export default function Account({ session }) {
<label htmlFor="website">Website</label>
<input
id="website"
type="website"
type="url"
value={website || ''}
onChange={(e) => setWebsite(e.target.value)}
/>
@@ -415,7 +415,7 @@ const Account = () => {
<label htmlFor="website">Website</label>
<input
id="website"
type="website"
type="url"
value={website || ''}
onChange={(e) => setWebsite(e.target.value)}
/>
@@ -176,7 +176,7 @@ Update your `src/routes/+layout.svelte`:
import { invalidate } from '$app/navigation'
import { onMount } from 'svelte'
import type { LayoutData } from './$types'
export let data: LayoutData
$: ({ supabase, session } = data)
@@ -353,7 +353,7 @@ Create a new `src/routes/account/+page.svelte` file with the content below.
<div>
<label for="website">Website</label>
<input id="website" name="website" type="website" value={form?.website ?? website} />
<input id="website" name="website" type="url" value={form?.website ?? website} />
</div>
<div>
@@ -209,7 +209,7 @@ async function signOut() {
</div>
<div>
<label for="website">Website</label>
<input id="website" type="website" v-model="website" />
<input id="website" type="url" v-model="website" />
</div>
<div>
@@ -200,7 +200,7 @@ If you would like to use Supabase Auth and Prisma in your application, you will
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directURL = env("DIRECT_URL")
directUrl = env("DIRECT_URL")
}
generator client {
@@ -215,7 +215,7 @@ Next, specify the database schemas you would like to include in your Prisma sche
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directURL = env("DIRECT_URL")
directUrl = env("DIRECT_URL")
schemas = ["public", "auth"]
}
@@ -255,7 +255,7 @@ If you would like to use a PostgreSQL extension with Prisma, enable the `postgre
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directURL = env("DIRECT_URL")
directUrl = env("DIRECT_URL")
}
generator client {
@@ -270,7 +270,7 @@ Next, specify the extensions you need in the `datasource` block:
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directURL = env("DIRECT_URL")
directUrl = env("DIRECT_URL")
extensions = [hstore(schema: "myHstoreSchema"), pg_trgm, postgis(version: "2.1")]
}
@@ -69,7 +69,7 @@ If you intend to import a lot of data into your database which requires multiple
</Admonition>
The maximum Disk Size for Pro Tier is 1024TB. If you need more than this, [contact us](https://app.supabase.com/support/new) to learn more about the Enterprise plan.
The maximum Disk Size for Pro Tier is 64TB. If you need more than this, [contact us](https://app.supabase.com/support/new) to learn more about the Enterprise plan.
### Free Tier Behavior
@@ -23,9 +23,9 @@ const { createClient } = require('@supabase/supabase-js')
const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY)
supabase
.channel('test')
.on('broadcast', { event: 'supa' }, (payload) => console.log(payload))
const channel = supabase.channel('test')
channel.on('broadcast', { event: 'supa' }, (payload) => console.log(payload))
.subscribe()
```
@@ -38,7 +38,9 @@ const { createClient } = require('@supabase/supabase-js')
const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY)
supabase.channel('test').subscribe((status) => {
const channel = supabase.channel('test')
channel.subscribe((status) => {
if (status === 'SUBSCRIBED') {
channel.send({
type: 'broadcast',
@@ -59,16 +61,15 @@ You can also choose for a client to receive messages that it sent:
```js
// Supabase client setup
supabase
.channel('test', {
config: {
broadcast: {
self: true,
},
const channel = supabase.channel('test', {
config: {
broadcast: {
self: true,
},
})
.on('broadcast', { event: 'supa' }, (payload) => console.log(payload))
},
})
channel.on('broadcast', { event: 'supa' }, (payload) => console.log(payload))
.subscribe((status) => {
if (status === 'SUBSCRIBED') {
channel.send({
+165
View File
@@ -0,0 +1,165 @@
import Layout from '~/layouts/DefaultGuideLayout'
export const meta = {
id: 'storage-uploads',
title: 'Storage Uploads',
description: 'Learn how to upload files to Supabase Storage.',
sidebar_label: 'Uploads',
}
Supabase Storage provides two methods for uploading files:
- Standard Uploads
- Resuamble Uploads
## Standard Upload
The standard file upload method is ideal for small files that are not larger than 6MB.
It uses the traditional `multipart/form-data` format and is simple to implement using the supabase-js SDK. Here's an example of how to upload a file using the standard upload method:
<Admonition type="note">
You can upload up to 5GB file size using the standard upload method.
<br />
For files greater than 6 MB in size, use [TUS Resumable Upload](#resumable-upload) for better
reliability.
</Admonition>
```javascript
import { createClient } from '@supabase/supabase-js'
// Create Supabase client
const supabase = createClient('your_project_url', 'your_supabase_api_key')
// Upload file using standard upload
async function uploadFile(file) {
const { data, error } = await supabase.storage.from('bucket_name').upload('file_path', file)
if (error) {
// Handle error
} else {
// Handle success
}
}
```
## Resumable Upload
<Admonition type="note">
Resumable upload is in **Beta**. We are rolling this feature gradually, please contact us if you
want to be prioritized.
</Admonition>
The Resumable upload method is recommended for uploading large files that may exceed 6MB in size or for scenarios where network stability is a concern or if you simply want to have a progress bar for your uploads.
Supabase Storage implements the [TUS protocol](https://tus.io/) to enable resumable uploads. TUS stands for The Upload Server and is an open protocol for supporting resumable uploads. The protocol allows the upload process to be resumed from where it left off in case of interruptions.
This method can be implemented using the tus-js-client library, or other client-side libraries like [Uppy-js](https://uppy.io/docs/tus/) that support the TUS protocol.
Here's an example of how to upload a file using `tus-js-client`:
```javascript
const tus = require('tus-js-client')
const projectId = ''
const token = ''
function uploadFile(bucketName, fileName, file) {
return new Promise((resolve, reject) => {
var upload = new tus.Upload(file, {
endpoint: `https://${projectId}.supabase.co/storage/v1/upload/resumable`,
retryDelays: [0, 3000, 5000, 10000, 20000],
headers: {
authorization: `Bearer ${token}`,
'x-upsert': 'true', // optionally set upsert to true to overwrite existing files
},
uploadDataDuringCreation: true,
metadata: {
bucketName: bucketName,
objectName: fileName,
contentType: 'image/png',
cacheControl: 3600,
},
chunkSize: 6 * 1024 * 1024, // NOTE: it must be set to 6MB (for now) do not change it
onError: function (error) {
console.log('Failed because: ' + error)
reject(error)
},
onProgress: function (bytesUploaded, bytesTotal) {
var percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2)
console.log(bytesUploaded, bytesTotal, percentage + '%')
},
onSuccess: function () {
// console.log(upload)
console.log('Download %s from %s', upload.file.name, upload.url)
resolve()
},
})
// Check if there are any previous uploads to continue.
return upload.findPreviousUploads().then(function (previousUploads) {
// Found previous uploads so we select the first one.
if (previousUploads.length) {
upload.resumeFromPreviousUpload(previousUploads[0])
}
// Start the upload
upload.start()
})
})
}
```
### Upload URL
When uploading using the resumable upload endpoint, the TUS server creates a unique URL for each upload, even for multiple uploads to the same path. All chunks will be uploaded to this URL using the `PATCH` method.
This URL will be valid for **up to 24 hours**. If the upload is not completed within 24 hours, the URL will expire and you'll need to start the upload again. The TUS client library will automatically create a new URL if the previous one expires.
### Concurrency
When two or more clients try to upload to the same Upload URL only one of them will succeed. The other clients will receive a `409 Conflict` error. Only 1 client can upload to the same Upload URL at a time which prevents data corruption.
<Admonition type="note">
We do not yet support checksum validation for the uploaded chunks. This means if a client changes
the file mid way through the upload, the final upload will be an amalgamation of both the files.
This has to be done intentionally by the client and is unlikely to happen in normal circumstances.
</Admonition>
When two or more clients upload a file to the same path using different upload URLs, the first client to complete the upload will succeed and the other clients will receive a `409 Conflict` error.
If you provide the `x-upsert` header the last client to complete the upload will succeed instead.
### UppyJS Example
You can check a full example using UppyJS [Here](https://github.com/supabase/supabase/tree/master/examples/storage/resumable-upload-uppy)
Framework integration for UppyJS:
- [React](https://uppy.io/docs/react/)
- [Svelte](https://uppy.io/docs/svelte/)
- [Vue](https://uppy.io/docs/vue/)
- [Angular](https://uppy.io/docs/angular/)
## Overwriting Files
When uploading a file to a path that already exists, the default behavior is to return a `409 Conflict` error.
If you want to overwrite a file on a specific path you can set the `x-upsert` header to `true`.
We do advise against overwriting files when possible, as the CDN will take sometime to propagate the changes to all the edge nodes leading to stale content.
Uploading a file to a new path is the recommended way to avoid propagation delays and stale content.
If you want to know more about our CDN, check the [CDN](/docs/guides/storage/cdn) guide.
## Access Control with RLS Policies
Both the standard file upload and TUS resumable file upload methods in Supabase Storage support Row-Level Security (RLS) policies. RLS allows you to define fine-grained access control rules to restrict access to files based on user roles, permissions, or other criteria. This ensures that your files are secure and accessible only to authorized users.
For more information on RLS policies, see the [Storage Access Control](/docs/guides/storage/access-control) guide.
## Conclusion
Supabase Storage provides multiple options for uploading files, including standard file upload and TUS resumable file upload, both of which use RLS policies for access control.
Additionally, there are client-side libraries like Uppy-js that make it easy to implement TUS uploads in your application. Choose the upload method that best fits your needs based on file size, network stability, and other requirements.
export const Page = ({ children }) => <Layout meta={meta} children={children} />
export default Page
@@ -0,0 +1,21 @@
import selfHostingFunctionsCommonSections from '~/../../spec/common-self-hosting-functions-sections.json'
import RefSectionHandler from '~/components/reference/RefSectionHandler'
import { flattenSections } from '~/lib/helpers'
import handleRefGetStaticPaths from '~/lib/mdx/handleRefStaticPaths'
import handleRefStaticProps from '~/lib/mdx/handleRefStaticProps'
import { gen_v3 } from '~/lib/refGenerator/helpers'
const sections = flattenSections(selfHostingFunctionsCommonSections)
export default function JSReference(props) {
return <RefSectionHandler sections={sections} pageProps={props} type="api" />
}
export async function getStaticProps() {
return handleRefStaticProps(sections, '/self-hosting-functions')
}
export function getStaticPaths() {
return handleRefGetStaticPaths()
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 KiB

@@ -0,0 +1,6 @@
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12.625" cy="3.78271" r="2" fill="#92CEAC" stroke="#299764" stroke-miterlimit="10" stroke-linejoin="bevel"/>
<circle cx="3.37109" cy="12.9119" r="2" fill="#92CEAC" stroke="#299764" stroke-miterlimit="10" stroke-linejoin="bevel"/>
<path d="M1.85724 11.7101C1.31075 10.7129 1 9.56818 1 8.35083C1 4.48484 4.13401 1.35083 8 1.35083C9.18025 1.35083 10.2923 1.64292 11.2677 2.15877M4.77293 14.5642C5.73858 15.0668 6.83612 15.3508 8 15.3508C11.866 15.3508 15 12.2168 15 8.35083C15 7.16428 14.7048 6.04668 14.1838 5.06748" stroke="#299764" stroke-miterlimit="10" stroke-linejoin="bevel"/>
<circle cx="8" cy="8.35083" r="4.5" fill="#92CEAC" stroke="#299764" stroke-miterlimit="10" stroke-linejoin="bevel"/>
</svg>

After

Width:  |  Height:  |  Size: 812 B

@@ -0,0 +1,6 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12.625" cy="3.43188" r="2" fill="#133929" stroke="#4CC38A" stroke-miterlimit="10" stroke-linejoin="bevel"/>
<circle cx="3.37109" cy="12.561" r="2" fill="#133929" stroke="#4CC38A" stroke-miterlimit="10" stroke-linejoin="bevel"/>
<path d="M1.85724 11.3593C1.31075 10.3621 1 9.21735 1 8C1 4.13401 4.13401 1 8 1C9.18025 1 10.2923 1.29209 11.2677 1.80794M4.77293 14.2134C5.73858 14.716 6.83612 15 8 15C11.866 15 15 11.866 15 8C15 6.81345 14.7048 5.69585 14.1838 4.71665" stroke="#4CC38A" stroke-miterlimit="10" stroke-linejoin="bevel"/>
<circle cx="8" cy="8" r="4.5" fill="#133929" stroke="#4CC38A" stroke-miterlimit="10" stroke-linejoin="bevel"/>
</svg>

After

Width:  |  Height:  |  Size: 758 B

@@ -0,0 +1,6 @@
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12.625" cy="3.78271" r="2" fill="#92CEAC" stroke="#299764" stroke-miterlimit="10" stroke-linejoin="bevel"/>
<circle cx="3.37109" cy="12.9119" r="2" fill="#92CEAC" stroke="#299764" stroke-miterlimit="10" stroke-linejoin="bevel"/>
<path d="M1.85724 11.7101C1.31075 10.7129 1 9.56818 1 8.35083C1 4.48484 4.13401 1.35083 8 1.35083C9.18025 1.35083 10.2923 1.64292 11.2677 2.15877M4.77293 14.5642C5.73858 15.0668 6.83612 15.3508 8 15.3508C11.866 15.3508 15 12.2168 15 8.35083C15 7.16428 14.7048 6.04668 14.1838 5.06748" stroke="#299764" stroke-miterlimit="10" stroke-linejoin="bevel"/>
<circle cx="8" cy="8.35083" r="4.5" fill="#92CEAC" stroke="#299764" stroke-miterlimit="10" stroke-linejoin="bevel"/>
</svg>

After

Width:  |  Height:  |  Size: 812 B

+13 -3
View File
@@ -10,7 +10,17 @@ tags:
date: '03-30-2021'
---
Today, we are launching one of most requested features - Storage! When you sign up for Supabase, you get a Postgres database with realtime subscriptions, user management, auto-generated APIs and now a scalable object store. These services integrate very well with each other and you don't need to sign up for yet another service just for your storage requirements.
<div className="bg-gray-300 rounded-lg px-6 py-2 italic">
🆕 Storage has undergone significant enhancements with two major releases since its initial launch. Here is what is new:
- [Supabase Storage v2: Image resizing and Smart CDN](https://supabase.com/blog/storage-image-resizing-smart-cdn)
- [Supabase Storage v3: Resumable Uploads with support for 50GB files](https://supabase.com/blog/storage-v3-resumable-uploads)
</div>
Today, we are launching one of most requested features - [Storage!](https://supabase.com/storage) When you sign up for Supabase, you get a Postgres database with realtime subscriptions, user management, auto-generated APIs and now a scalable object store. These services integrate very well with each other and you don't need to sign up for yet another service just for your storage requirements.
As with anything that we build in Supabase, Storage is fast, secure and scalable. You can use it to store terabytes of Machine Learning training data, your e-commerce product gallery or just your growing collection of JPEGs featuring cats playing synths in space.
@@ -155,8 +165,8 @@ You may be itching to get started tinkering around with our new Supabase storage
## What's next
- We currently support S3 and will be adding more storage backends. Vote for the storage backends you would like to see us implement [here](https://github.com/supabase/supabase/discussions/982).
- We will integrate our storage service with a Content Delivery Network. With a CDN, objects are cached on a global network. This leads to faster access times for your users around the world.
- We are working on transformations like resizing of images and automatic optimization of different media types. This makes it easy to embed Supabase objects directly in your websites and mobile applications without additional processing.
- We will integrate our storage service with a Content Delivery Network. With a CDN, objects are cached on a global network. This leads to faster access times for your users around the world. **SHIPPED: [Supabase Storage v2: Image resizing and Smart CDN](https://supabase.com/blog/storage-image-resizing-smart-cdn#smart-cdn)
- We are working on transformations like resizing of images and automatic optimization of different media types. This makes it easy to embed Supabase objects directly in your websites and mobile applications without additional processing. **SHIPPED: [Supabase Storage v2: Image resizing and Smart CDN](https://supabase.com/blog/storage-image-resizing-smart-cdn#image-resizing)
- A better editor to make authoring policies easier and less error prone.
- Reach out to us if you would like to help out with adding storage support in one of the [community maintained client libraries](/docs/reference/javascript/installing).
@@ -16,9 +16,9 @@ Today we're introducing three new features for Supabase Storage: Image resizing,
These features are designed to work together to deliver a next-gen image resizing system. Let's explore how it works.
<div className="bg-gray-300 rounded-lg p-6 italic">
<div className="bg-gray-300 rounded-lg px-6 py-2 italic">
Image Resizing is in Beta. While in Beta, it is only enabled for Pro-tier and Enterprise customers.
🆕 What is new in Storage: [Supabase Storage v3: Resumable Uploads with support for 50GB files](https://supabase.com/blog/storage-v3-resumable-uploads)
</div>
@@ -83,6 +83,12 @@ Behind the scenes, we've provided a few small niceties:
- **Sane defaults:** default mode maintains aspect ratio and the resize mode is `cover`
- **Standardization**: resize modes mirror the [object-fit](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit) property of CSS. We support the contain, cover and fill modes.
<div className="bg-gray-300 rounded-lg p-6 italic">
Image Resizing is in Beta. While in Beta, it is only enabled for Pro-tier and Enterprise customers.
</div>
## Smart CDN
Resizing images can get expensive, so before this release we knew we needed a better caching system. We already provide a “basic” CDN for all projects (including Free-tier), so the important update here is some smarter cache invalidation whenever there are changes.
@@ -5,7 +5,7 @@ tags:
- launch-week
- o11y
date: '2023-04-10'
to_depth: 3
toc_depth: 3
author: chasers,ziinc
image: launch-week-7/day-1-supabase-logs-self-hosted/day-1-supabase-logs-self-hosted-og.jpg
thumb: launch-week-7/day-1-supabase-logs-self-hosted/day-1-supabase-logs-self-hosted-thumb.jpg
@@ -5,9 +5,9 @@ tags:
- launch-week
- functions
date: '2023-04-11'
to_depth: 3
toc_depth: 3
author: laktek,inian
image: launch-week-7/day-2-edge-runtime/edge-runtime-og.png
image: launch-week-7/day-2-edge-runtime/edge-runtime-og.jpg
thumb: launch-week-7/day-2-edge-runtime/edge-runtime-thumb.jpeg
---
@@ -0,0 +1,245 @@
---
title: 'Supabase Storage v3: Resumable Uploads with support for 50GB files'
launchweek: 7
tags:
- launch-week
- storage
date: '2023-04-12'
toc_depth: 3
author: fabrizio,inian
image: launch-week-7/day-3-storage-resumable-uploads/storage-v3-og.jpg
thumb: launch-week-7/day-3-storage-resumable-uploads/storage-v3-thumb.jpg
---
Supabase Storage is receiving a major upgrade, implementing many of the most requested features from our users: Resumable Uploads, Quality Filters, Next.js support, and WebP support.
The key feature: **Resumable Uploads**! With Resumable Uploads, you can continue uploading a file from where you left off, even if you lose internet connectivity or accidentally close your browser tab while uploading.
Resumable uploads divides the file into chunks before uploading them, emitting progress events during upload.
<video width="100%" autoPlay="" loop="" muted="" playsInline="" controls="true">
<source
src="/images/blog/launch-week-7/day-3-storage-resumable-uploads/pause-upload.mov"
type="video/mp4"
/>
</video>
With this release, you can now upload files as large as 50GB! (Previously the limit was 5GB).
To build this feature, we implemented Postgres Advisory locks which solved some gnarly concurrency problems. We can now handle edge-cases, like two clients uploading to the same location. We’ll deep dive into how we implemented Advisory locks later in the post.
## New features
Storage v3 introduces a number of new features.
### More image transformations options
We introduced image resizing last Launch Week. This time, we’ve added the ability to specify `quality` and `format` filters when downloading your image. When you request images via the transform endpoint, by default we render it as Webp, if the client supports it.
```js
supabase.storage.from('bucket').download('image.jpg', {
transform: {
width: 800,
height: 300,
quality: 75,
format: 'origin',
},
})
```
### Next.js loader
You can serve images from Storage with a simple Next.js loader for the Image component. Check out [our docs](https://supabase.com/docs/guides/storage/image-transformations#nextjs-loader) on how to get started.
```js
// supabase-image-loader.js
const projectId = '<SUPABASE_PROJECT_ID>'
export default function supabaseLoader({ src, width, quality }) {
return `https://${projectId}.supabase.co/storage/v1/render/image/public/${src}?width=${width}&quality=${
quality || 75
}`
}
// nextjs.config.js
module.exports = {
images: {
loader: 'custom',
loaderFile: './supabase-image-loader.js',
},
}
// Using Next Image
import Image from 'next/image'
const MyImage = (props) => {
return <Image src="bucket/image.png" alt="Picture of the author" width={500} height={500} />
}
```
### Presigned upload URLs
Authenticated users can now generate presigned URLs.
These URLs can then be shared with other users who can then upload to storage without further authorization. For example, you can generate a presigned URL on your server (ahem, Edge Function).
Shoutout to community members [@abbit](https://github.com/abbit) and [@MagnusHJensen](https://github.com/MagnusHJensen) who [implemented](https://github.com/supabase/storage-api/pull/282) this feature on the Storage server and [@Rawnly](https://github.com/Rawnly) for the [client library bindings](https://github.com/supabase/storage-js/pull/152) 🎉.
```js
// create a signed upload url
const filePath = 'users.txt'
const { token } = await storage.from(newBucketName).createSignedUploadUrl(filePath)
// this token can then be used to upload to storage
await storage.from(newBucketName).uploadToSignedUrl(filePath, token, file)
```
### Size and file type limits per bucket
You can now restrict the size and type of objects on a per-bucket basis. These features make it easy to upload to Storage from the client directly, without requiring validation from an intermediary server.
For example, you can restrict your users a 1 MB and `image/*` files when uploading their profile images:
![Bucket Restrictions](/images/blog/launch-week-7/day-3-storage-resumable-uploads/bucket-restrictions.png)
## Deep Dive into Resumable Uploads
<div className="video-container">
<iframe
className="w-full"
src="https://www.youtube-nocookie.com/embed/pT2PcZFq_M0"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
</div>
Let’s get into the nuts-and-bolts of how we implemented Resumable Uploads.
First, why do we need Resumable Uploads, when the HTTP protocol has a standard method for uploading files - `multipart/form-data` ? This approach works well for small files, since the file is streamed to the server in bytes over the network. For medium to large files this method becomes problematic, especially on spotty connections like mobile networks. Uploads that are interrupted need to be restarted from the beginning.
### TUS - Resumable Protocol
We use S3 to store your files and it implements a proprietary protocol for resumable uploads. At Supabase, we support existing open source communities when possible and so, instead of exposing the S3 protocol to our users, we implemented [TUS](https://tus.io/) (historically an acronym for Transloadit Upload Server, later renamed to The Upload Server). TUS is an open protocol for resumable file uploads. By leveraging an open protocol, developers can use existing libraries with Supabase Storage.
TUS is a powerful protocol. It’s built on top of HTTP, making it easy to integrate your browser and mobile applications. Because of its open nature, a variety of powerful, drop-in clients and open-source libraries have been built around it. For example, at Supabase, we love [Uppy.js](https://uppy.io/docs/tus/), a multi-file uploader for TUS.
Using Uppy with Supabase Storage looks like this:
```jsx
import { Uppy, Dashboard, Tus } from 'https://releases.transloadit.com/uppy/v3.6.1/uppy.min.mjs'
const token = 'anon-key'
const projectId = 'your-project-ref'
const bucketName = 'avatars'
const folderName = 'foldername'
const supabaseUploadURL = `https://${projectId}.supabase.co/storage/v1/upload/resumable`
var uppy = new Uppy()
.use(Dashboard, {
inline: true,
target: '#drag-drop-area',
showProgressDetails: true,
})
.use(Tus, {
endpoint: supabaseUploadURL,
headers: {
authorization: `Bearer ${token}`,
},
chunkSize: 6 * 1024 * 1024,
allowedMetaFields: ['bucketName', 'objectName', 'contentType', 'cacheControl'],
})
uppy.on('file-added', (file) => {
file.meta = {
...file.meta,
bucketName: bucketName,
objectName: folderName ? `${folderName}/${file.name}` : file.name,
contentType: file.type,
}
})
uppy.on('complete', (result) => {
console.log('Upload complete! We’ve uploaded these files:', result.successful)
})
```
And there you have it, with a few lines of code, you can support parallel, resumable uploads of multiple files, with progress events!
<video width="100%" autoPlay="" loop="" muted="" playsInline="" controls="true">
<source
src="/images/blog/launch-week-7/day-3-storage-resumable-uploads/parallel-uploads.mov"
type="video/mp4"
/>
</video>
## Implementing TUS inside Supabase Storage
There were a few technical challenges we faced while implementing TUS in Supabase Storage.
Storage is powered by our [Storage-API service](https://github.com/supabase/storage-api), a Node.js server that interfaces with different storage backends (like AWS S3). It is fully integrated with the Supabase ecosystem, making it easy to protect files with Postgres RLS policies.
To implement the TUS protocol, we use [tus-node-server](https://github.com/tus/tus-node-server), which was recently ported to Typescript. It was only missing a few features we needed:
- Ability to limit the upload to files of a certain size
- Ability to run multiple instances of TUS (more on this later)
- Ability to expire upload URLs after a certain amount of time
We will be contributing these features back to TUS with discussions and PRs after Launch Week.
### Scaling TUS
One of the biggest challenges we faced was the ability to scale TUS by running multiple instances of the server behind a load balancer. The protocol divides the file into chunks and sends it to any arbitrary server. Each chunk can be processed by a different server. Cases like these can lead to corrupted files with multiple servers trying to buffer the same file to S3 concurrently.
The TUS documentation gives 2 work-arounds:
1. Use Sticky sessions to direct the client to the same server the upload was originally started.
2. Implement some sort of distributed locking to ensure exclusive access to the storage backend.
Option 1 would have affected the even distribution of requests across servers. We decided to go with option 2 - Distributed Locking. Storage uses Postgres as a database, a queue, and now as a lock manager.
### Enter Postgres Advisory Locks
Postgres advisory locks offer a way for defining locking behaviour of resources _outside_ of the database. These are called _advisory_ locks because Postgres does not enforce their use - it is up to the application to acquire and release the locks when accessing the shared resource. In our case, the shared resource is an object in S3. Advisory locks can be used to mediate concurrent operations to the same object.
```js
const key = `/bucket-name/folder/bunny.jpg`
const hashedKey = hash(key)
await db.withTransaction(() => {
// try acquiring a transactional advisory lock
// these locks are automatically released at the end of every transaction
await db.run('SELECT pg_advisory_xact_lock(?)', hashedKey);
// the current server can upload to s3 at the given key
await uploadObject();
if (isLastChunk) {
// storage.objects stores the object metadata of all objects
// It doubles up as a way to enforce authorization.
// If a user is able to insert into this table, they can upload.
await db.run('insert into storage.objects(..) values(..)')
}
});
// the advisory lock is automatically released at this point
```
With advisory locks, we’ve been able to utilize Postgres as a key part of the Supabase Stack to solve difficult concurrency problems.
### Roll out
Because this is a major update, we’re rolling it out gradually over the next month. You will receive a notification in your dashboard when the feature is available for project. Reach out to us if you want early access to this feature.
![Let me in](/images/blog/launch-week-7/day-3-storage-resumable-uploads/let-me-in.gif)
## Coming up next
We’ve got an exciting roadmap for the next few Storage releases:
- Presigned upload URLs for TUS
- Increasing max file size limit to 500 GB
- Transform images stored outside Supabase Storage
- [Smart CDN](https://supabase.com/docs/guides/storage/cdn#smart-cdn-caching) v2 with an even higher cache hit rate
Reach out on [Twitter](https://twitter.com/supabase) or [Discord](http://discord.supabase.com/) to share anything else you need to build amazing products.
@@ -50,10 +50,11 @@ const ShareArticleActions = ({ title, slug }: { title: string; slug: string }) =
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M22.7969 0.878906H0.703125V22.9727H22.7969V0.878906Z" fill="currentColor" />
<path
d="M11.0093 13.3976L7.17969 6.25391H8.94719L11.1566 10.7463C11.1566 10.8199 11.2302 10.8936 11.3039 10.9672C11.3775 11.0409 11.3775 11.1145 11.4511 11.2618L11.5248 11.3355V11.4091C11.5984 11.5564 11.5984 11.6301 11.6721 11.7773C11.7457 11.851 11.7457 11.9983 11.8194 12.0719C11.893 11.851 12.0403 11.7037 12.114 11.4091C12.1876 11.1882 12.3349 10.9672 12.4822 10.7463L14.6916 6.25391H16.3118L12.4822 13.4712V18.0372H11.0093V13.3976Z"
fill="#1C1C1C"
fill-rule="evenodd"
clip-rule="evenodd"
d="M0.703125 0.878906H22.7031V22.8789H0.703125V0.878906ZM7.1522 6.23109L10.9656 13.3445V17.9644H12.4322V13.4177L16.2455 6.23109H14.6322L12.4322 10.7044C12.2855 10.9244 12.1389 11.1444 12.0656 11.3644C12.0233 11.5332 11.9568 11.6534 11.894 11.767C11.8477 11.8508 11.8033 11.931 11.7722 12.0244C11.7355 11.9877 11.7171 11.9327 11.6988 11.8776C11.6805 11.8227 11.6622 11.7677 11.6255 11.731C11.5888 11.6577 11.5704 11.6026 11.5521 11.5475C11.5338 11.4926 11.5155 11.4376 11.4789 11.3644V11.2911L11.4055 11.2177C11.3775 11.1617 11.3602 11.1164 11.3454 11.0777C11.3215 11.015 11.3042 10.9697 11.2589 10.9244C11.1855 10.8511 11.1122 10.7777 11.1122 10.7044L8.9122 6.23109H7.1522Z"
fill="currentColor"
/>
</svg>
</a>
+8 -42
View File
@@ -34,15 +34,15 @@ const BlogLinks = () => {
`}
>
<div className="relative z-10 flex items-center text-lg flex-col-reverse lg:flex-row lg:justify-start gap-2 text-black dark:text-white">
<div className="text-transparent bg-clip-text bg-gradient-to-r from-[#F4FFFA] to-[#B7B2C9] drop-shadow-lg">
<div
className={[
'text-transparent bg-clip-text bg-gradient-to-r from-[#F4FFFA] to-[#B7B2C9] drop-shadow-lg',
step.break_thumb_title && 'max-w-[290px]',
].join(' ')}
>
{step.title}
</div>
</div>
{/* <SectionButtons
// docs={step.docs}
blog={step.blog}
// youtube_id={step.youtube_id}
/> */}
{step.thumb && (
<motion.div
className="absolute inset-0 w-full h-full z-0"
@@ -75,45 +75,11 @@ const BlogLinks = () => {
)
}
const PencilSvg = () => (
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M3.21792 11.2469L11.8015 2.66333L14.0953 4.95709L5.51167 13.5407M3.21792 11.2469L2.34219 14.4164L5.51167 13.5407M3.21792 11.2469L5.51167 13.5407"
// stroke="#6453C5"
stroke="#A69DC9"
strokeMiterlimit="10"
strokeLinejoin="bevel"
/>
</svg>
)
const DocsSvg = () => (
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M4.96289 9.48618H10.9629M4.96289 7.48618H10.9629M4.96289 11.4862H8.96289M3 2.00034V13.9998H12.9996V5.60113L9.38156 2.00034H3ZM12.9644 5.58432L9.38004 2L9.38004 5.58432L12.9644 5.58432Z"
// stroke="#6453C5"
stroke="#A69DC9"
strokeMiterlimit="10"
stroke-linejoin="bevel"
/>
</svg>
)
const PlaySvg = () => (
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M13.4287 8L8.74762 10.7026L4.06653 13.4053L4.06653 8L4.06653 2.59474L8.74762 5.29737L13.4287 8Z"
// stroke="#6453C5"
stroke="#A69DC9"
strokeMiterlimit="10"
strokeLinejoin="bevel"
/>
</svg>
)
const defaultEase = [0.25, 0.25, 0, 1]
const defaultEase = [0.5, 0, 0.35, 1]
const hoverVariant = {
default: { scale: 1, ease: defaultEase, duration: 0.2 },
hover: {
scale: 1.05,
scale: 1.03,
transition: {
duration: 0.4,
ease: defaultEase,
@@ -1,32 +0,0 @@
import Image from 'next/image'
import React from 'react'
import days from '~/components/LaunchWeek/lw7_days'
const HackernewsShare = ({ url, title }: { url: string; title: string }) => {
const hackerNewsLink = `https://news.ycombinator.com/submitlink?u=${encodeURIComponent(
url
)}&t=${encodeURIComponent(title)}`
return (
<div className="flex gap-4 lg:gap-6">
<p className="text-lg">Start a conversation about this topic</p>
<a href={hackerNewsLink} target="_blank" rel="noopener noreferrer">
<svg
width="23"
height="23"
viewBox="0 0 23 23"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M22.7969 0.878906H0.703125V22.9727H22.7969V0.878906Z" fill="#A0A0A0" />
<path
d="M11.0093 13.3976L7.17969 6.25391H8.94719L11.1566 10.7463C11.1566 10.8199 11.2302 10.8936 11.3039 10.9672C11.3775 11.0409 11.3775 11.1145 11.4511 11.2618L11.5248 11.3355V11.4091C11.5984 11.5564 11.5984 11.6301 11.6721 11.7773C11.7457 11.851 11.7457 11.9983 11.8194 12.0719C11.893 11.851 12.0403 11.7037 12.114 11.4091C12.1876 11.1882 12.3349 10.9672 12.4822 10.7463L14.6916 6.25391H16.3118L12.4822 13.4712V18.0372H11.0093V13.3976Z"
fill="#1C1C1C"
/>
</svg>
</a>
</div>
)
}
export default HackernewsShare
@@ -97,6 +97,16 @@ const getDay2Motion = (index: number) => {
return undefined
}
}
const getDay3Motion = (index: number) => {
switch (index) {
case 1:
return scaleOpacityVariant
case 2:
return opacityVariant3
default:
return undefined
}
}
export default function LW7Releases() {
const [preRelease, day1, day2, day3, day4, day5] = days
@@ -233,7 +243,7 @@ export default function LW7Releases() {
<motion.div
className={`
relative overflow-hidden group/2 flex-1 flex flex-col items-center gap-5 lg:items-start justify-between
basis-1/2 lg:flex-shrink xl:basis-2/3 border border-[#232323] rounded-xl h-full py-10 sm:py-14 px-4 sm:px-8 lg:px-10 xs:text-2xl text-xl text-center shadow-lg
basis-1/2 lg:flex-shrink xl:basis-2/3 border border-[#232323] rounded-xl h-full py-10 sm:py-14 px-8 lg:px-10 xs:text-2xl text-xl text-center shadow-lg
`}
initial="default"
animate="default"
@@ -298,7 +308,7 @@ export default function LW7Releases() {
<motion.div
className={`
relative overflow-hidden group/3 flex-1 flex flex-col items-center justify-between
basis-1/2 lg:basis-1/3 border border-[#232323] rounded-xl h-full bg-no-repeat py-10 sm:py-14 px-4 sm:px-8 lg:px-10 text-2xl bg-contain shadow-lg
basis-1/2 lg:basis-1/3 border border-[#232323] rounded-xl h-full bg-no-repeat py-10 sm:py-14 px-8 lg:px-10 text-2xl bg-contain shadow-lg
`}
initial="default"
animate="default"
@@ -369,7 +379,7 @@ export default function LW7Releases() {
<motion.div
className={`
relative overflow-hidden group/2 flex-1 flex flex-col items-center gap-5 lg:items-start justify-between
w-full border border-[#232323] rounded-xl h-full p-14 xs:text-2xl text-xl text-center shadow-lg
w-full border border-[#232323] rounded-xl h-full px-8 lg:px-14 py-14 xs:text-2xl text-xl text-center shadow-lg
`}
initial="default"
animate="default"
@@ -379,7 +389,12 @@ export default function LW7Releases() {
<CartTitle>{day1.steps[0].title}</CartTitle>
<StyledArticleBadge className="lg:ml-2">New</StyledArticleBadge>
</div>
<SectionButtons docs={day1.steps[0].docs} blog={day1.steps[0].blog} />
<SectionButtons
docs={day1.steps[0].docs}
blog={day1.steps[0].blog}
video={day1.steps[0].video}
hackernews={day1.steps[0].hackernews}
/>
{day1.steps[0].bg_layers &&
day1.steps[0].bg_layers?.map((layer, i) =>
!!layer.lottie ? (
@@ -452,7 +467,7 @@ export default function LW7Releases() {
<motion.div
className={`
relative overflow-hidden group/2 flex-1 flex flex-col items-center gap-5 lg:items-start justify-between
w-full border rounded-xl h-full p-14 xs:text-2xl text-xl text-center shadow-lg
w-full border rounded-xl h-full px-8 lg:px-14 py-14 xs:text-2xl text-xl text-center shadow-lg
`}
initial="default"
animate="default"
@@ -462,7 +477,12 @@ export default function LW7Releases() {
<CartTitle>{day2.steps[0].title}</CartTitle>
<StyledArticleBadge className="lg:ml-2">New</StyledArticleBadge>
</div>
<SectionButtons docs={day2.steps[0].docs} blog={day2.steps[0].blog} />
<SectionButtons
docs={day2.steps[0].docs}
blog={day2.steps[0].blog}
video={day2.steps[0].video}
hackernews={day2.steps[0].hackernews}
/>
{day2.steps[0].bg_layers &&
day2.steps[0].bg_layers?.map((layer, i) =>
!!layer.lottie ? (
@@ -530,7 +550,77 @@ export default function LW7Releases() {
className="h-[79px]"
id={day3.d.toString()}
>
<div></div>
{day3.steps.length > 0 && (
<div className="h-[400px] flex flex-col gap-5 lg:flex-row">
<motion.div
className={`
relative overflow-hidden group/2 flex-1 flex flex-col items-center gap-5 lg:items-start justify-between
w-full border rounded-xl h-full px-8 lg:px-14 py-14 xs:text-2xl text-xl text-center shadow-lg
`}
initial="default"
animate="default"
whileHover="hover"
>
<div className="flex items-center text-center lg:text-left lg: justify-between flex-col-reverse lg:flex-row lg:justify-start gap-2 text-black dark:text-white">
<CartTitle>{day3.steps[0].title}</CartTitle>
<StyledArticleBadge className="lg:ml-2">Updated</StyledArticleBadge>
</div>
<SectionButtons
docs={day3.steps[0].docs}
blog={day3.steps[0].blog}
video={day3.steps[0].video}
/>
{day3.steps[0].bg_layers &&
day3.steps[0].bg_layers?.map((layer, i) =>
!!layer.lottie ? (
<div className="absolute inset-0 opacity-90 w-full h-full -z-10 transition-all duration-300">
<Lottie
style={{
position: 'absolute',
inset: 0,
width: '100%',
height: '100%',
}}
autoplay={true}
animationData={layer.lottie}
/>
</div>
) : (
!!layer.img && (
<motion.div
className={[
'absolute inset-0 w-full h-full -z-10',
i === 2 && '!mix-blend-overlay blur-2xl',
].join(' ')}
variants={getDay3Motion(i)}
>
<Image
src={
!!layer.mobileImg && isTablet
? (layer.mobileImg as any)
: layer.img
}
className={[
`
absolute opacity-90
w-full h-full -z-10 transition-all duration-300
`,
i === 5 && '',
].join(' ')}
layout="fill"
objectPosition={
!!layer.mobileImg && isTablet ? '50% 65%' : '80% 50%'
}
objectFit={!!layer.mobileImg && isTablet ? 'contain' : 'cover'}
quality={100}
/>
</motion.div>
)
)
)}
</motion.div>
</div>
)}
</Accordion.Item>
</div>
<div className="border-b border-[#232323] pb-3">
@@ -159,7 +159,7 @@ export const ChipLink = ({
target={target ?? '_self'}
rel="noopener"
className={[
'flex justify-between w-full min-h-[43px] sm:w-auto items-center border border-[#232323] bg-gradient-to-r text-white from-[#46444480] to-[#19191980] hover:from-[#4e4e4e80] hover:to-[#19191980] backdrop-blur-sm rounded-full text-sm py-2 pl-3 pr-2',
'flex justify-between w-full min-h-[43px] sm:w-auto items-center border border-[#232323] bg-gradient-to-r text-white from-[#46444490] to-[#19191980] hover:from-[#4e4e4e90] hover:to-[#19191980] backdrop-blur-xl rounded-full text-sm py-2 pl-3 pr-2',
className,
].join(' ')}
>
@@ -202,7 +202,7 @@ export const SectionButtons = ({
</ChipLink>
)}
{!!video && (
<ChipLink href={video}>
<ChipLink href={video} target="_blank">
Video
<div className="bg-[#313131] rounded-full inline-block p-1 ml-2">
<PlaySvg />
+40 -8
View File
@@ -5,7 +5,7 @@ const images = {
'0-ogImages-03-mobile': '/images/launchweek/seven/day0/ai-images/ai-image-text-input.png',
'0-ogImages-04': '/images/launchweek/seven/day0/ai-images/images/img_3.png',
'0-ogImages-05': '/images/launchweek/seven/day0/ai-images/ai-images-overlay.png',
'0-supavisor-01': '/images/launchweek/seven/day0/supavisor/supavisor_01.png',
'0-supavisor-01': '/images/launchweek/seven/day0/supavisor/supavisor_01.svg',
'0-supavisor-02': '/images/launchweek/seven/day0/supavisor/supavisor_02.svg',
'01-self-hosted-logs-01': '/images/launchweek/seven/day1/self-hosted-logs-base.jpg',
'01-self-hosted-logs-01-mobile':
@@ -23,6 +23,11 @@ const images = {
'/images/launchweek/seven/day2/self-hosted-edge-functions-001.png',
'02-self-hosted-edge-functions-02':
'/images/launchweek/seven/day2/self-hosted-edge-functions-002.png',
'03-storage-thumb': '/images/launchweek/seven/day3/storage-v3-thumb.png',
'03-storage-01': '/images/launchweek/seven/day3/storage-01.png',
'03-storage-02': '/images/launchweek/seven/day3/storage-02.png',
'03-storage-02-mobile': '/images/launchweek/seven/day3/storage-02-mobile.png',
'03-storage-03': '/images/launchweek/seven/day3/storage-03.png',
}
export interface WeekDayProps {
@@ -38,6 +43,7 @@ export interface WeekDayProps {
docs: string
steps: {
title: string
break_thumb_title?: boolean
blog?: string
docs?: string
description?: string
@@ -46,7 +52,7 @@ export interface WeekDayProps {
isNew?: boolean
thumb?: string
url?: string
youtube_id?: string
video?: string
bg_layers?: {
lottie?: any
img?: string
@@ -107,6 +113,8 @@ const days: WeekDayProps[] = [
title: 'Open Source Logging',
blog: '/blog/supabase-logs-self-hosted',
thumb: '/images/launchweek/seven/day1/self-hosted-logs-thumb.jpg',
video: 'https://www.youtube.com/watch?v=Ai2BjHV36Ng',
hackernews: 'https://news.ycombinator.com/item?id=35518786',
bg_layers: [
{
img: images['01-self-hosted-logs-01'],
@@ -129,11 +137,11 @@ const days: WeekDayProps[] = [
title: '',
shipped: true,
date: '11 Apr',
publishedAt: '2023-04-11T00:00:00.000-07:00',
publishedAt: '2023-04-11T07:00:00.000-07:00',
description: '',
d: 2,
dd: 'Tue',
youtube_id: '',
youtube_id: 'cPGxPl1lx4Y',
blogpost: '',
docs: '',
steps: [
@@ -141,6 +149,8 @@ const days: WeekDayProps[] = [
title: 'Self-hosted Deno Edge Functions',
blog: '/blog/edge-runtime-self-hosted-deno-functions',
thumb: images['02-self-hosted-edge-functions-thumb'],
video: 'https://www.youtube.com/watch?v=cPGxPl1lx4Y',
hackernews: 'https://news.ycombinator.com/item?id=30868849',
bg_layers: [
{
img: images['02-self-hosted-edge-functions-01'],
@@ -154,16 +164,38 @@ const days: WeekDayProps[] = [
},
{
title: '',
shipped: false,
shipped: true,
date: '12 Apr',
publishedAt: '2023-04-12T07:00:00.000-07:00',
publishedAt: '2023-04-12T00:00:00.000-07:00',
description: '',
d: 3,
dd: 'Wed',
youtube_id: '',
blogpost: '',
docs: '',
steps: [],
docs: '/docs/guides/storage/uploads#resumable-upload',
steps: [
{
title: 'Storage v3: Resumable Uploads with support for 50GB files',
break_thumb_title: true,
description: 'Resumable Uploads with support for 50GB files',
blog: '/blog/storage-v3-resumable-uploads',
thumb: images['03-storage-thumb'],
video: 'https://www.youtube.com/watch?v=pT2PcZFq_M0',
docs: '/docs/guides/storage/uploads#resumable-upload',
bg_layers: [
{
img: images['03-storage-01'],
},
{
img: images['03-storage-02'],
mobileImg: images['03-storage-02-mobile'],
},
{
img: images['03-storage-03'],
},
],
},
],
},
{
title: '',
+2
View File
@@ -1,7 +1,9 @@
import { useEffect, useState } from 'react'
import { useWindowSize } from 'react-use'
import { isBrowser } from '~/lib/helpers'
export function useMobileViewport(breakpoint = 768) {
if (!isBrowser) return
const [isMobile, setIsMobile] = useState(false)
const { width } = useWindowSize()
+2
View File
@@ -29,3 +29,5 @@ export const toPixels = (value: string | number) => {
return value
}
export const isBrowser = typeof window !== 'undefined'
+1 -1
View File
@@ -37,7 +37,7 @@ export default function MyApp({ Component, pageProps }: AppProps) {
* Send page telemetry on first page load
*/
if (router.isReady) {
handlePageTelemetry(router.route)
handlePageTelemetry(router.asPath)
}
}, [router.isReady])
+2 -2
View File
@@ -12,7 +12,7 @@ import DefaultLayout from '~/components/Layouts/Default'
import BlogLinks from '~/components/LaunchWeek/7/BlogLinks'
import { generateReadingTime } from '~/lib/helpers'
import ShareArticleActions from '~/components/Blog/ShareArticleActions'
import useActiveAnchors from '~/hooks/useActiveAnchors'
// import useActiveAnchors from '~/hooks/useActiveAnchors'
import mdxComponents from '~/lib/mdx/mdxComponents'
import { mdxSerialize } from '~/lib/mdx/mdxSerialize'
import { getAllPostSlugs, getPostdata, getSortedPosts } from '~/lib/posts'
@@ -208,7 +208,7 @@ function BlogPostPage(props: any) {
{author.map((author: any, i: number) => {
return (
<div className="mr-4 w-max" key={i}>
<Link href={author.author_url}>
<Link href={author.author_url} target="_blank">
<a className="cursor-pointer">
<div className="flex items-center gap-3">
{author.author_image_url && (
+6 -6
View File
@@ -5,42 +5,42 @@
<link>https://supabase.com</link>
<description>Latest news from Supabase</description>
<language>en</language>
<lastBuildDate>Wed, 15 Feb 2023 03:03:30 +0000</lastBuildDate>
<lastBuildDate>Wed, 15 Feb 2023 23:11:00 +0000</lastBuildDate>
<atom:link href="https://supabase.com/rss.xml" rel="self" type="application/rss+xml"/>
<item>
<guid>https://supabase.com/customers/happyteams</guid>
<title>HappyTeams unlocks better performance and reduces cost with Supabase.</title>
<link>https://supabase.com/customers/happyteams</link>
<description>How a bootstrapped startup migrated from Heroku to Supabase in 30 minutes and never looked back.</description>
<pubDate>Wed, 15 Feb 2023 03:03:30 +0000</pubDate>
<pubDate>Wed, 15 Feb 2023 23:11:00 +0000</pubDate>
</item>
<item>
<guid>https://supabase.com/customers/xendit</guid>
<title>Xendit use Supabase and create a full solution shipped to production in less than one week.</title>
<link>https://supabase.com/customers/xendit</link>
<description>As a payment processor, Xendit are responsible for verifying that all transactions are legal.</description>
<pubDate>Mon, 13 Feb 2023 03:03:30 +0000</pubDate>
<pubDate>Mon, 13 Feb 2023 23:11:00 +0000</pubDate>
</item>
<item>
<guid>https://supabase.com/customers/replenysh</guid>
<title>Replenysh uses Supabase to implement OTP in less than 24 hours.</title>
<link>https://supabase.com/customers/replenysh</link>
<description>With Supabase, Replenysh gets a slick auth experience, reduces DevOps overhead, and continues to scale with Postgres.</description>
<pubDate>Mon, 13 Feb 2023 03:03:30 +0000</pubDate>
<pubDate>Mon, 13 Feb 2023 23:11:00 +0000</pubDate>
</item>
<item>
<guid>https://supabase.com/customers/mobbin</guid>
<title>How Mobbin migrated 200,000 users from Firebase for a better authentication experience.</title>
<link>https://supabase.com/customers/mobbin</link>
<description>Mobbin helps over 200,000 creators globally search and view the latest design patterns from well-known apps.</description>
<pubDate>Mon, 13 Feb 2023 03:03:30 +0000</pubDate>
<pubDate>Mon, 13 Feb 2023 23:11:00 +0000</pubDate>
</item>
<item>
<guid>https://supabase.com/customers/epsilon3</guid>
<title>Epsilon3 digitize paper-based procedures in the space industry using telemetry data, simplifying testing and operations.</title>
<link>https://supabase.com/customers/epsilon3</link>
<description>Epsilon3 uses Supabase to help teams execute secure and reliable operations in an industry where project spend runs into the billions.</description>
<pubDate>Mon, 13 Feb 2023 03:03:30 +0000</pubDate>
<pubDate>Mon, 13 Feb 2023 23:11:00 +0000</pubDate>
</item>
</channel>
Binary file not shown.

After

Width:  |  Height:  |  Size: 426 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 KiB

@@ -0,0 +1,202 @@
<svg width="1385" height="401" viewBox="0 0 1385 401" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_29_6516)">
<rect width="1385" height="400" transform="translate(0 0.335938)" fill="#1B1B1D"/>
<g filter="url(#filter0_f_29_6516)">
<ellipse cx="390.351" cy="375.287" rx="390.351" ry="375.287" transform="matrix(0.978344 0.206986 0.206986 -0.978344 626.148 753.062)" fill="#1C0C60"/>
</g>
<g filter="url(#filter1_f_29_6516)">
<ellipse cx="188.31" cy="181.043" rx="188.31" ry="181.043" transform="matrix(0.978344 0.206986 0.206986 -0.978344 610.039 471.285)" fill="#310C60"/>
</g>
<g filter="url(#filter2_f_29_6516)">
<ellipse cx="1286.78" cy="-143.193" rx="639.69" ry="338.19" fill="#0A0A0A"/>
</g>
<g filter="url(#filter3_b_29_6516)">
<path d="M840.428 259.367C841.24 258.84 842.187 258.559 843.155 258.559H1645.54C1650.51 258.559 1652.43 265.037 1648.26 267.75L1469.05 384.318C1468.24 384.845 1467.29 385.126 1466.32 385.126H663.943C658.967 385.126 657.045 378.648 661.217 375.935L840.428 259.367Z" fill="url(#paint0_linear_29_6516)" fill-opacity="0.5"/>
<path d="M843.155 259.367H1645.54C1649.71 259.367 1651.32 264.798 1647.82 267.072L1468.61 383.64C1467.93 384.082 1467.14 384.318 1466.32 384.318H663.943C659.771 384.318 658.161 378.887 661.658 376.613L840.869 260.045C841.549 259.602 842.343 259.367 843.155 259.367Z" stroke="url(#paint1_linear_29_6516)" stroke-width="1.61682"/>
</g>
<g filter="url(#filter4_b_29_6516)">
<path d="M877.428 211.938C878.24 211.41 879.187 211.129 880.155 211.129H1578.54C1583.51 211.129 1585.43 217.607 1581.26 220.32L1402.05 336.888C1401.24 337.416 1400.29 337.697 1399.32 337.697H700.943C695.967 337.697 694.045 331.219 698.217 328.505L877.428 211.938Z" fill="url(#paint2_linear_29_6516)" fill-opacity="0.5"/>
<path d="M880.155 211.937H1578.54C1582.71 211.937 1584.32 217.368 1580.82 219.643L1401.61 336.21C1400.93 336.653 1400.14 336.888 1399.32 336.888H700.943C696.771 336.888 695.161 331.457 698.658 329.183L877.869 212.615C878.549 212.173 879.343 211.937 880.155 211.937Z" stroke="url(#paint3_linear_29_6516)" stroke-width="1.61682"/>
</g>
<g filter="url(#filter5_b_29_6516)">
<path d="M923.428 160.715C924.24 160.187 925.187 159.906 926.155 159.906H1608.54C1613.51 159.906 1615.43 166.384 1611.26 169.098L1432.05 285.665C1431.24 286.193 1430.29 286.474 1429.32 286.474H746.943C741.967 286.474 740.045 279.996 744.217 277.282L923.428 160.715Z" fill="url(#paint4_linear_29_6516)" fill-opacity="0.5"/>
<path d="M926.155 160.715H1608.54C1612.71 160.715 1614.32 166.145 1610.82 168.42L1431.61 284.988C1430.93 285.43 1430.14 285.665 1429.32 285.665H746.943C742.771 285.665 741.161 280.235 744.658 277.96L923.869 161.393C924.549 160.95 925.343 160.715 926.155 160.715Z" stroke="url(#paint5_linear_29_6516)" stroke-width="1.61682"/>
</g>
<g filter="url(#filter6_b_29_6516)">
<path d="M944.428 109.492C945.24 108.965 946.187 108.684 947.155 108.684H1597.54C1602.51 108.684 1604.43 115.162 1600.26 117.875L1421.05 234.443C1420.24 234.97 1419.29 235.251 1418.32 235.251H767.943C762.967 235.251 761.045 228.773 765.217 226.06L944.428 109.492Z" fill="url(#paint6_linear_29_6516)" fill-opacity="0.5"/>
<path d="M947.155 109.492H1597.54C1601.71 109.492 1603.32 114.923 1599.82 117.197L1420.61 233.765C1419.93 234.207 1419.14 234.443 1418.32 234.443H767.943C763.771 234.443 762.161 229.012 765.658 226.738L944.869 110.17C945.549 109.727 946.343 109.492 947.155 109.492Z" stroke="url(#paint7_linear_29_6516)" stroke-width="1.61682"/>
</g>
<g filter="url(#filter7_b_29_6516)">
<path d="M977.428 58.2735C978.24 57.7458 979.187 57.4648 980.155 57.4648H1614.54C1619.51 57.4648 1621.43 63.9428 1617.26 66.6562L1438.05 183.224C1437.24 183.752 1436.29 184.032 1435.32 184.032H800.943C795.967 184.032 794.045 177.554 798.217 174.841L977.428 58.2735Z" fill="url(#paint8_linear_29_6516)" fill-opacity="0.5"/>
<path d="M980.155 58.2733H1614.54C1618.71 58.2733 1620.32 63.7039 1616.82 65.9785L1437.61 182.546C1436.93 182.989 1436.14 183.224 1435.32 183.224H800.943C796.771 183.224 795.161 177.793 798.658 175.519L977.869 58.9512C978.549 58.5087 979.343 58.2733 980.155 58.2733Z" stroke="url(#paint9_linear_29_6516)" stroke-width="1.61682"/>
</g>
<g filter="url(#filter8_b_29_6516)">
<path d="M1062.12 -17.4609C1062.93 -17.9886 1063.88 -18.2695 1064.84 -18.2695H1739.71C1744.69 -18.2695 1746.61 -11.7915 1742.44 -9.07817L1525.53 132.005C1524.72 132.533 1523.78 132.814 1522.81 132.814H847.943C842.967 132.814 841.045 126.336 845.217 123.622L1062.12 -17.4609Z" fill="url(#paint10_linear_29_6516)" fill-opacity="0.5"/>
<path d="M1064.84 -17.4611H1739.71C1743.88 -17.4611 1745.49 -12.0305 1742 -9.75584L1525.09 131.327C1524.41 131.77 1523.62 132.005 1522.81 132.005H847.943C843.771 132.005 842.16 126.575 845.658 124.3L1062.56 -16.7832C1063.24 -17.2256 1064.03 -17.4611 1064.84 -17.4611Z" stroke="url(#paint11_linear_29_6516)" stroke-width="1.61682"/>
</g>
<g filter="url(#filter9_b_29_6516)">
<path d="M1064.43 -44.1679C1065.24 -44.6956 1066.19 -44.9766 1067.15 -44.9766H1629.54C1634.51 -44.9766 1636.43 -38.4986 1632.26 -35.7852L1453.05 80.7824C1452.24 81.3101 1451.29 81.591 1450.32 81.591H887.943C882.967 81.591 881.045 75.113 885.217 72.3997L1064.43 -44.1679Z" fill="url(#paint12_linear_29_6516)" fill-opacity="0.5"/>
<path d="M1067.15 -44.1682H1629.54C1633.71 -44.1682 1635.32 -38.7375 1631.82 -36.4629L1452.61 80.1047C1451.93 80.5471 1451.14 80.7826 1450.32 80.7826H887.943C883.771 80.7826 882.161 75.352 885.658 73.0773L1064.87 -43.4903C1065.55 -43.9327 1066.34 -44.1682 1067.15 -44.1682Z" stroke="url(#paint13_linear_29_6516)" stroke-width="1.61682"/>
</g>
<g filter="url(#filter10_b_29_6516)">
<path d="M1097.43 -86.9843C1098.24 -87.5121 1099.19 -87.793 1100.15 -87.793H1662.54C1667.51 -87.793 1669.43 -81.315 1665.26 -78.6016L1486.05 37.966C1485.24 38.4937 1484.29 38.7746 1483.32 38.7746H920.943C915.967 38.7746 914.045 32.2966 918.217 29.5833L1097.43 -86.9843Z" fill="url(#paint14_linear_29_6516)" fill-opacity="0.5"/>
<path d="M1100.15 -86.9846H1662.54C1666.71 -86.9846 1668.32 -81.5539 1664.82 -79.2793L1485.61 37.2883C1484.93 37.7307 1484.14 37.9662 1483.32 37.9662H920.943C916.771 37.9662 915.161 32.5356 918.658 30.2609L1097.87 -86.3067C1098.55 -86.7491 1099.34 -86.9846 1100.15 -86.9846Z" stroke="url(#paint15_linear_29_6516)" stroke-width="1.61682"/>
</g>
<g filter="url(#filter11_f_29_6516)">
<circle cx="1989.71" cy="96.2227" r="328.129" fill="#1C0C60"/>
</g>
<g filter="url(#filter12_f_29_6516)">
<ellipse cx="1427.95" cy="392.387" rx="377.102" ry="178.148" fill="#090320" fill-opacity="0.9"/>
</g>
</g>
<defs>
<filter id="filter0_f_29_6516" x="396.556" y="-208.7" width="1378.34" height="1350.8" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="149.688" result="effect1_foregroundBlur_29_6516"/>
</filter>
<filter id="filter1_f_29_6516" x="344.328" y="-147.634" width="974.833" height="961.548" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="149.688" result="effect1_foregroundBlur_29_6516"/>
</filter>
<filter id="filter2_f_29_6516" x="565.546" y="-562.923" width="1442.46" height="839.459" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="40.77" result="effect1_foregroundBlur_29_6516"/>
</filter>
<filter id="filter3_b_29_6516" x="645.999" y="245.624" width="1017.48" height="152.437" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="6.46728"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6516"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_29_6516" result="shape"/>
</filter>
<filter id="filter4_b_29_6516" x="682.999" y="198.194" width="913.48" height="152.437" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="6.46728"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6516"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_29_6516" result="shape"/>
</filter>
<filter id="filter5_b_29_6516" x="728.999" y="146.972" width="897.48" height="152.437" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="6.46728"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6516"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_29_6516" result="shape"/>
</filter>
<filter id="filter6_b_29_6516" x="749.999" y="95.749" width="865.48" height="152.437" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="6.46728"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6516"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_29_6516" result="shape"/>
</filter>
<filter id="filter7_b_29_6516" x="782.999" y="44.5303" width="849.48" height="152.437" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="6.46728"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6516"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_29_6516" result="shape"/>
</filter>
<filter id="filter8_b_29_6516" x="829.999" y="-31.2041" width="927.654" height="176.952" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="6.46728"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6516"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_29_6516" result="shape"/>
</filter>
<filter id="filter9_b_29_6516" x="869.999" y="-57.9111" width="777.48" height="152.437" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="6.46728"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6516"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_29_6516" result="shape"/>
</filter>
<filter id="filter10_b_29_6516" x="902.999" y="-100.728" width="777.48" height="152.437" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="6.46728"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6516"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_29_6516" result="shape"/>
</filter>
<filter id="filter11_f_29_6516" x="1289.59" y="-603.906" width="1400.26" height="1400.26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="186" result="effect1_foregroundBlur_29_6516"/>
</filter>
<filter id="filter12_f_29_6516" x="910.852" y="74.2383" width="1034.2" height="636.297" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="70" result="effect1_foregroundBlur_29_6516"/>
</filter>
<linearGradient id="paint0_linear_29_6516" x1="954.745" y1="193.631" x2="1101.67" y2="375.118" gradientUnits="userSpaceOnUse">
<stop stop-color="#BB93C5" stop-opacity="0"/>
<stop offset="0.197872" stop-color="#BB93C5" stop-opacity="0.19"/>
<stop offset="1" stop-color="#302642"/>
</linearGradient>
<linearGradient id="paint1_linear_29_6516" x1="1091.49" y1="385.127" x2="1153.85" y2="329.567" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint2_linear_29_6516" x1="831.745" y1="146.201" x2="978.672" y2="327.688" gradientUnits="userSpaceOnUse">
<stop stop-color="#BB93C5" stop-opacity="0"/>
<stop offset="0.197872" stop-color="#BB93C5" stop-opacity="0.19"/>
<stop offset="1" stop-color="#302642"/>
</linearGradient>
<linearGradient id="paint3_linear_29_6516" x1="968.486" y1="337.697" x2="1030.85" y2="282.137" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint4_linear_29_6516" x1="877.745" y1="94.9783" x2="1024.67" y2="276.465" gradientUnits="userSpaceOnUse">
<stop stop-color="#BB93C5" stop-opacity="0"/>
<stop offset="0.197872" stop-color="#BB93C5" stop-opacity="0.19"/>
<stop offset="1" stop-color="#302642"/>
</linearGradient>
<linearGradient id="paint5_linear_29_6516" x1="1014.49" y1="286.474" x2="1076.85" y2="230.914" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint6_linear_29_6516" x1="898.745" y1="43.7556" x2="1045.67" y2="225.242" gradientUnits="userSpaceOnUse">
<stop stop-color="#BB93C5" stop-opacity="0"/>
<stop offset="0.197872" stop-color="#BB93C5" stop-opacity="0.19"/>
<stop offset="1" stop-color="#302642"/>
</linearGradient>
<linearGradient id="paint7_linear_29_6516" x1="1035.49" y1="235.252" x2="1097.85" y2="179.692" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint8_linear_29_6516" x1="931.745" y1="-7.46315" x2="1078.67" y2="174.024" gradientUnits="userSpaceOnUse">
<stop stop-color="#BB93C5" stop-opacity="0"/>
<stop offset="0.197872" stop-color="#BB93C5" stop-opacity="0.19"/>
<stop offset="1" stop-color="#302642"/>
</linearGradient>
<linearGradient id="paint9_linear_29_6516" x1="876.893" y1="296.765" x2="1092.4" y2="280.302" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint10_linear_29_6516" x1="1007.35" y1="-95.7738" x2="1182.73" y2="120.866" gradientUnits="userSpaceOnUse">
<stop stop-color="#BB93C5" stop-opacity="0"/>
<stop offset="0.197872" stop-color="#BB93C5" stop-opacity="0.19"/>
<stop offset="1" stop-color="#302642"/>
</linearGradient>
<linearGradient id="paint11_linear_29_6516" x1="1170.57" y1="132.814" x2="1245.02" y2="66.4928" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint12_linear_29_6516" x1="1018.74" y1="-109.905" x2="1165.67" y2="71.5822" gradientUnits="userSpaceOnUse">
<stop stop-color="#BB93C5" stop-opacity="0"/>
<stop offset="0.197872" stop-color="#BB93C5" stop-opacity="0.19"/>
<stop offset="1" stop-color="#302642"/>
</linearGradient>
<linearGradient id="paint13_linear_29_6516" x1="1155.49" y1="81.5915" x2="1217.85" y2="26.0317" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint14_linear_29_6516" x1="1051.74" y1="-152.721" x2="1198.67" y2="28.7658" gradientUnits="userSpaceOnUse">
<stop stop-color="#BB93C5" stop-opacity="0"/>
<stop offset="0.197872" stop-color="#BB93C5" stop-opacity="0.19"/>
<stop offset="1" stop-color="#302642"/>
</linearGradient>
<linearGradient id="paint15_linear_29_6516" x1="1188.49" y1="38.7751" x2="1250.85" y2="-16.7847" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<clipPath id="clip0_29_6516">
<rect width="1385" height="400" fill="white" transform="translate(0 0.335938)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

@@ -0,0 +1,89 @@
<svg width="605" height="266" viewBox="0 0 605 266" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_bd_29_6596)">
<rect x="21" y="86" width="562" height="94.0781" rx="8" fill="url(#paint0_linear_29_6596)" fill-opacity="0.5" shape-rendering="crispEdges"/>
<g filter="url(#filter1_b_29_6596)">
<rect x="37" y="102" width="530" height="7.07812" rx="3.53906" fill="url(#paint1_linear_29_6596)"/>
</g>
<g filter="url(#filter2_b_29_6596)">
<rect x="37" y="102" width="67.1094" height="7.07812" rx="3.53906" fill="url(#paint2_linear_29_6596)"/>
</g>
<circle cx="57.3633" cy="144.078" r="17.3633" stroke="#281A38" stroke-width="5"/>
<path d="M74.7266 144.078C74.7266 134.489 66.9528 126.715 57.3633 126.715C47.7738 126.715 40 134.489 40 144.078C40 153.668 47.7738 161.441 57.3633 161.441" stroke="url(#paint3_linear_29_6596)" stroke-width="5" stroke-linecap="round"/>
<path d="M94.7591 138.258C96.4841 138.258 97.8139 137.18 97.8139 135.179V129.585H96.6399V135.143C96.6399 136.437 95.957 137.168 94.7591 137.168C93.5731 137.168 92.8663 136.437 92.8663 135.143V129.585H91.7043V135.179C91.7043 137.18 93.034 138.258 94.7591 138.258ZM100.785 140.354V137.299C101.097 137.815 101.768 138.234 102.654 138.234C104.343 138.234 105.338 136.904 105.338 135.191C105.338 133.514 104.415 132.184 102.69 132.184C101.756 132.184 101.073 132.639 100.761 133.214V132.316H99.6712V140.354H100.785ZM104.188 135.191C104.188 136.377 103.529 137.228 102.486 137.228C101.456 137.228 100.773 136.377 100.773 135.191C100.773 134.041 101.456 133.178 102.486 133.178C103.541 133.178 104.188 134.041 104.188 135.191ZM107.899 138.078V129.405H106.772V138.078H107.899ZM112.282 137.252C111.324 137.252 110.485 136.533 110.485 135.191C110.485 133.861 111.324 133.143 112.282 133.143C113.24 133.143 114.079 133.861 114.079 135.191C114.079 136.533 113.24 137.252 112.282 137.252ZM112.282 132.136C110.557 132.136 109.335 133.442 109.335 135.191C109.335 136.952 110.557 138.258 112.282 138.258C114.007 138.258 115.229 136.952 115.229 135.191C115.229 133.442 114.007 132.136 112.282 132.136ZM116.31 136.533C116.31 137.443 117.065 138.258 118.239 138.258C119.269 138.258 119.844 137.707 120.096 137.299C120.096 137.719 120.132 137.934 120.156 138.078H121.258C121.234 137.934 121.186 137.635 121.186 137.132V134.245C121.186 133.119 120.515 132.136 118.79 132.136C117.544 132.136 116.55 132.903 116.43 134.005L117.508 134.257C117.58 133.586 118.023 133.095 118.814 133.095C119.689 133.095 120.06 133.562 120.06 134.125C120.06 134.328 119.964 134.508 119.617 134.556L118.059 134.784C117.065 134.927 116.31 135.502 116.31 136.533ZM118.395 137.311C117.82 137.311 117.46 136.904 117.46 136.473C117.46 135.958 117.82 135.682 118.299 135.61L120.06 135.347V135.61C120.06 136.868 119.317 137.311 118.395 137.311ZM123.611 135.179C123.611 133.993 124.282 133.154 125.312 133.154C126.342 133.154 126.965 133.969 126.965 135.155C126.965 136.341 126.331 137.24 125.3 137.24C124.222 137.24 123.611 136.365 123.611 135.179ZM126.977 137.299C126.977 137.647 127.013 137.946 127.037 138.078H128.127C128.115 137.982 128.068 137.563 128.068 137.012V129.405H126.953V133.131C126.762 132.663 126.211 132.16 125.192 132.16C123.563 132.16 122.461 133.55 122.461 135.179C122.461 136.892 123.503 138.234 125.192 138.234C126.091 138.234 126.702 137.755 126.977 137.204V137.299ZM131.097 138.078V132.316H129.983V138.078H131.097ZM129.731 130.136C129.731 130.579 130.091 130.938 130.534 130.938C130.989 130.938 131.349 130.579 131.349 130.136C131.349 129.68 130.989 129.321 130.534 129.321C130.091 129.321 129.731 129.68 129.731 130.136ZM134.139 134.748C134.139 133.873 134.594 133.166 135.481 133.166C136.487 133.166 136.823 133.813 136.823 134.616V138.078H137.949V134.424C137.949 133.143 137.266 132.148 135.888 132.148C135.217 132.148 134.534 132.424 134.115 133.143V132.316H133.013V138.078H134.139V134.748ZM139.321 138.39C139.464 139.624 140.543 140.534 141.98 140.534C144.148 140.534 144.867 139.108 144.867 137.647V132.316H143.753V133.119C143.466 132.544 142.867 132.208 141.98 132.208C140.399 132.208 139.333 133.454 139.333 135.011C139.333 136.641 140.447 137.803 141.98 137.803C142.843 137.803 143.466 137.383 143.741 136.856V137.683C143.741 138.929 143.19 139.552 141.98 139.552C141.106 139.552 140.495 138.941 140.411 138.138L139.321 138.39ZM142.148 136.856C141.13 136.856 140.483 136.137 140.483 135.011C140.483 133.897 141.153 133.166 142.148 133.166C143.118 133.166 143.789 133.897 143.789 135.011C143.789 136.125 143.118 136.856 142.148 136.856Z" fill="#ECE3FF" fill-opacity="0.9"/>
<path d="M154.182 135.97C154.289 137.192 155.404 138.27 157.057 138.27C158.782 138.27 159.908 137.084 159.908 135.622C159.908 134.017 158.794 133.047 157.272 133.047C156.661 133.047 156.038 133.238 155.691 133.622L156.266 131.393H159.584V130.315H155.487L154.481 134.173C154.876 134.317 155.224 134.472 155.631 134.628C155.967 134.281 156.494 134.065 157.045 134.065C157.943 134.065 158.722 134.604 158.722 135.67C158.722 136.629 157.979 137.24 157.057 137.24C156.086 137.24 155.38 136.593 155.308 135.634L154.182 135.97ZM161.862 132.112C161.862 131.573 162.269 131.178 162.784 131.178C163.311 131.178 163.706 131.573 163.706 132.112C163.706 132.663 163.311 133.059 162.784 133.059C162.269 133.059 161.862 132.663 161.862 132.112ZM160.867 132.112C160.867 133.178 161.754 134.005 162.784 134.005C163.814 134.005 164.713 133.178 164.713 132.112C164.713 131.058 163.814 130.231 162.784 130.231C161.754 130.231 160.867 131.058 160.867 132.112ZM166.606 136.281C166.606 135.742 167.013 135.347 167.528 135.347C168.055 135.347 168.45 135.742 168.45 136.281C168.45 136.832 168.055 137.228 167.528 137.228C167.013 137.228 166.606 136.832 166.606 136.281ZM165.611 136.281C165.611 137.347 166.498 138.174 167.528 138.174C168.558 138.174 169.457 137.347 169.457 136.281C169.457 135.227 168.558 134.4 167.528 134.4C166.498 134.4 165.611 135.227 165.611 136.281ZM162.928 138.078L168.486 130.315H167.408L161.826 138.078H162.928Z" fill="#C6B3FF" fill-opacity="0.4"/>
<path d="M91.568 156.329H95.3775V158.078H96.5156V156.329H97.8453V155.239H96.5156V150.315H94.8984L91.568 154.975V156.329ZM95.3775 155.239H92.6462L95.3775 151.441V155.239ZM101.382 153.622C100.555 153.61 99.9444 153.107 99.9444 152.352C99.9444 151.657 100.507 151.106 101.382 151.106C102.256 151.106 102.82 151.657 102.82 152.352C102.82 153.107 102.209 153.61 101.382 153.622ZM101.382 157.24C100.34 157.24 99.7527 156.665 99.7527 155.934C99.7527 155.191 100.352 154.604 101.382 154.604C102.412 154.604 103.011 155.191 103.011 155.934C103.011 156.665 102.424 157.24 101.382 157.24ZM101.382 158.258C103.167 158.258 104.197 157.275 104.197 156.03C104.197 155.083 103.55 154.376 102.724 154.113C103.442 153.849 103.994 153.131 103.994 152.292C103.994 151.022 102.867 150.136 101.382 150.136C99.8965 150.136 98.7704 151.022 98.7704 152.292C98.7704 153.154 99.3334 153.849 100.04 154.113C99.2136 154.388 98.5667 155.083 98.5667 156.03C98.5667 157.275 99.597 158.258 101.382 158.258ZM114.986 158.078V149.585H113.416L110.398 156.497L107.403 149.585H105.809V158.078H106.971V151.465L109.846 158.078H110.925L113.824 151.465V158.078H114.986ZM117.146 149.585V158.078H120.116C121.674 158.078 122.74 157.108 122.74 155.766C122.74 154.82 122.177 153.957 121.207 153.718C121.949 153.442 122.476 152.795 122.476 151.885C122.476 150.543 121.53 149.585 119.913 149.585H117.146ZM118.32 153.298V150.615H119.733C120.703 150.615 121.29 151.142 121.29 151.945C121.29 152.735 120.727 153.298 119.781 153.298H118.32ZM118.32 157.048V154.305H119.997C121.027 154.305 121.542 154.88 121.542 155.694C121.542 156.521 120.895 157.048 119.949 157.048H118.32ZM129.695 157.252C128.737 157.252 127.898 156.533 127.898 155.191C127.898 153.861 128.737 153.143 129.695 153.143C130.653 153.143 131.492 153.861 131.492 155.191C131.492 156.533 130.653 157.252 129.695 157.252ZM129.695 152.136C127.97 152.136 126.748 153.442 126.748 155.191C126.748 156.952 127.97 158.258 129.695 158.258C131.42 158.258 132.642 156.952 132.642 155.191C132.642 153.442 131.42 152.136 129.695 152.136ZM136.982 153.334V152.316H135.592V151.405C135.592 150.615 136.107 150.423 136.503 150.423C136.79 150.423 136.934 150.471 136.994 150.495V149.489C136.946 149.453 136.706 149.369 136.323 149.369C135.281 149.369 134.43 150.064 134.43 151.346V152.316H133.364V153.334H134.43V158.078H135.592V153.334H136.982ZM143.556 158.078V150.315H142.526C142.346 151.154 141.603 151.753 140.525 151.777V152.603H142.406V158.078H143.556ZM146.268 154.197C146.268 153.011 146.484 152.172 146.951 151.681C147.251 151.37 147.634 151.178 148.185 151.178C148.736 151.178 149.12 151.37 149.419 151.681C149.886 152.172 150.102 153.011 150.102 154.197C150.102 155.383 149.886 156.221 149.419 156.712C149.12 157.024 148.736 157.216 148.185 157.216C147.634 157.216 147.251 157.024 146.951 156.712C146.484 156.221 146.268 155.383 146.268 154.197ZM145.106 154.197C145.106 155.263 145.286 156.245 145.801 157.012C146.304 157.767 147.083 158.258 148.185 158.258C149.287 158.258 150.066 157.767 150.569 157.012C151.084 156.245 151.264 155.263 151.264 154.197C151.264 153.131 151.084 152.148 150.569 151.381C150.066 150.627 149.287 150.136 148.185 150.136C147.083 150.136 146.304 150.627 145.801 151.381C145.286 152.148 145.106 153.131 145.106 154.197ZM153.568 154.197C153.568 153.011 153.784 152.172 154.251 151.681C154.551 151.37 154.934 151.178 155.485 151.178C156.036 151.178 156.42 151.37 156.719 151.681C157.186 152.172 157.402 153.011 157.402 154.197C157.402 155.383 157.186 156.221 156.719 156.712C156.42 157.024 156.036 157.216 155.485 157.216C154.934 157.216 154.551 157.024 154.251 156.712C153.784 156.221 153.568 155.383 153.568 154.197ZM152.406 154.197C152.406 155.263 152.586 156.245 153.101 157.012C153.604 157.767 154.383 158.258 155.485 158.258C156.587 158.258 157.366 157.767 157.869 157.012C158.384 156.245 158.564 155.263 158.564 154.197C158.564 153.131 158.384 152.148 157.869 151.381C157.366 150.627 156.587 150.136 155.485 150.136C154.383 150.136 153.604 150.627 153.101 151.381C152.586 152.148 152.406 153.131 152.406 154.197ZM160.869 154.197C160.869 153.011 161.084 152.172 161.551 151.681C161.851 151.37 162.234 151.178 162.785 151.178C163.336 151.178 163.72 151.37 164.019 151.681C164.486 152.172 164.702 153.011 164.702 154.197C164.702 155.383 164.486 156.221 164.019 156.712C163.72 157.024 163.336 157.216 162.785 157.216C162.234 157.216 161.851 157.024 161.551 156.712C161.084 156.221 160.869 155.383 160.869 154.197ZM159.707 154.197C159.707 155.263 159.886 156.245 160.401 157.012C160.904 157.767 161.683 158.258 162.785 158.258C163.887 158.258 164.666 157.767 165.169 157.012C165.684 156.245 165.864 155.263 165.864 154.197C165.864 153.131 165.684 152.148 165.169 151.381C164.666 150.627 163.887 150.136 162.785 150.136C161.683 150.136 160.904 150.627 160.401 151.381C159.886 152.148 159.707 153.131 159.707 154.197ZM176.721 158.078V149.585H175.151L172.133 156.497L169.138 149.585H167.544V158.078H168.706V151.465L171.581 158.078H172.66L175.559 151.465V158.078H176.721ZM178.Line truncated
<circle cx="556.805" cy="144.078" r="10.1953" fill="url(#paint4_linear_29_6596)" fill-opacity="0.2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M555.854 144.09L552.86 147.084L553.81 148.034L556.804 145.04L559.8 148.036L560.75 147.085L557.754 144.09L560.773 141.071L559.823 140.121L556.804 143.14L553.786 140.122L552.836 141.072L555.854 144.09Z" fill="url(#paint5_linear_29_6596)"/>
<rect x="21.596" y="86.596" width="560.808" height="92.8861" rx="7.40399" stroke="url(#paint6_linear_29_6596)" stroke-width="1.19202" shape-rendering="crispEdges"/>
</g>
<circle cx="531.043" cy="145.25" r="11.3086" fill="url(#paint7_linear_29_6596)" fill-opacity="0.5"/>
<circle cx="531.047" cy="145.25" r="10.1953" fill="url(#paint8_linear_29_6596)" fill-opacity="0.5"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M528.438 141.508V148.993H529.781V141.508H528.438ZM532.305 141.508V148.993H533.649V141.508H532.305Z" fill="url(#paint9_linear_29_6596)"/>
<defs>
<filter id="filter0_bd_29_6596" x="9" y="76.4639" width="586" height="119.614" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="4.76807"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6596"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="4"/>
<feGaussianBlur stdDeviation="6"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.0921438 0 0 0 0 0.0311458 0 0 0 0 0.191667 0 0 0 0.47 0"/>
<feBlend mode="normal" in2="effect1_backgroundBlur_29_6596" result="effect2_dropShadow_29_6596"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow_29_6596" result="shape"/>
</filter>
<filter id="filter1_b_29_6596" x="24.0654" y="89.0654" width="555.869" height="32.9472" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="6.46728"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6596"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_29_6596" result="shape"/>
</filter>
<filter id="filter2_b_29_6596" x="24.0654" y="89.0654" width="92.9785" height="32.9472" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="6.46728"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6596"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_29_6596" result="shape"/>
</filter>
<linearGradient id="paint0_linear_29_6596" x1="308.943" y1="-5.07963" x2="437.299" y2="208.145" gradientUnits="userSpaceOnUse">
<stop stop-color="#BB93C5" stop-opacity="0"/>
<stop offset="0.197872" stop-color="#BB93C5" stop-opacity="0.19"/>
<stop offset="1" stop-color="#302642"/>
</linearGradient>
<linearGradient id="paint1_linear_29_6596" x1="120.547" y1="109.078" x2="634.882" y2="109.078" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint2_linear_29_6596" x1="47.5788" y1="109.078" x2="112.705" y2="109.078" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint3_linear_29_6596" x1="70.551" y1="126.715" x2="55.9287" y2="158.901" gradientUnits="userSpaceOnUse">
<stop stop-color="#D696FF"/>
<stop offset="1" stop-color="#C770FF" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint4_linear_29_6596" x1="572.899" y1="122.227" x2="558.575" y2="161.593" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEDCFF"/>
<stop offset="1" stop-color="#FEDCFF" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint5_linear_29_6596" x1="563.07" y1="135.596" x2="557.521" y2="150.887" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEDCFF"/>
<stop offset="1" stop-color="#FEDCFF" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint6_linear_29_6596" x1="486.754" y1="180.078" x2="546.481" y2="108.52" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint7_linear_29_6596" x1="548.895" y1="121.013" x2="533.006" y2="164.677" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEDCFF"/>
<stop offset="1" stop-color="#FEDCFF" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint8_linear_29_6596" x1="547.142" y1="123.399" x2="532.817" y2="162.765" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEDCFF"/>
<stop offset="1" stop-color="#FEDCFF" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint9_linear_29_6596" x1="531.949" y1="142.765" x2="526.349" y2="153.672" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEDCFF"/>
<stop offset="1" stop-color="#FEDCFF" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

@@ -0,0 +1,89 @@
<svg width="1385" height="401" viewBox="0 0 1385 401" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_bd_29_6516)">
<rect x="656" y="161.996" width="562" height="94.0781" rx="8" fill="url(#paint0_linear_29_6516)" fill-opacity="0.5" shape-rendering="crispEdges"/>
<g filter="url(#filter1_b_29_6516)">
<rect x="672" y="177.996" width="530" height="7.07812" rx="3.53906" fill="url(#paint1_linear_29_6516)"/>
</g>
<g filter="url(#filter2_b_29_6516)">
<rect x="672" y="177.996" width="67.1094" height="7.07812" rx="3.53906" fill="url(#paint2_linear_29_6516)"/>
</g>
<circle cx="692.363" cy="220.074" r="17.3633" stroke="#281A38" stroke-width="5"/>
<path d="M709.727 220.074C709.727 210.485 701.953 202.711 692.363 202.711C682.774 202.711 675 210.485 675 220.074C675 229.664 682.774 237.438 692.363 237.438" stroke="url(#paint3_linear_29_6516)" stroke-width="5" stroke-linecap="round"/>
<path d="M729.759 214.254C731.484 214.254 732.814 213.176 732.814 211.175V205.581H731.64V211.139C731.64 212.433 730.957 213.164 729.759 213.164C728.573 213.164 727.866 212.433 727.866 211.139V205.581H726.704V211.175C726.704 213.176 728.034 214.254 729.759 214.254ZM735.785 216.35V213.296C736.097 213.811 736.768 214.23 737.654 214.23C739.343 214.23 740.338 212.9 740.338 211.187C740.338 209.51 739.415 208.18 737.69 208.18C736.756 208.18 736.073 208.635 735.761 209.21V208.312H734.671V216.35H735.785ZM739.188 211.187C739.188 212.373 738.529 213.224 737.486 213.224C736.456 213.224 735.773 212.373 735.773 211.187C735.773 210.037 736.456 209.175 737.486 209.175C738.541 209.175 739.188 210.037 739.188 211.187ZM742.899 214.074V205.401H741.772V214.074H742.899ZM747.282 213.248C746.324 213.248 745.485 212.529 745.485 211.187C745.485 209.857 746.324 209.139 747.282 209.139C748.24 209.139 749.079 209.857 749.079 211.187C749.079 212.529 748.24 213.248 747.282 213.248ZM747.282 208.132C745.557 208.132 744.335 209.438 744.335 211.187C744.335 212.948 745.557 214.254 747.282 214.254C749.007 214.254 750.229 212.948 750.229 211.187C750.229 209.438 749.007 208.132 747.282 208.132ZM751.31 212.529C751.31 213.439 752.065 214.254 753.239 214.254C754.269 214.254 754.844 213.703 755.096 213.296C755.096 213.715 755.132 213.93 755.156 214.074H756.258C756.234 213.93 756.186 213.631 756.186 213.128V210.241C756.186 209.115 755.515 208.132 753.79 208.132C752.544 208.132 751.55 208.899 751.43 210.001L752.508 210.253C752.58 209.582 753.023 209.091 753.814 209.091C754.689 209.091 755.06 209.558 755.06 210.121C755.06 210.325 754.964 210.504 754.617 210.552L753.059 210.78C752.065 210.924 751.31 211.499 751.31 212.529ZM753.395 213.308C752.82 213.308 752.46 212.9 752.46 212.469C752.46 211.954 752.82 211.678 753.299 211.606L755.06 211.343V211.606C755.06 212.864 754.317 213.308 753.395 213.308ZM758.611 211.175C758.611 209.989 759.282 209.151 760.312 209.151C761.342 209.151 761.965 209.965 761.965 211.151C761.965 212.337 761.331 213.236 760.3 213.236C759.222 213.236 758.611 212.361 758.611 211.175ZM761.977 213.296C761.977 213.643 762.013 213.942 762.037 214.074H763.127C763.115 213.978 763.068 213.559 763.068 213.008V205.401H761.953V209.127C761.762 208.659 761.211 208.156 760.192 208.156C758.563 208.156 757.461 209.546 757.461 211.175C757.461 212.888 758.503 214.23 760.192 214.23C761.091 214.23 761.702 213.751 761.977 213.2V213.296ZM766.097 214.074V208.312H764.983V214.074H766.097ZM764.731 206.132C764.731 206.575 765.091 206.934 765.534 206.934C765.989 206.934 766.349 206.575 766.349 206.132C766.349 205.676 765.989 205.317 765.534 205.317C765.091 205.317 764.731 205.676 764.731 206.132ZM769.139 210.744C769.139 209.869 769.594 209.163 770.481 209.163C771.487 209.163 771.823 209.809 771.823 210.612V214.074H772.949V210.42C772.949 209.139 772.266 208.144 770.888 208.144C770.217 208.144 769.534 208.42 769.115 209.139V208.312H768.013V214.074H769.139V210.744ZM774.321 214.386C774.464 215.62 775.543 216.53 776.98 216.53C779.148 216.53 779.867 215.104 779.867 213.643V208.312H778.753V209.115C778.466 208.54 777.867 208.204 776.98 208.204C775.399 208.204 774.333 209.45 774.333 211.007C774.333 212.637 775.447 213.799 776.98 213.799C777.843 213.799 778.466 213.379 778.741 212.852V213.679C778.741 214.925 778.19 215.548 776.98 215.548C776.106 215.548 775.495 214.937 775.411 214.134L774.321 214.386ZM777.148 212.852C776.13 212.852 775.483 212.134 775.483 211.007C775.483 209.893 776.153 209.163 777.148 209.163C778.118 209.163 778.789 209.893 778.789 211.007C778.789 212.122 778.118 212.852 777.148 212.852Z" fill="#ECE3FF" fill-opacity="0.9"/>
<path d="M789.182 211.966C789.289 213.188 790.404 214.266 792.057 214.266C793.782 214.266 794.908 213.08 794.908 211.618C794.908 210.013 793.794 209.043 792.272 209.043C791.661 209.043 791.038 209.234 790.691 209.618L791.266 207.39H794.584V206.311H790.487L789.481 210.169C789.876 210.313 790.224 210.468 790.631 210.624C790.967 210.277 791.494 210.061 792.045 210.061C792.943 210.061 793.722 210.6 793.722 211.666C793.722 212.625 792.979 213.236 792.057 213.236C791.086 213.236 790.38 212.589 790.308 211.63L789.182 211.966ZM796.862 208.108C796.862 207.569 797.269 207.174 797.784 207.174C798.311 207.174 798.706 207.569 798.706 208.108C798.706 208.659 798.311 209.055 797.784 209.055C797.269 209.055 796.862 208.659 796.862 208.108ZM795.867 208.108C795.867 209.175 796.754 210.001 797.784 210.001C798.814 210.001 799.713 209.175 799.713 208.108C799.713 207.054 798.814 206.228 797.784 206.228C796.754 206.228 795.867 207.054 795.867 208.108ZM801.606 212.277C801.606 211.738 802.013 211.343 802.528 211.343C803.055 211.343 803.45 211.738 803.45 212.277C803.45 212.828 803.055 213.224 802.528 213.224C802.013 213.224 801.606 212.828 801.606 212.277ZM800.611 212.277C800.611 213.343 801.498 214.17 802.528 214.17C803.558 214.17 804.457 213.343 804.457 212.277C804.457 211.223 803.558 210.396 802.528 210.396C801.498 210.396 800.611 211.223 800.611 212.277ZM797.928 214.074L803.486 206.311H802.408L796.826 214.074H797.928Z" fill="#C6B3FF" fill-opacity="0.4"/>
<path d="M726.568 232.325H730.378V234.074H731.516V232.325H732.845V231.235H731.516V226.311H729.898L726.568 230.971V232.325ZM730.378 231.235H727.646L730.378 227.437V231.235ZM736.382 229.618C735.555 229.606 734.944 229.103 734.944 228.348C734.944 227.653 735.507 227.102 736.382 227.102C737.256 227.102 737.82 227.653 737.82 228.348C737.82 229.103 737.209 229.606 736.382 229.618ZM736.382 233.236C735.34 233.236 734.753 232.661 734.753 231.93C734.753 231.187 735.352 230.6 736.382 230.6C737.412 230.6 738.011 231.187 738.011 231.93C738.011 232.661 737.424 233.236 736.382 233.236ZM736.382 234.254C738.167 234.254 739.197 233.272 739.197 232.026C739.197 231.079 738.55 230.373 737.724 230.109C738.442 229.845 738.994 229.127 738.994 228.288C738.994 227.018 737.867 226.132 736.382 226.132C734.896 226.132 733.77 227.018 733.77 228.288C733.77 229.151 734.333 229.845 735.04 230.109C734.214 230.384 733.567 231.079 733.567 232.026C733.567 233.272 734.597 234.254 736.382 234.254ZM749.986 234.074V225.581H748.416L745.398 232.493L742.403 225.581H740.809V234.074H741.971V227.461L744.846 234.074H745.925L748.824 227.461V234.074H749.986ZM752.146 225.581V234.074H755.116C756.674 234.074 757.74 233.104 757.74 231.762C757.74 230.816 757.177 229.953 756.207 229.714C756.949 229.438 757.476 228.791 757.476 227.881C757.476 226.539 756.53 225.581 754.913 225.581H752.146ZM753.32 229.294V226.611H754.733C755.703 226.611 756.29 227.138 756.29 227.941C756.29 228.731 755.727 229.294 754.781 229.294H753.32ZM753.32 233.044V230.301H754.997C756.027 230.301 756.542 230.876 756.542 231.69C756.542 232.517 755.895 233.044 754.949 233.044H753.32ZM764.695 233.248C763.737 233.248 762.898 232.529 762.898 231.187C762.898 229.857 763.737 229.139 764.695 229.139C765.653 229.139 766.492 229.857 766.492 231.187C766.492 232.529 765.653 233.248 764.695 233.248ZM764.695 228.132C762.97 228.132 761.748 229.438 761.748 231.187C761.748 232.948 762.97 234.254 764.695 234.254C766.42 234.254 767.642 232.948 767.642 231.187C767.642 229.438 766.42 228.132 764.695 228.132ZM771.982 229.33V228.312H770.592V227.402C770.592 226.611 771.107 226.419 771.503 226.419C771.79 226.419 771.934 226.467 771.994 226.491V225.485C771.946 225.449 771.706 225.365 771.323 225.365C770.281 225.365 769.43 226.06 769.43 227.342V228.312H768.364V229.33H769.43V234.074H770.592V229.33H771.982ZM778.556 234.074V226.311H777.526C777.346 227.15 776.603 227.749 775.525 227.773V228.6H777.406V234.074H778.556ZM781.268 230.193C781.268 229.007 781.484 228.168 781.951 227.677C782.251 227.366 782.634 227.174 783.185 227.174C783.736 227.174 784.12 227.366 784.419 227.677C784.886 228.168 785.102 229.007 785.102 230.193C785.102 231.379 784.886 232.217 784.419 232.709C784.12 233.02 783.736 233.212 783.185 233.212C782.634 233.212 782.251 233.02 781.951 232.709C781.484 232.217 781.268 231.379 781.268 230.193ZM780.106 230.193C780.106 231.259 780.286 232.241 780.801 233.008C781.304 233.763 782.083 234.254 783.185 234.254C784.287 234.254 785.066 233.763 785.569 233.008C786.084 232.241 786.264 231.259 786.264 230.193C786.264 229.127 786.084 228.144 785.569 227.378C785.066 226.623 784.287 226.132 783.185 226.132C782.083 226.132 781.304 226.623 780.801 227.378C780.286 228.144 780.106 229.127 780.106 230.193ZM788.568 230.193C788.568 229.007 788.784 228.168 789.251 227.677C789.551 227.366 789.934 227.174 790.485 227.174C791.036 227.174 791.42 227.366 791.719 227.677C792.186 228.168 792.402 229.007 792.402 230.193C792.402 231.379 792.186 232.217 791.719 232.709C791.42 233.02 791.036 233.212 790.485 233.212C789.934 233.212 789.551 233.02 789.251 232.709C788.784 232.217 788.568 231.379 788.568 230.193ZM787.406 230.193C787.406 231.259 787.586 232.241 788.101 233.008C788.604 233.763 789.383 234.254 790.485 234.254C791.587 234.254 792.366 233.763 792.869 233.008C793.384 232.241 793.564 231.259 793.564 230.193C793.564 229.127 793.384 228.144 792.869 227.378C792.366 226.623 791.587 226.132 790.485 226.132C789.383 226.132 788.604 226.623 788.101 227.378C787.586 228.144 787.406 229.127 787.406 230.193ZM795.869 230.193C795.869 229.007 796.084 228.168 796.551 227.677C796.851 227.366 797.234 227.174 797.785 227.174C798.336 227.174 798.72 227.366 799.019 227.677C799.486 228.168 799.702 229.007 799.702 230.193C799.702 231.379 799.486 232.217 799.019 232.709C798.72 233.02 798.336 233.212 797.785 233.212C797.234 233.212 796.851 233.02 796.551 232.709C796.084 232.217 795.869 231.379 795.869 230.193ZM794.707 230.193C794.707 231.259 794.886 232.241 795.401 233.008C795.904 233.763 796.683 234.254 797.785 234.254C798.887 234.254 799.666 233.763 800.169 233.008C800.684 232.241 800.864 231.259 800.864 230.193C800.864 229.127 800.684 228.144 800.169 227.378C799.666 226.623 798.887 226.132 797.785 226.132C796.683 226.132 795.904 226.623 795.401 227.378C794.886 228.144 794.707 229.127 794.707 230.193ZM811.721 234.074V225.581H810.151L807.133 232.493L804.138 225.581H802.544V234.074H803.706V227.461L806.581 234.074H807.66L810.559 227.461V234.074H811.721ZM813.881 22Line truncated
<circle cx="1191.8" cy="220.074" r="10.1953" fill="url(#paint4_linear_29_6516)" fill-opacity="0.2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1190.85 220.086L1187.86 223.08L1188.81 224.03L1191.8 221.036L1194.8 224.032L1195.75 223.082L1192.75 220.086L1195.77 217.067L1194.82 216.117L1191.8 219.136L1188.79 216.118L1187.84 217.068L1190.85 220.086Z" fill="url(#paint5_linear_29_6516)"/>
<rect x="656.596" y="162.592" width="560.808" height="92.8861" rx="7.40399" stroke="url(#paint6_linear_29_6516)" stroke-width="1.19202" shape-rendering="crispEdges"/>
</g>
<circle cx="1166.04" cy="221.246" r="11.3086" fill="url(#paint7_linear_29_6516)" fill-opacity="0.5"/>
<circle cx="1166.05" cy="221.246" r="10.1953" fill="url(#paint8_linear_29_6516)" fill-opacity="0.5"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1163.44 217.504V224.99H1164.78V217.504H1163.44ZM1167.3 217.504V224.99H1168.65V217.504H1167.3Z" fill="url(#paint9_linear_29_6516)"/>
<defs>
<filter id="filter0_bd_29_6516" x="644" y="152.46" width="586" height="119.614" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="4.76807"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6516"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="4"/>
<feGaussianBlur stdDeviation="6"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.0921438 0 0 0 0 0.0311458 0 0 0 0 0.191667 0 0 0 0.47 0"/>
<feBlend mode="normal" in2="effect1_backgroundBlur_29_6516" result="effect2_dropShadow_29_6516"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow_29_6516" result="shape"/>
</filter>
<filter id="filter1_b_29_6516" x="659.065" y="165.062" width="555.869" height="32.9472" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="6.46728"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6516"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_29_6516" result="shape"/>
</filter>
<filter id="filter2_b_29_6516" x="659.065" y="165.062" width="92.9785" height="32.9472" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="6.46728"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_29_6516"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_29_6516" result="shape"/>
</filter>
<linearGradient id="paint0_linear_29_6516" x1="943.943" y1="70.9165" x2="1072.3" y2="284.142" gradientUnits="userSpaceOnUse">
<stop stop-color="#BB93C5" stop-opacity="0"/>
<stop offset="0.197872" stop-color="#BB93C5" stop-opacity="0.19"/>
<stop offset="1" stop-color="#302642"/>
</linearGradient>
<linearGradient id="paint1_linear_29_6516" x1="755.547" y1="185.074" x2="1269.88" y2="185.074" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint2_linear_29_6516" x1="682.579" y1="185.074" x2="747.705" y2="185.074" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint3_linear_29_6516" x1="705.551" y1="202.711" x2="690.929" y2="234.897" gradientUnits="userSpaceOnUse">
<stop stop-color="#D696FF"/>
<stop offset="1" stop-color="#C770FF" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint4_linear_29_6516" x1="1207.9" y1="198.223" x2="1193.57" y2="237.589" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEDCFF"/>
<stop offset="1" stop-color="#FEDCFF" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint5_linear_29_6516" x1="1198.07" y1="211.592" x2="1192.52" y2="226.883" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEDCFF"/>
<stop offset="1" stop-color="#FEDCFF" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint6_linear_29_6516" x1="1121.75" y1="256.074" x2="1181.48" y2="184.516" gradientUnits="userSpaceOnUse">
<stop stop-color="#D478FF" stop-opacity="0.05"/>
<stop offset="1" stop-color="#D782FF" stop-opacity="0.74"/>
</linearGradient>
<linearGradient id="paint7_linear_29_6516" x1="1183.9" y1="197.009" x2="1168.01" y2="240.674" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEDCFF"/>
<stop offset="1" stop-color="#FEDCFF" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint8_linear_29_6516" x1="1182.14" y1="199.395" x2="1167.82" y2="238.761" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEDCFF"/>
<stop offset="1" stop-color="#FEDCFF" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint9_linear_29_6516" x1="1166.95" y1="218.761" x2="1161.35" y2="229.668" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEDCFF"/>
<stop offset="1" stop-color="#FEDCFF" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 KiB

@@ -0,0 +1,17 @@
<svg width="1385" height="401" viewBox="0 0 1385 401" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_29_6516)">
<g style="mix-blend-mode:overlay" filter="url(#filter0_f_29_6516)">
<ellipse cx="1126.31" cy="240.814" rx="475.082" ry="107.373" transform="rotate(-30.3049 1126.31 240.814)" fill="#CACACA" fill-opacity="0.9"/>
</g>
</g>
<defs>
<filter id="filter0_f_29_6516" x="684.539" y="-44.2816" width="883.548" height="570.191" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="14" result="effect1_foregroundBlur_29_6516"/>
</filter>
<clipPath id="clip0_29_6516">
<rect width="1385" height="400" fill="white" transform="translate(0 0.335938)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 884 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

+279 -273
View File
@@ -54,27 +54,27 @@
"dev": true
},
"node_modules/@miniflare/cache": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/cache/-/cache-2.11.0.tgz",
"integrity": "sha512-L/kc9AzidPwFuk2fwHpAEePi0kNBk6FWUq3ln+9beRCDrPEpfVrDRFpNleF1NFZz5//oeVMuo8F0IVUQGzR7+Q==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/cache/-/cache-2.13.0.tgz",
"integrity": "sha512-y3SdN3SVyPECWmLAEGkkrv0RB+LugEPs/FeXn8QtN9aE1vyj69clOAgmsDzoh1DpFfFsLKRiv05aWs4m79P8Xw==",
"dev": true,
"dependencies": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0",
"http-cache-semantics": "^4.1.0",
"undici": "5.9.1"
"undici": "5.20.0"
},
"engines": {
"node": ">=16.13"
}
},
"node_modules/@miniflare/cli-parser": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/cli-parser/-/cli-parser-2.11.0.tgz",
"integrity": "sha512-JUmyRzEGAS6CouvXJwBh8p44onfw3KRpfq5JGXEuHModOGjTp6li7PQyCTNPV2Hv/7StAXWnTFGXeAqyDHuTig==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/cli-parser/-/cli-parser-2.13.0.tgz",
"integrity": "sha512-Nx1PIfuMZ3mK9Dg/JojWZAjHR16h1pcdCFSqYln/ME7y5ifx+P1E5UkShWUQ1cBlibNaltjbJ2n/7stSAsIGPQ==",
"dev": true,
"dependencies": {
"@miniflare/shared": "2.11.0",
"@miniflare/shared": "2.13.0",
"kleur": "^4.1.4"
},
"engines": {
@@ -82,20 +82,20 @@
}
},
"node_modules/@miniflare/core": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/core/-/core-2.11.0.tgz",
"integrity": "sha512-UFMFiCG0co36VpZkgFrSBnrxo71uf1x+cjlzzJi3khmMyDlnLu4RuIQsAqvKbYom6fi3G9Q8lTgM7JuOXFyjhw==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/core/-/core-2.13.0.tgz",
"integrity": "sha512-YJ/C0J3k+7xn4gvlMpvePnM3xC8nOnkweW96cc0IA8kJ1JSmScOO2tZ7rrU1RyDgp6StkAtQBw4yC0wYeFycBw==",
"dev": true,
"dependencies": {
"@iarna/toml": "^2.2.5",
"@miniflare/queues": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/watcher": "2.11.0",
"@miniflare/queues": "2.13.0",
"@miniflare/shared": "2.13.0",
"@miniflare/watcher": "2.13.0",
"busboy": "^1.6.0",
"dotenv": "^10.0.0",
"kleur": "^4.1.4",
"set-cookie-parser": "^2.4.8",
"undici": "5.9.1",
"undici": "5.20.0",
"urlpattern-polyfill": "^4.0.3"
},
"engines": {
@@ -103,60 +103,60 @@
}
},
"node_modules/@miniflare/d1": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/d1/-/d1-2.11.0.tgz",
"integrity": "sha512-aDdBVQZ2C0Zs3+Y9ZbRctmuQxozPfpumwJ/6NG6fBadANvune/hW7ddEoxyteIEU9W3IgzVj8s4by4VvasX90A==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/d1/-/d1-2.13.0.tgz",
"integrity": "sha512-OslqjO8iTcvzyrC0spByftMboRmHJEyHyTHnlKkjWDGdQQztEOjso2Xj+3I4SZIeUYvbzDRhKLS2QXI9a8LS5A==",
"dev": true,
"dependencies": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0"
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0"
},
"engines": {
"node": ">=16.7"
}
},
"node_modules/@miniflare/durable-objects": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/durable-objects/-/durable-objects-2.11.0.tgz",
"integrity": "sha512-0cKJaMgraTEU1b4kqK8cjD2oTeOjA6QU3Y+lWiZT/k1PMHZULovrSFnjii7qZ8npf4VHSIN6XYPxhyxRyEM65Q==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/durable-objects/-/durable-objects-2.13.0.tgz",
"integrity": "sha512-CRGVBPO9vY4Fc3aV+pdPRVVeYIt64vQqvw+BJbyW+TQtqVP2CGQeziJGnCfcONNNKyooZxGyUkHewUypyH+Qhg==",
"dev": true,
"dependencies": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/storage-memory": "2.11.0",
"undici": "5.9.1"
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0",
"@miniflare/storage-memory": "2.13.0",
"undici": "5.20.0"
},
"engines": {
"node": ">=16.13"
}
},
"node_modules/@miniflare/html-rewriter": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/html-rewriter/-/html-rewriter-2.11.0.tgz",
"integrity": "sha512-olTqmuYTHnoTNtiA0vjQ/ixRfbwgPzDrAUbtXDCYW45VFbHfDVJrJGZX3Jg0HpSlxy86Zclle1SUxGbVDzxsBg==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/html-rewriter/-/html-rewriter-2.13.0.tgz",
"integrity": "sha512-XhN7Icyzvtvu+o/A0hrnSiSmla78seCaNwQ9M1TDHxt352I/ahPX4wtPXs6GbKqY0/i+V6yoG2KGFRQ/j59cQQ==",
"dev": true,
"dependencies": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0",
"html-rewriter-wasm": "^0.4.1",
"undici": "5.9.1"
"undici": "5.20.0"
},
"engines": {
"node": ">=16.13"
}
},
"node_modules/@miniflare/http-server": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/http-server/-/http-server-2.11.0.tgz",
"integrity": "sha512-sMLcrDFzqqAvnQmAUH0hRTo8sBjW79VZYfnIH5FAGSGcKX6kdAGs9RStdYZ4CftQCBAEQScX0KBsMx5FwJRe9Q==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/http-server/-/http-server-2.13.0.tgz",
"integrity": "sha512-aMS/nUMTKP15hKnyZboeuWCiqmNrrCu+XRBY/TxDDl07iXcLpiHGf3oVv+yXxXkWlJHJVCbK7i/nXSNPllRMSw==",
"dev": true,
"dependencies": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/web-sockets": "2.11.0",
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0",
"@miniflare/web-sockets": "2.13.0",
"kleur": "^4.1.4",
"selfsigned": "^2.0.0",
"undici": "5.9.1",
"undici": "5.20.0",
"ws": "^8.2.2",
"youch": "^2.2.2"
},
@@ -165,62 +165,62 @@
}
},
"node_modules/@miniflare/kv": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/kv/-/kv-2.11.0.tgz",
"integrity": "sha512-3m9dL2HBBN170V1JvwjjucR5zl4G3mlcsV6C1E7A2wLl2Z2TWvIx/tSY9hrhkD96dFnejwJ9qmPMbXMMuynhjg==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/kv/-/kv-2.13.0.tgz",
"integrity": "sha512-J0AS5x3g/YVOmHMxMAZs07nRXRvSo9jyuC0eikTBf+4AABvBIyvVYmdTjYNjCmr8O5smcfWBX5S27HelD3aAAQ==",
"dev": true,
"dependencies": {
"@miniflare/shared": "2.11.0"
"@miniflare/shared": "2.13.0"
},
"engines": {
"node": ">=16.13"
}
},
"node_modules/@miniflare/queues": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/queues/-/queues-2.11.0.tgz",
"integrity": "sha512-fLHjdrNLKhn0LZM/aii/9GsAttFd+lWlGzK8HOg1R0vhfKBwEub4zntjMmOfFbDm1ntc21tdMK7n3ldUphwh5w==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/queues/-/queues-2.13.0.tgz",
"integrity": "sha512-Gf/a6M1mJL03iOvNqh3JNahcBfvEMPHnO28n0gkCoyYWGvddIr9lwCdFIa0qwNJsC1fIDRxhPg8PZ5cQLBMwRA==",
"dev": true,
"dependencies": {
"@miniflare/shared": "2.11.0"
"@miniflare/shared": "2.13.0"
},
"engines": {
"node": ">=16.7"
}
},
"node_modules/@miniflare/r2": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/r2/-/r2-2.11.0.tgz",
"integrity": "sha512-MKuyJ/gGNsK3eWbGdygvozqcyaZhM3C6NGHvoaZwH503dwN569j5DpatTWiHGFeDeSu64VqcIsGehz05GDUaag==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/r2/-/r2-2.13.0.tgz",
"integrity": "sha512-/5k6GHOYMNV/oBtilV9HDXBkJUrx8oXVigG5vxbnzEGRXyVRmR+Glzu7mFT8JiE94XiEbXHk9Qvu1S5Dej3wBw==",
"dev": true,
"dependencies": {
"@miniflare/shared": "2.11.0",
"undici": "5.9.1"
"@miniflare/shared": "2.13.0",
"undici": "5.20.0"
},
"engines": {
"node": ">=16.13"
}
},
"node_modules/@miniflare/runner-vm": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/runner-vm/-/runner-vm-2.11.0.tgz",
"integrity": "sha512-bkVSuvCf5+VylqN8lTiLxIYqYcKFbl+BywZGwGQndPC/3wh42J00mM0jw4hRbvXgwuBhlUyCVpEXtYlftFFT/g==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/runner-vm/-/runner-vm-2.13.0.tgz",
"integrity": "sha512-VmKtF2cA8HmTuLXor1THWY0v+DmaobPct63iLcgWIaUdP3MIvL+9X8HDXFAviCR7bCTe6MKxckHkaOj0IE0aJQ==",
"dev": true,
"dependencies": {
"@miniflare/shared": "2.11.0"
"@miniflare/shared": "2.13.0"
},
"engines": {
"node": ">=16.13"
}
},
"node_modules/@miniflare/scheduler": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/scheduler/-/scheduler-2.11.0.tgz",
"integrity": "sha512-DPdzINhdWeS99eIicGoluMsD4pLTTAWNQbgCv3CTwgdKA3dxdvMSCkNqZzQLiALzvk9+rSfj46FlH++HE7o7/w==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/scheduler/-/scheduler-2.13.0.tgz",
"integrity": "sha512-AOaQanoR4NjVEzVGWHnrL15A7aMx+d9AKLJhSDF7KaP+4NrT2Wo2BQuXCpn5oStx3itOdlQpMfqQ139e/I8WhQ==",
"dev": true,
"dependencies": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0",
"cron-schedule": "^3.0.4"
},
"engines": {
@@ -228,14 +228,14 @@
}
},
"node_modules/@miniflare/shared": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/shared/-/shared-2.11.0.tgz",
"integrity": "sha512-fWMqq3ZkWAg+k7CnyzMV/rZHugwn+/JxvVzCxrtvxzwotTN547THlOxgZe8JAP23U9BiTxOfpTfnLvFEjAmegw==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/shared/-/shared-2.13.0.tgz",
"integrity": "sha512-m8YFQzKmbjberrV9hPzNcQjNCXxjTjXUpuNrIGjAJO7g+BDztUHaZbdd26H9maBDlkeiWxA3hf0mDyCT/6MCMA==",
"dev": true,
"dependencies": {
"@types/better-sqlite3": "^7.6.0",
"kleur": "^4.1.4",
"npx-import": "^1.1.3",
"npx-import": "^1.1.4",
"picomatch": "^2.3.1"
},
"engines": {
@@ -243,65 +243,65 @@
}
},
"node_modules/@miniflare/sites": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/sites/-/sites-2.11.0.tgz",
"integrity": "sha512-qbefKdWZUJgsdLf+kCw03sn3h/92LZgJAbkOpP6bCrfWkXlJ37EQXO4KWdhn4Ghc7A6GwU1s1I/mdB64B3AewQ==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/sites/-/sites-2.13.0.tgz",
"integrity": "sha512-/tuzIu00o6CF2tkSv01q02MgEShXBSKx85h9jwWvc+6u7prGacAOer0FA1YNRFbE+t9QIfutAkoPGMA9zYf8+Q==",
"dev": true,
"dependencies": {
"@miniflare/kv": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/storage-file": "2.11.0"
"@miniflare/kv": "2.13.0",
"@miniflare/shared": "2.13.0",
"@miniflare/storage-file": "2.13.0"
},
"engines": {
"node": ">=16.13"
}
},
"node_modules/@miniflare/storage-file": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/storage-file/-/storage-file-2.11.0.tgz",
"integrity": "sha512-beWF/lTX74x7AiaSB+xQxywPSNdhtEKvqDkRui8eOJ5kqN2o4UaleLKQGgqmCw3WyHRIsckV7If1qpbNiLtWMw==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/storage-file/-/storage-file-2.13.0.tgz",
"integrity": "sha512-LuAeAAY5046rq5U1eFLVkz+ppiFEWytWacpkQw92DvVKFFquZcXSj6WPxZF4rSs23WDk+rdcwuLekbb52aDR7A==",
"dev": true,
"dependencies": {
"@miniflare/shared": "2.11.0",
"@miniflare/storage-memory": "2.11.0"
"@miniflare/shared": "2.13.0",
"@miniflare/storage-memory": "2.13.0"
},
"engines": {
"node": ">=16.13"
}
},
"node_modules/@miniflare/storage-memory": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/storage-memory/-/storage-memory-2.11.0.tgz",
"integrity": "sha512-s0AhPww7fq/Jz80NbPb+ffhcVRKnfPi7H1dHTRTre2Ud23EVJjAWl2gat42x8NOT/Fu3/o/7A72DWQQJqfO98A==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/storage-memory/-/storage-memory-2.13.0.tgz",
"integrity": "sha512-FnkYcBNXa/ym1ksNilNZycg9WYYKo6cWKplVBeSthRon3e8QY6t3n7/XRseBUo7O6mhDybVTy4wNCP1R2nBiEw==",
"dev": true,
"dependencies": {
"@miniflare/shared": "2.11.0"
"@miniflare/shared": "2.13.0"
},
"engines": {
"node": ">=16.13"
}
},
"node_modules/@miniflare/watcher": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/watcher/-/watcher-2.11.0.tgz",
"integrity": "sha512-RUfjz2iYcsQXLcGySemJl98CJ2iierbWsPGWZhIVZI+NNhROkEy77g/Q+lvP2ATwexG3/dUSfdJ3P8aH+sI4Ig==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/watcher/-/watcher-2.13.0.tgz",
"integrity": "sha512-teAacWcpMStoBLbLae95IUaL5lPzjPlXa9lhK9CbRaio/KRMibTMRGWrYos3IVGQRZvklvLwcms/nTvgcdb6yw==",
"dev": true,
"dependencies": {
"@miniflare/shared": "2.11.0"
"@miniflare/shared": "2.13.0"
},
"engines": {
"node": ">=16.13"
}
},
"node_modules/@miniflare/web-sockets": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/web-sockets/-/web-sockets-2.11.0.tgz",
"integrity": "sha512-NC8RKrmxrO0hZmwpzn5g4hPGA2VblnFTIBobmWoxuK95eW49zfs7dtE/PyFs+blsGv3CjTIjHVSQ782K+C6HFA==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/web-sockets/-/web-sockets-2.13.0.tgz",
"integrity": "sha512-+U2/HCf+BetRIgjAnNQjkuN6UeAjQmXifhQC+7CCaX834XJhrKXoR6z2xr2xkg1qj0qQs4D2jWG0KzrO5OUpug==",
"dev": true,
"dependencies": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0",
"undici": "5.9.1",
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0",
"undici": "5.20.0",
"ws": "^8.2.2"
},
"engines": {
@@ -362,18 +362,18 @@
}
},
"node_modules/@types/better-sqlite3": {
"version": "7.6.3",
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.3.tgz",
"integrity": "sha512-YS64N9SNDT/NAvou3QNdzAu3E2om/W/0dhORimtPGLef+zSK5l1vDzfsWb4xgXOgfhtOI5ZDTRxnvRPb22AIVQ==",
"version": "7.6.4",
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.4.tgz",
"integrity": "sha512-dzrRZCYPXIXfSR1/surNbJ/grU3scTaygS0OMzjlGf71i9sc2fGyHPXXiXmEvNIoE0cGwsanEFMVJxPXmco9Eg==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/node": {
"version": "18.11.17",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz",
"integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==",
"version": "18.15.11",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz",
"integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==",
"dev": true
},
"node_modules/@types/phoenix": {
@@ -970,9 +970,9 @@
"dev": true
},
"node_modules/http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"dev": true
},
"node_modules/human-signals": {
@@ -1078,32 +1078,32 @@
}
},
"node_modules/miniflare": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/miniflare/-/miniflare-2.11.0.tgz",
"integrity": "sha512-QA18I1VQXdCo4nBtPJUcUDxW8c9xbc5ex5F61jwhkGVOISSnYdEheolESmjr8MYk28xwi0XD1ozS4rLaTONd+w==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/miniflare/-/miniflare-2.13.0.tgz",
"integrity": "sha512-ayNhVa4a6bZiOuHtrPmOt4BCYcmW1fBQ/+qGL85smq1m2OBBm3aUs6f4ISf38xH8tk+qewgmAywetyVtn6KHPw==",
"dev": true,
"dependencies": {
"@miniflare/cache": "2.11.0",
"@miniflare/cli-parser": "2.11.0",
"@miniflare/core": "2.11.0",
"@miniflare/d1": "2.11.0",
"@miniflare/durable-objects": "2.11.0",
"@miniflare/html-rewriter": "2.11.0",
"@miniflare/http-server": "2.11.0",
"@miniflare/kv": "2.11.0",
"@miniflare/queues": "2.11.0",
"@miniflare/r2": "2.11.0",
"@miniflare/runner-vm": "2.11.0",
"@miniflare/scheduler": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/sites": "2.11.0",
"@miniflare/storage-file": "2.11.0",
"@miniflare/storage-memory": "2.11.0",
"@miniflare/web-sockets": "2.11.0",
"@miniflare/cache": "2.13.0",
"@miniflare/cli-parser": "2.13.0",
"@miniflare/core": "2.13.0",
"@miniflare/d1": "2.13.0",
"@miniflare/durable-objects": "2.13.0",
"@miniflare/html-rewriter": "2.13.0",
"@miniflare/http-server": "2.13.0",
"@miniflare/kv": "2.13.0",
"@miniflare/queues": "2.13.0",
"@miniflare/r2": "2.13.0",
"@miniflare/runner-vm": "2.13.0",
"@miniflare/scheduler": "2.13.0",
"@miniflare/shared": "2.13.0",
"@miniflare/sites": "2.13.0",
"@miniflare/storage-file": "2.13.0",
"@miniflare/storage-memory": "2.13.0",
"@miniflare/web-sockets": "2.13.0",
"kleur": "^4.1.4",
"semiver": "^1.1.0",
"source-map-support": "^0.5.20",
"undici": "5.9.1"
"undici": "5.20.0"
},
"bin": {
"miniflare": "bootstrap.js"
@@ -1112,7 +1112,7 @@
"node": ">=16.13"
},
"peerDependencies": {
"@miniflare/storage-redis": "2.11.0",
"@miniflare/storage-redis": "2.13.0",
"cron-schedule": "^3.0.4",
"ioredis": "^4.27.9"
},
@@ -1336,9 +1336,9 @@
}
},
"node_modules/semver": {
"version": "7.3.8",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz",
"integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -1351,9 +1351,9 @@
}
},
"node_modules/set-cookie-parser": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz",
"integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==",
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz",
"integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==",
"dev": true
},
"node_modules/shebang-command": {
@@ -1457,10 +1457,13 @@
}
},
"node_modules/undici": {
"version": "5.9.1",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.9.1.tgz",
"integrity": "sha512-6fB3a+SNnWEm4CJbgo0/CWR8RGcOCQP68SF4X0mxtYTq2VNN8T88NYrWVBAeSX+zb7bny2dx2iYhP3XHi00omg==",
"version": "5.20.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz",
"integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==",
"dev": true,
"dependencies": {
"busboy": "^1.6.0"
},
"engines": {
"node": ">=12.18"
}
@@ -1570,16 +1573,16 @@
}
},
"node_modules/ws": {
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
"integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
"version": "8.13.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
"integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
"dev": true,
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": "^5.0.2"
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
@@ -1657,203 +1660,203 @@
"dev": true
},
"@miniflare/cache": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/cache/-/cache-2.11.0.tgz",
"integrity": "sha512-L/kc9AzidPwFuk2fwHpAEePi0kNBk6FWUq3ln+9beRCDrPEpfVrDRFpNleF1NFZz5//oeVMuo8F0IVUQGzR7+Q==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/cache/-/cache-2.13.0.tgz",
"integrity": "sha512-y3SdN3SVyPECWmLAEGkkrv0RB+LugEPs/FeXn8QtN9aE1vyj69clOAgmsDzoh1DpFfFsLKRiv05aWs4m79P8Xw==",
"dev": true,
"requires": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0",
"http-cache-semantics": "^4.1.0",
"undici": "5.9.1"
"undici": "5.20.0"
}
},
"@miniflare/cli-parser": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/cli-parser/-/cli-parser-2.11.0.tgz",
"integrity": "sha512-JUmyRzEGAS6CouvXJwBh8p44onfw3KRpfq5JGXEuHModOGjTp6li7PQyCTNPV2Hv/7StAXWnTFGXeAqyDHuTig==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/cli-parser/-/cli-parser-2.13.0.tgz",
"integrity": "sha512-Nx1PIfuMZ3mK9Dg/JojWZAjHR16h1pcdCFSqYln/ME7y5ifx+P1E5UkShWUQ1cBlibNaltjbJ2n/7stSAsIGPQ==",
"dev": true,
"requires": {
"@miniflare/shared": "2.11.0",
"@miniflare/shared": "2.13.0",
"kleur": "^4.1.4"
}
},
"@miniflare/core": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/core/-/core-2.11.0.tgz",
"integrity": "sha512-UFMFiCG0co36VpZkgFrSBnrxo71uf1x+cjlzzJi3khmMyDlnLu4RuIQsAqvKbYom6fi3G9Q8lTgM7JuOXFyjhw==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/core/-/core-2.13.0.tgz",
"integrity": "sha512-YJ/C0J3k+7xn4gvlMpvePnM3xC8nOnkweW96cc0IA8kJ1JSmScOO2tZ7rrU1RyDgp6StkAtQBw4yC0wYeFycBw==",
"dev": true,
"requires": {
"@iarna/toml": "^2.2.5",
"@miniflare/queues": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/watcher": "2.11.0",
"@miniflare/queues": "2.13.0",
"@miniflare/shared": "2.13.0",
"@miniflare/watcher": "2.13.0",
"busboy": "^1.6.0",
"dotenv": "^10.0.0",
"kleur": "^4.1.4",
"set-cookie-parser": "^2.4.8",
"undici": "5.9.1",
"undici": "5.20.0",
"urlpattern-polyfill": "^4.0.3"
}
},
"@miniflare/d1": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/d1/-/d1-2.11.0.tgz",
"integrity": "sha512-aDdBVQZ2C0Zs3+Y9ZbRctmuQxozPfpumwJ/6NG6fBadANvune/hW7ddEoxyteIEU9W3IgzVj8s4by4VvasX90A==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/d1/-/d1-2.13.0.tgz",
"integrity": "sha512-OslqjO8iTcvzyrC0spByftMboRmHJEyHyTHnlKkjWDGdQQztEOjso2Xj+3I4SZIeUYvbzDRhKLS2QXI9a8LS5A==",
"dev": true,
"requires": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0"
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0"
}
},
"@miniflare/durable-objects": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/durable-objects/-/durable-objects-2.11.0.tgz",
"integrity": "sha512-0cKJaMgraTEU1b4kqK8cjD2oTeOjA6QU3Y+lWiZT/k1PMHZULovrSFnjii7qZ8npf4VHSIN6XYPxhyxRyEM65Q==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/durable-objects/-/durable-objects-2.13.0.tgz",
"integrity": "sha512-CRGVBPO9vY4Fc3aV+pdPRVVeYIt64vQqvw+BJbyW+TQtqVP2CGQeziJGnCfcONNNKyooZxGyUkHewUypyH+Qhg==",
"dev": true,
"requires": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/storage-memory": "2.11.0",
"undici": "5.9.1"
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0",
"@miniflare/storage-memory": "2.13.0",
"undici": "5.20.0"
}
},
"@miniflare/html-rewriter": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/html-rewriter/-/html-rewriter-2.11.0.tgz",
"integrity": "sha512-olTqmuYTHnoTNtiA0vjQ/ixRfbwgPzDrAUbtXDCYW45VFbHfDVJrJGZX3Jg0HpSlxy86Zclle1SUxGbVDzxsBg==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/html-rewriter/-/html-rewriter-2.13.0.tgz",
"integrity": "sha512-XhN7Icyzvtvu+o/A0hrnSiSmla78seCaNwQ9M1TDHxt352I/ahPX4wtPXs6GbKqY0/i+V6yoG2KGFRQ/j59cQQ==",
"dev": true,
"requires": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0",
"html-rewriter-wasm": "^0.4.1",
"undici": "5.9.1"
"undici": "5.20.0"
}
},
"@miniflare/http-server": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/http-server/-/http-server-2.11.0.tgz",
"integrity": "sha512-sMLcrDFzqqAvnQmAUH0hRTo8sBjW79VZYfnIH5FAGSGcKX6kdAGs9RStdYZ4CftQCBAEQScX0KBsMx5FwJRe9Q==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/http-server/-/http-server-2.13.0.tgz",
"integrity": "sha512-aMS/nUMTKP15hKnyZboeuWCiqmNrrCu+XRBY/TxDDl07iXcLpiHGf3oVv+yXxXkWlJHJVCbK7i/nXSNPllRMSw==",
"dev": true,
"requires": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/web-sockets": "2.11.0",
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0",
"@miniflare/web-sockets": "2.13.0",
"kleur": "^4.1.4",
"selfsigned": "^2.0.0",
"undici": "5.9.1",
"undici": "5.20.0",
"ws": "^8.2.2",
"youch": "^2.2.2"
}
},
"@miniflare/kv": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/kv/-/kv-2.11.0.tgz",
"integrity": "sha512-3m9dL2HBBN170V1JvwjjucR5zl4G3mlcsV6C1E7A2wLl2Z2TWvIx/tSY9hrhkD96dFnejwJ9qmPMbXMMuynhjg==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/kv/-/kv-2.13.0.tgz",
"integrity": "sha512-J0AS5x3g/YVOmHMxMAZs07nRXRvSo9jyuC0eikTBf+4AABvBIyvVYmdTjYNjCmr8O5smcfWBX5S27HelD3aAAQ==",
"dev": true,
"requires": {
"@miniflare/shared": "2.11.0"
"@miniflare/shared": "2.13.0"
}
},
"@miniflare/queues": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/queues/-/queues-2.11.0.tgz",
"integrity": "sha512-fLHjdrNLKhn0LZM/aii/9GsAttFd+lWlGzK8HOg1R0vhfKBwEub4zntjMmOfFbDm1ntc21tdMK7n3ldUphwh5w==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/queues/-/queues-2.13.0.tgz",
"integrity": "sha512-Gf/a6M1mJL03iOvNqh3JNahcBfvEMPHnO28n0gkCoyYWGvddIr9lwCdFIa0qwNJsC1fIDRxhPg8PZ5cQLBMwRA==",
"dev": true,
"requires": {
"@miniflare/shared": "2.11.0"
"@miniflare/shared": "2.13.0"
}
},
"@miniflare/r2": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/r2/-/r2-2.11.0.tgz",
"integrity": "sha512-MKuyJ/gGNsK3eWbGdygvozqcyaZhM3C6NGHvoaZwH503dwN569j5DpatTWiHGFeDeSu64VqcIsGehz05GDUaag==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/r2/-/r2-2.13.0.tgz",
"integrity": "sha512-/5k6GHOYMNV/oBtilV9HDXBkJUrx8oXVigG5vxbnzEGRXyVRmR+Glzu7mFT8JiE94XiEbXHk9Qvu1S5Dej3wBw==",
"dev": true,
"requires": {
"@miniflare/shared": "2.11.0",
"undici": "5.9.1"
"@miniflare/shared": "2.13.0",
"undici": "5.20.0"
}
},
"@miniflare/runner-vm": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/runner-vm/-/runner-vm-2.11.0.tgz",
"integrity": "sha512-bkVSuvCf5+VylqN8lTiLxIYqYcKFbl+BywZGwGQndPC/3wh42J00mM0jw4hRbvXgwuBhlUyCVpEXtYlftFFT/g==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/runner-vm/-/runner-vm-2.13.0.tgz",
"integrity": "sha512-VmKtF2cA8HmTuLXor1THWY0v+DmaobPct63iLcgWIaUdP3MIvL+9X8HDXFAviCR7bCTe6MKxckHkaOj0IE0aJQ==",
"dev": true,
"requires": {
"@miniflare/shared": "2.11.0"
"@miniflare/shared": "2.13.0"
}
},
"@miniflare/scheduler": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/scheduler/-/scheduler-2.11.0.tgz",
"integrity": "sha512-DPdzINhdWeS99eIicGoluMsD4pLTTAWNQbgCv3CTwgdKA3dxdvMSCkNqZzQLiALzvk9+rSfj46FlH++HE7o7/w==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/scheduler/-/scheduler-2.13.0.tgz",
"integrity": "sha512-AOaQanoR4NjVEzVGWHnrL15A7aMx+d9AKLJhSDF7KaP+4NrT2Wo2BQuXCpn5oStx3itOdlQpMfqQ139e/I8WhQ==",
"dev": true,
"requires": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0",
"cron-schedule": "^3.0.4"
}
},
"@miniflare/shared": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/shared/-/shared-2.11.0.tgz",
"integrity": "sha512-fWMqq3ZkWAg+k7CnyzMV/rZHugwn+/JxvVzCxrtvxzwotTN547THlOxgZe8JAP23U9BiTxOfpTfnLvFEjAmegw==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/shared/-/shared-2.13.0.tgz",
"integrity": "sha512-m8YFQzKmbjberrV9hPzNcQjNCXxjTjXUpuNrIGjAJO7g+BDztUHaZbdd26H9maBDlkeiWxA3hf0mDyCT/6MCMA==",
"dev": true,
"requires": {
"@types/better-sqlite3": "^7.6.0",
"kleur": "^4.1.4",
"npx-import": "^1.1.3",
"npx-import": "^1.1.4",
"picomatch": "^2.3.1"
}
},
"@miniflare/sites": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/sites/-/sites-2.11.0.tgz",
"integrity": "sha512-qbefKdWZUJgsdLf+kCw03sn3h/92LZgJAbkOpP6bCrfWkXlJ37EQXO4KWdhn4Ghc7A6GwU1s1I/mdB64B3AewQ==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/sites/-/sites-2.13.0.tgz",
"integrity": "sha512-/tuzIu00o6CF2tkSv01q02MgEShXBSKx85h9jwWvc+6u7prGacAOer0FA1YNRFbE+t9QIfutAkoPGMA9zYf8+Q==",
"dev": true,
"requires": {
"@miniflare/kv": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/storage-file": "2.11.0"
"@miniflare/kv": "2.13.0",
"@miniflare/shared": "2.13.0",
"@miniflare/storage-file": "2.13.0"
}
},
"@miniflare/storage-file": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/storage-file/-/storage-file-2.11.0.tgz",
"integrity": "sha512-beWF/lTX74x7AiaSB+xQxywPSNdhtEKvqDkRui8eOJ5kqN2o4UaleLKQGgqmCw3WyHRIsckV7If1qpbNiLtWMw==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/storage-file/-/storage-file-2.13.0.tgz",
"integrity": "sha512-LuAeAAY5046rq5U1eFLVkz+ppiFEWytWacpkQw92DvVKFFquZcXSj6WPxZF4rSs23WDk+rdcwuLekbb52aDR7A==",
"dev": true,
"requires": {
"@miniflare/shared": "2.11.0",
"@miniflare/storage-memory": "2.11.0"
"@miniflare/shared": "2.13.0",
"@miniflare/storage-memory": "2.13.0"
}
},
"@miniflare/storage-memory": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/storage-memory/-/storage-memory-2.11.0.tgz",
"integrity": "sha512-s0AhPww7fq/Jz80NbPb+ffhcVRKnfPi7H1dHTRTre2Ud23EVJjAWl2gat42x8NOT/Fu3/o/7A72DWQQJqfO98A==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/storage-memory/-/storage-memory-2.13.0.tgz",
"integrity": "sha512-FnkYcBNXa/ym1ksNilNZycg9WYYKo6cWKplVBeSthRon3e8QY6t3n7/XRseBUo7O6mhDybVTy4wNCP1R2nBiEw==",
"dev": true,
"requires": {
"@miniflare/shared": "2.11.0"
"@miniflare/shared": "2.13.0"
}
},
"@miniflare/watcher": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/watcher/-/watcher-2.11.0.tgz",
"integrity": "sha512-RUfjz2iYcsQXLcGySemJl98CJ2iierbWsPGWZhIVZI+NNhROkEy77g/Q+lvP2ATwexG3/dUSfdJ3P8aH+sI4Ig==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/watcher/-/watcher-2.13.0.tgz",
"integrity": "sha512-teAacWcpMStoBLbLae95IUaL5lPzjPlXa9lhK9CbRaio/KRMibTMRGWrYos3IVGQRZvklvLwcms/nTvgcdb6yw==",
"dev": true,
"requires": {
"@miniflare/shared": "2.11.0"
"@miniflare/shared": "2.13.0"
}
},
"@miniflare/web-sockets": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@miniflare/web-sockets/-/web-sockets-2.11.0.tgz",
"integrity": "sha512-NC8RKrmxrO0hZmwpzn5g4hPGA2VblnFTIBobmWoxuK95eW49zfs7dtE/PyFs+blsGv3CjTIjHVSQ782K+C6HFA==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@miniflare/web-sockets/-/web-sockets-2.13.0.tgz",
"integrity": "sha512-+U2/HCf+BetRIgjAnNQjkuN6UeAjQmXifhQC+7CCaX834XJhrKXoR6z2xr2xkg1qj0qQs4D2jWG0KzrO5OUpug==",
"dev": true,
"requires": {
"@miniflare/core": "2.11.0",
"@miniflare/shared": "2.11.0",
"undici": "5.9.1",
"@miniflare/core": "2.13.0",
"@miniflare/shared": "2.13.0",
"undici": "5.20.0",
"ws": "^8.2.2"
}
},
@@ -1911,18 +1914,18 @@
}
},
"@types/better-sqlite3": {
"version": "7.6.3",
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.3.tgz",
"integrity": "sha512-YS64N9SNDT/NAvou3QNdzAu3E2om/W/0dhORimtPGLef+zSK5l1vDzfsWb4xgXOgfhtOI5ZDTRxnvRPb22AIVQ==",
"version": "7.6.4",
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.4.tgz",
"integrity": "sha512-dzrRZCYPXIXfSR1/surNbJ/grU3scTaygS0OMzjlGf71i9sc2fGyHPXXiXmEvNIoE0cGwsanEFMVJxPXmco9Eg==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/node": {
"version": "18.11.17",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz",
"integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==",
"version": "18.15.11",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz",
"integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==",
"dev": true
},
"@types/phoenix": {
@@ -2289,9 +2292,9 @@
"dev": true
},
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"dev": true
},
"human-signals": {
@@ -2370,32 +2373,32 @@
"dev": true
},
"miniflare": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/miniflare/-/miniflare-2.11.0.tgz",
"integrity": "sha512-QA18I1VQXdCo4nBtPJUcUDxW8c9xbc5ex5F61jwhkGVOISSnYdEheolESmjr8MYk28xwi0XD1ozS4rLaTONd+w==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/miniflare/-/miniflare-2.13.0.tgz",
"integrity": "sha512-ayNhVa4a6bZiOuHtrPmOt4BCYcmW1fBQ/+qGL85smq1m2OBBm3aUs6f4ISf38xH8tk+qewgmAywetyVtn6KHPw==",
"dev": true,
"requires": {
"@miniflare/cache": "2.11.0",
"@miniflare/cli-parser": "2.11.0",
"@miniflare/core": "2.11.0",
"@miniflare/d1": "2.11.0",
"@miniflare/durable-objects": "2.11.0",
"@miniflare/html-rewriter": "2.11.0",
"@miniflare/http-server": "2.11.0",
"@miniflare/kv": "2.11.0",
"@miniflare/queues": "2.11.0",
"@miniflare/r2": "2.11.0",
"@miniflare/runner-vm": "2.11.0",
"@miniflare/scheduler": "2.11.0",
"@miniflare/shared": "2.11.0",
"@miniflare/sites": "2.11.0",
"@miniflare/storage-file": "2.11.0",
"@miniflare/storage-memory": "2.11.0",
"@miniflare/web-sockets": "2.11.0",
"@miniflare/cache": "2.13.0",
"@miniflare/cli-parser": "2.13.0",
"@miniflare/core": "2.13.0",
"@miniflare/d1": "2.13.0",
"@miniflare/durable-objects": "2.13.0",
"@miniflare/html-rewriter": "2.13.0",
"@miniflare/http-server": "2.13.0",
"@miniflare/kv": "2.13.0",
"@miniflare/queues": "2.13.0",
"@miniflare/r2": "2.13.0",
"@miniflare/runner-vm": "2.13.0",
"@miniflare/scheduler": "2.13.0",
"@miniflare/shared": "2.13.0",
"@miniflare/sites": "2.13.0",
"@miniflare/storage-file": "2.13.0",
"@miniflare/storage-memory": "2.13.0",
"@miniflare/web-sockets": "2.13.0",
"kleur": "^4.1.4",
"semiver": "^1.1.0",
"source-map-support": "^0.5.20",
"undici": "5.9.1"
"undici": "5.20.0"
}
},
"ms": {
@@ -2546,18 +2549,18 @@
"dev": true
},
"semver": {
"version": "7.3.8",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz",
"integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
},
"set-cookie-parser": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz",
"integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==",
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz",
"integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==",
"dev": true
},
"shebang-command": {
@@ -2640,10 +2643,13 @@
}
},
"undici": {
"version": "5.9.1",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.9.1.tgz",
"integrity": "sha512-6fB3a+SNnWEm4CJbgo0/CWR8RGcOCQP68SF4X0mxtYTq2VNN8T88NYrWVBAeSX+zb7bny2dx2iYhP3XHi00omg==",
"dev": true
"version": "5.20.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz",
"integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==",
"dev": true,
"requires": {
"busboy": "^1.6.0"
}
},
"urlpattern-polyfill": {
"version": "4.0.3",
@@ -2725,9 +2731,9 @@
}
},
"ws": {
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
"integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
"version": "8.13.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
"integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
"dev": true,
"requires": {}
},
File diff suppressed because it is too large. Load diff
@@ -14,6 +14,6 @@
"react": "^18.0.0",
"react-dom": "^18.0.0",
"sass": "^1.26.2",
"tailwindcss": "^1.9.6"
"tailwindcss": "^3.3.1"
}
}
@@ -0,0 +1,22 @@
## Resumable Uploads with Supabase Storage and Uppy
This example shows how to use [Supabase Storage](https://supabase.io/docs/reference/javascript/storage) with [Uppy](https://uppy.io/) to upload files to Supabase Storage using the TUS protocol (resumable uploads).
### Running the example
- Create a supabase bucket from the Supabase UI
- Add a policy to allow public uploads
- e.g. `CREATE POLICY "allow uploads" ON storage.objects FOR INSERT TO public WITH CHECK (bucket_id = 'your-bucket-name');`
- Open the index.html file and replace the following variables with your own:
```js
const SUPABASE_ANON_KEY = '' // your project's anon key
const SUPABASE_PROJECT_ID = '' // your project ref
const STORAGE_BUCKET = '' // your storage bucket name
```
Serve the index.html file locally (e.g. with Python Simple HTTP Server) and start uploading:
```bash
python3 -m http.server
```
@@ -0,0 +1,95 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Resumable Upload Supabase + UppyJS</title>
<link href="https://releases.transloadit.com/uppy/v3.6.1/uppy.min.css" rel="stylesheet" />
<style>
html {
background: #9e44ef;
}
body {
height: 100vh;
background: radial-gradient(72.03% 66.03% at 50% 69.72%, #dbb8bf 0, transparent 100%);
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
}
a {
display: block;
margin: 10px;
text-decoration: none;
}
#logo {
max-width: 150px;
}
#drag-drop-area {
margin-top: 40px;
}
</style>
</head>
<body>
<img id="logo" src="supabase-logo-wordmark--dark.png" />
<div id="drag-drop-area"></div>
<a href="https://supabase.com/docs/guides/storage/uploads#resumable-upload" target="_blank"
>Read the docs.</a
>
<script type="module">
import {
Uppy,
Dashboard,
Tus,
} from 'https://releases.transloadit.com/uppy/v3.6.1/uppy.min.mjs'
const SUPABASE_ANON_KEY = 'repace-with-your-anon-key'
const SUPABASE_PROJECT_ID = 'repace-with-your-project-id'
const STORAGE_BUCKET = 'repace-with-your-bucket-id'
const folder = ''
const supabaseStorageURL = `https://${SUPABASE_PROJECT_ID}.supabase.co/storage/v1/upload/resumable`
var uppy = new Uppy()
.use(Dashboard, {
inline: true,
limit: 10,
target: '#drag-drop-area',
showProgressDetails: true,
})
.use(Tus, {
endpoint: supabaseStorageURL,
headers: {
authorization: `Bearer ${SUPABASE_ANON_KEY}`,
apikey: SUPABASE_ANON_KEY,
},
uploadDataDuringCreation: true,
chunkSize: 6 * 1024 * 1024,
allowedMetaFields: ['bucketName', 'objectName', 'contentType', 'cacheControl'],
onError: function (error) {
console.log('Failed because: ' + error)
},
})
uppy.on('file-added', (file) => {
const supabaseMetadata = {
bucketName: STORAGE_BUCKET,
objectName: folder ? `${folder}/${file.name}` : file.name,
contentType: file.type,
}
file.meta = {
...file.meta,
...supabaseMetadata,
}
console.log('file added', file)
})
uppy.on('complete', (result) => {
console.log('Upload complete! We’ve uploaded these files:', result.successful)
})
</script>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

@@ -48,8 +48,8 @@ class _AccountPageState extends State<AccountPage> {
setState(() {
_loading = true;
});
final userName = _usernameController.text;
final website = _websiteController.text;
final userName = _usernameController.text.trim();
final website = _websiteController.text.trim();
final user = supabase.auth.currentUser;
final updates = {
'id': user!.id,
@@ -25,7 +25,7 @@ class _LoginPageState extends State<LoginPage> {
});
try {
await supabase.auth.signInWithOtp(
email: _emailController.text,
email: _emailController.text.trim(),
emailRedirectTo:
kIsWeb ? null : 'io.supabase.flutterquickstart://login-callback/',
);
@@ -105,7 +105,7 @@ export default function Account({ session }: { session: Session }) {
<label htmlFor="website">Website</label>
<input
id="website"
type="website"
type="url"
value={website || ''}
onChange={(e) => setWebsite(e.target.value)}
/>
@@ -11,7 +11,7 @@
</div>
<div>
<label for="website">Website</label>
<input id="website" type="website" v-model="website" />
<input id="website" type="url" v-model="website" />
</div>
<div>
@@ -6996,9 +6996,9 @@
}
},
"node_modules/undici": {
"version": "5.11.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.11.0.tgz",
"integrity": "sha512-oWjWJHzFet0Ow4YZBkyiJwiK5vWqEYoH7BINzJAJOLedZ++JpAlCbUktW2GQ2DS2FpKmxD/JMtWUUWl1BtghGw==",
"version": "5.21.2",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.21.2.tgz",
"integrity": "sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==",
"dev": true,
"dependencies": {
"busboy": "^1.6.0"
@@ -12834,9 +12834,9 @@
}
},
"undici": {
"version": "5.11.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.11.0.tgz",
"integrity": "sha512-oWjWJHzFet0Ow4YZBkyiJwiK5vWqEYoH7BINzJAJOLedZ++JpAlCbUktW2GQ2DS2FpKmxD/JMtWUUWl1BtghGw==",
"version": "5.21.2",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.21.2.tgz",
"integrity": "sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==",
"dev": true,
"requires": {
"busboy": "^1.6.0"
@@ -83,7 +83,7 @@ export default function Account({ session }) {
<label htmlFor="website">Website</label>
<input
id="website"
type="website"
type="url"
value={website || ''}
onChange={(e) => setWebsite(e.target.value)}
/>
@@ -2378,9 +2378,9 @@
}
},
"node_modules/undici": {
"version": "5.11.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.11.0.tgz",
"integrity": "sha512-oWjWJHzFet0Ow4YZBkyiJwiK5vWqEYoH7BINzJAJOLedZ++JpAlCbUktW2GQ2DS2FpKmxD/JMtWUUWl1BtghGw==",
"version": "5.21.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz",
"integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==",
"dev": true,
"dependencies": {
"busboy": "^1.6.0"
@@ -4178,9 +4178,9 @@
"dev": true
},
"undici": {
"version": "5.11.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.11.0.tgz",
"integrity": "sha512-oWjWJHzFet0Ow4YZBkyiJwiK5vWqEYoH7BINzJAJOLedZ++JpAlCbUktW2GQ2DS2FpKmxD/JMtWUUWl1BtghGw==",
"version": "5.21.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz",
"integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==",
"dev": true,
"requires": {
"busboy": "^1.6.0"
@@ -94,7 +94,7 @@
</div>
<div>
<label for="website">Website</label>
<input id="website" type="website" bind:value={website} />
<input id="website" type="url" bind:value={website} />
</div>
<div>
@@ -89,7 +89,7 @@ async function signOut() {
</div>
<div>
<label for="website">Website</label>
<input id="website" type="website" v-model="website" />
<input id="website" type="url" v-model="website" />
</div>
<div>
@@ -103,4 +103,4 @@ async function signOut() {
</button>
</div>
</form>
</template>
</template>
File diff suppressed because it is too large. Load diff
+28 -25
View File
@@ -18,7 +18,7 @@
],
"devDependencies": {
"@types/json-stringify-safe": "^5.0.0",
"aws-sdk": "^2.1315.0",
"aws-sdk": "^2.1354.0",
"eslint": "^7.32.0",
"eslint-config-custom": "*",
"json-stringify-safe": "^5.0.1",
@@ -11860,9 +11860,9 @@
}
},
"node_modules/aws-sdk": {
"version": "2.1349.0",
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1349.0.tgz",
"integrity": "sha512-aCuIFkWeRZWaxcjb+q5nqN4JsxdS/Bca7hcFkHI2P0oUzGPki6yU4fwriC1QLAW3SzBVLSeJdgXlBTS9ErBUuA==",
"version": "2.1354.0",
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1354.0.tgz",
"integrity": "sha512-3aDxvyuOqMB9DqJguCq6p8momdsz0JR1axwkWOOCzHA7a35+Bw+WLmqt3pWwRjR1tGIwkkZ2CvGJObYHsOuw3w==",
"dev": true,
"dependencies": {
"buffer": "4.9.2",
@@ -11874,7 +11874,7 @@
"url": "0.10.3",
"util": "^0.12.4",
"uuid": "8.0.0",
"xml2js": "0.4.19"
"xml2js": "0.5.0"
},
"engines": {
"node": ">= 10.0.0"
@@ -38682,19 +38682,22 @@
"dev": true
},
"node_modules/xml2js": {
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
"integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
"integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
"dev": true,
"dependencies": {
"sax": ">=0.6.0",
"xmlbuilder": "~9.0.1"
"xmlbuilder": "~11.0.0"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/xmlbuilder": {
"version": "9.0.7",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
"integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==",
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
"dev": true,
"engines": {
"node": ">=4.0"
@@ -39160,7 +39163,7 @@
"@types/uuid": "^8.3.4",
"@types/zxcvbn": "^4.4.1",
"autoprefixer": "10.4.2",
"aws-sdk": "^2.1275.0",
"aws-sdk": "^2.1354.0",
"babel-loader": "^8.2.3",
"common": "*",
"config": "*",
@@ -47893,9 +47896,9 @@
}
},
"aws-sdk": {
"version": "2.1349.0",
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1349.0.tgz",
"integrity": "sha512-aCuIFkWeRZWaxcjb+q5nqN4JsxdS/Bca7hcFkHI2P0oUzGPki6yU4fwriC1QLAW3SzBVLSeJdgXlBTS9ErBUuA==",
"version": "2.1354.0",
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1354.0.tgz",
"integrity": "sha512-3aDxvyuOqMB9DqJguCq6p8momdsz0JR1axwkWOOCzHA7a35+Bw+WLmqt3pWwRjR1tGIwkkZ2CvGJObYHsOuw3w==",
"dev": true,
"requires": {
"buffer": "4.9.2",
@@ -47907,7 +47910,7 @@
"url": "0.10.3",
"util": "^0.12.4",
"uuid": "8.0.0",
"xml2js": "0.4.19"
"xml2js": "0.5.0"
}
},
"axe-core": {
@@ -66089,7 +66092,7 @@
"analytics-node": "^3.5.0",
"autoprefixer": "10.4.2",
"awesome-debounce-promise": "^2.1.0",
"aws-sdk": "^2.1275.0",
"aws-sdk": "^2.1354.0",
"babel-loader": "^8.2.3",
"blueimp-md5": "^2.19.0",
"clipboard": "^2.0.8",
@@ -69607,19 +69610,19 @@
"dev": true
},
"xml2js": {
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
"integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
"integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
"dev": true,
"requires": {
"sax": ">=0.6.0",
"xmlbuilder": "~9.0.1"
"xmlbuilder": "~11.0.0"
}
},
"xmlbuilder": {
"version": "9.0.7",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
"integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==",
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
"dev": true
},
"xmlchars": {
+1 -1
View File
@@ -34,7 +34,7 @@
},
"devDependencies": {
"@types/json-stringify-safe": "^5.0.0",
"aws-sdk": "^2.1315.0",
"aws-sdk": "^2.1354.0",
"eslint": "^7.32.0",
"eslint-config-custom": "*",
"json-stringify-safe": "^5.0.1",
@@ -4,7 +4,7 @@ export const monokaiCustomTheme = (isDarkMode: boolean) => {
display: 'block',
overflowX: 'auto',
background: '#272822',
color: '#ddd',
color: isDarkMode ? '#ddd' : '#888',
},
'hljs-tag': {
color: '#569cd6',
@@ -21,6 +21,7 @@ export const SAMPLE_QUERIES: SampleQueries = [
queries: [
'Create a table that stores a list of cities, and insert 10 rows of sample data into it',
'Create tables (with foreign key relationships) for blog posts and comments',
'Create tables for employees, reviewers, and employee reviews, with columns for employee ID, reviewer ID, and review text',
],
},
{
@@ -44,6 +45,8 @@ export const SAMPLE_QUERIES: SampleQueries = [
category: 'Select data',
queries: [
'Retrieve a list of employees from the employees table who have a salary greater than $50,000',
'Retrieve a list of all employees with the title "Manager" from the employees table',
'Retrieve a list of all employees hired in the last 6 months',
'Retrieve the department and average salary of each department from the employees table, group by department',
],
},
@@ -51,6 +54,9 @@ export const SAMPLE_QUERIES: SampleQueries = [
category: 'Create triggers',
queries: [
'Create a trigger that updates the updated_at column on the orders table with the current time when the row of the orders table is updated',
'Create a trigger to add a new user to the users table when someone new registers',
'Create a trigger to send an email whenever there is an insert in the orders table',
'Create a trigger to delete all orders placed by a customer when that customer is deleted from the customers table',
],
},
{
@@ -67,6 +73,7 @@ export const SAMPLE_QUERIES: SampleQueries = [
"Create a function to add a new entry to a user's table when a new user signs up",
'Create an a function to calculate the average price of a product in a given category',
'Create a function to insert a new order and update the inventory for the ordered products',
'Create a function to calculate the total sales for a product given an id',
],
},
]
@@ -45,6 +45,7 @@ export const CommandDialog = ({ children, onKeyDown, page, ...props }: CommandDi
'!bg-[#f8f9fa]/95 dark:!bg-[#1c1c1c]/80 backdrop-filter backdrop-blur-sm',
'!border-[#e6e8eb]/90 dark:!border-[#282828]/90',
'transition ease-out',
'place-self-start mx-auto top-24',
animateBounce ? 'scale-[101.5%]' : 'scale-100'
)}
>
@@ -85,12 +85,9 @@ const GlassPanel = ({
"
/>
)}
<img
src={`/docs/img/gradient-bg.png`}
className="transition-all absolute left-0 -top-64 w-[258px]
duration-700 ease-out
group-hover:w-[320px]
"
<div
className="absolute left-0 top-0 w-[250px] h-[150px] transform scale-100 opacity-50 group-hover:scale-150 group-hover:opacity-100 transition-all duration-700 ease-out"
style={{ background: `radial-gradient(100% 100% at 0% 0%, #3EACCF18, transparent)` }}
/>
<div
className={[
+1 -1
View File
@@ -57,7 +57,7 @@ download.analytics.v0:
###############################################################################
# Transform docs into working files
###############################################################################
transform: dereference.api.v0 dereference.auth.v1 dereference.storage.v0 dereference.tsdoc.v2 combine.tsdoc.v2
transform: dereference.api.v0 dereference.auth.v1 dereference.storage.v0 dereference.tsdoc.v2 combine.tsdoc.v2
dereference.api.v0:
npx swagger-cli bundle --dereference --outfile $(REPO_DIR)/transforms/api_v0_openapi_deparsed.json $(REPO_DIR)/api_v0_openapi.json
+120
View File
@@ -1190,6 +1190,68 @@
"security": [{ "bearer": [] }]
}
},
"/v1/projects/{ref}/config/database/postgres": {
"get": {
"operationId": "getConfig",
"summary": "Gets project's Postgres config",
"parameters": [
{
"name": "ref",
"required": true,
"in": "path",
"description": "Project ref",
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/PostgresConfigResponse" }
}
}
},
"500": { "description": "Failed to retrieve project's Postgres config" }
},
"tags": ["projects config"],
"security": [{ "bearer": [] }, { "bearer": [] }]
},
"put": {
"operationId": "updateConfig",
"summary": "Updates project's Postgres config",
"parameters": [
{
"name": "ref",
"required": true,
"in": "path",
"description": "Project ref",
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/UpdatePostgresConfigBody" }
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/PostgresConfigResponse" }
}
}
},
"500": { "description": "Failed to update project's Postgres config" }
},
"tags": ["projects config"],
"security": [{ "bearer": [] }, { "bearer": [] }]
}
},
"/v1/projects/{ref}/config/auth/sso/providers": {
"post": {
"operationId": "createProviderForProject",
@@ -1712,6 +1774,64 @@
},
"required": ["enabled", "override_enabled", "override_active_until"]
},
"PostgresConfigResponse": {
"type": "object",
"properties": {
"statement_timeout": { "type": "integer", "minimum": 0, "maximum": 2147483647 },
"effective_cache_size": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
"maintenance_work_mem": { "type": "integer", "minimum": 1024, "maximum": 2147483647 },
"max_connections": { "type": "integer", "minimum": 1, "maximum": 262143 },
"max_parallel_maintenance_workers": { "type": "integer", "minimum": 0, "maximum": 1024 },
"max_parallel_workers": { "type": "integer", "minimum": 0, "maximum": 1024 },
"max_parallel_workers_per_gather": { "type": "integer", "minimum": 0, "maximum": 1024 },
"max_worker_processes": { "type": "integer", "minimum": 0, "maximum": 262143 },
"shared_buffers": { "type": "integer", "minimum": 16, "maximum": 1073741823 },
"work_mem": { "type": "integer", "minimum": 64, "maximum": 2147483647 },
"session_replication_role": { "enum": ["origin", "replica", "local"], "type": "string" }
},
"required": [
"statement_timeout",
"effective_cache_size",
"maintenance_work_mem",
"max_connections",
"max_parallel_maintenance_workers",
"max_parallel_workers",
"max_parallel_workers_per_gather",
"max_worker_processes",
"shared_buffers",
"work_mem",
"session_replication_role"
]
},
"UpdatePostgresConfigBody": {
"type": "object",
"properties": {
"statement_timeout": { "type": "integer", "minimum": 0, "maximum": 2147483647 },
"effective_cache_size": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
"maintenance_work_mem": { "type": "integer", "minimum": 1024, "maximum": 2147483647 },
"max_connections": { "type": "integer", "minimum": 1, "maximum": 262143 },
"max_parallel_maintenance_workers": { "type": "integer", "minimum": 0, "maximum": 1024 },
"max_parallel_workers": { "type": "integer", "minimum": 0, "maximum": 1024 },
"max_parallel_workers_per_gather": { "type": "integer", "minimum": 0, "maximum": 1024 },
"max_worker_processes": { "type": "integer", "minimum": 0, "maximum": 262143 },
"shared_buffers": { "type": "integer", "minimum": 16, "maximum": 1073741823 },
"work_mem": { "type": "integer", "minimum": 64, "maximum": 2147483647 },
"session_replication_role": { "enum": ["origin", "replica", "local"], "type": "string" }
},
"required": [
"statement_timeout",
"effective_cache_size",
"maintenance_work_mem",
"max_connections",
"max_parallel_maintenance_workers",
"max_parallel_workers",
"max_parallel_workers_per_gather",
"max_worker_processes",
"shared_buffers",
"work_mem",
"session_replication_role"
]
},
"AttributeValue": {
"type": "object",
"properties": {
@@ -0,0 +1,9 @@
[
{
"id": "introduction",
"title": "Introduction",
"slug": "introduction",
"summary": "Introduction",
"type": "markdown"
}
]
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+150 -98
View File
@@ -411,7 +411,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 81,
"line": 85,
"character": 8
}
],
@@ -465,21 +465,30 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the allowed mime types that this bucket can accept during upload"
"shortText": "specifies the allowed mime types that this bucket can accept during upload.\nThe default value is null, which allows files with all mime types to be uploaded.\nEach mime type specified can be a wildcard, e.g. image/*, or a specific mime type, e.g. image/png."
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 83,
"character": 65
"line": 90,
"character": 6
}
],
"type": {
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
}
]
}
},
{
@@ -491,18 +500,22 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the file size limit that this bucket can accept during upload"
"shortText": "specifies the max file size in bytes that can be uploaded to this bucket.\nThe global file size limit takes precedence over this value.\nThe default value is null, which doesn't set a per bucket file size limit."
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 83,
"character": 32
"line": 89,
"character": 6
}
],
"type": {
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "intrinsic",
"name": "string"
@@ -526,8 +539,8 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 83,
"character": 15
"line": 88,
"character": 6
}
],
"type": {
@@ -572,7 +585,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 88,
"line": 96,
"character": 8
}
],
@@ -603,7 +616,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 89,
"line": 97,
"character": 8
}
],
@@ -640,7 +653,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 92,
"line": 100,
"character": 8
}
],
@@ -658,7 +671,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 93,
"line": 101,
"character": 8
}
],
@@ -707,7 +720,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 203,
"line": 219,
"character": 8
}
],
@@ -761,7 +774,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 207,
"line": 223,
"character": 8
}
],
@@ -783,7 +796,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 207,
"line": 223,
"character": 16
}
],
@@ -812,7 +825,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 208,
"line": 224,
"character": 8
}
],
@@ -849,7 +862,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 211,
"line": 227,
"character": 8
}
],
@@ -867,7 +880,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 212,
"line": 228,
"character": 8
}
],
@@ -916,7 +929,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 168,
"line": 184,
"character": 8
}
],
@@ -970,7 +983,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 172,
"line": 188,
"character": 8
}
],
@@ -992,7 +1005,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 172,
"line": 188,
"character": 16
}
],
@@ -1021,7 +1034,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 173,
"line": 189,
"character": 8
}
],
@@ -1058,7 +1071,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 176,
"line": 192,
"character": 8
}
],
@@ -1076,7 +1089,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 177,
"line": 193,
"character": 8
}
],
@@ -1513,7 +1526,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 127,
"line": 139,
"character": 8
}
],
@@ -1566,21 +1579,30 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the allowed mime types that this bucket can accept during upload\n"
"shortText": "specifies the allowed mime types that this bucket can accept during upload.\nThe default value is null, which allows files with all mime types to be uploaded.\nEach mime type specified can be a wildcard, e.g. image/*, or a specific mime type, e.g. image/png.\n"
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 129,
"character": 65
"line": 144,
"character": 6
}
],
"type": {
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
}
]
}
},
{
@@ -1592,18 +1614,22 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the file size limit that this bucket can accept during upload"
"shortText": "specifies the max file size in bytes that can be uploaded to this bucket.\nThe global file size limit takes precedence over this value.\nThe default value is null, which doesn't set a per bucket file size limit."
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 129,
"character": 32
"line": 143,
"character": 6
}
],
"type": {
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "intrinsic",
"name": "string"
@@ -1627,8 +1653,8 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 129,
"character": 15
"line": 142,
"character": 6
}
],
"type": {
@@ -1672,7 +1698,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 132,
"line": 148,
"character": 8
}
],
@@ -1694,7 +1720,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 132,
"line": 148,
"character": 16
}
],
@@ -1723,7 +1749,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 133,
"line": 149,
"character": 8
}
],
@@ -1760,7 +1786,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 136,
"line": 152,
"character": 8
}
],
@@ -1778,7 +1804,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 137,
"line": 153,
"character": 8
}
],
@@ -3209,7 +3235,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 81,
"line": 85,
"character": 8
}
],
@@ -3263,21 +3289,30 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the allowed mime types that this bucket can accept during upload"
"shortText": "specifies the allowed mime types that this bucket can accept during upload.\nThe default value is null, which allows files with all mime types to be uploaded.\nEach mime type specified can be a wildcard, e.g. image/*, or a specific mime type, e.g. image/png."
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 83,
"character": 65
"line": 90,
"character": 6
}
],
"type": {
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
}
]
}
},
{
@@ -3289,18 +3324,22 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the file size limit that this bucket can accept during upload"
"shortText": "specifies the max file size in bytes that can be uploaded to this bucket.\nThe global file size limit takes precedence over this value.\nThe default value is null, which doesn't set a per bucket file size limit."
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 83,
"character": 32
"line": 89,
"character": 6
}
],
"type": {
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "intrinsic",
"name": "string"
@@ -3324,8 +3363,8 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 83,
"character": 15
"line": 88,
"character": 6
}
],
"type": {
@@ -3370,7 +3409,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 88,
"line": 96,
"character": 8
}
],
@@ -3401,7 +3440,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 89,
"line": 97,
"character": 8
}
],
@@ -3438,7 +3477,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 92,
"line": 100,
"character": 8
}
],
@@ -3456,7 +3495,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 93,
"line": 101,
"character": 8
}
],
@@ -3495,7 +3534,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 203,
"line": 219,
"character": 8
}
],
@@ -3549,7 +3588,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 207,
"line": 223,
"character": 8
}
],
@@ -3571,7 +3610,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 207,
"line": 223,
"character": 16
}
],
@@ -3600,7 +3639,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 208,
"line": 224,
"character": 8
}
],
@@ -3637,7 +3676,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 211,
"line": 227,
"character": 8
}
],
@@ -3655,7 +3694,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 212,
"line": 228,
"character": 8
}
],
@@ -3694,7 +3733,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 168,
"line": 184,
"character": 8
}
],
@@ -3748,7 +3787,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 172,
"line": 188,
"character": 8
}
],
@@ -3770,7 +3809,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 172,
"line": 188,
"character": 16
}
],
@@ -3799,7 +3838,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 173,
"line": 189,
"character": 8
}
],
@@ -3836,7 +3875,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 176,
"line": 192,
"character": 8
}
],
@@ -3854,7 +3893,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 177,
"line": 193,
"character": 8
}
],
@@ -4214,7 +4253,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 127,
"line": 139,
"character": 8
}
],
@@ -4267,21 +4306,30 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the allowed mime types that this bucket can accept during upload\n"
"shortText": "specifies the allowed mime types that this bucket can accept during upload.\nThe default value is null, which allows files with all mime types to be uploaded.\nEach mime type specified can be a wildcard, e.g. image/*, or a specific mime type, e.g. image/png.\n"
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 129,
"character": 65
"line": 144,
"character": 6
}
],
"type": {
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
}
]
}
},
{
@@ -4293,18 +4341,22 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the file size limit that this bucket can accept during upload"
"shortText": "specifies the max file size in bytes that can be uploaded to this bucket.\nThe global file size limit takes precedence over this value.\nThe default value is null, which doesn't set a per bucket file size limit."
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 129,
"character": 32
"line": 143,
"character": 6
}
],
"type": {
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "intrinsic",
"name": "string"
@@ -4328,8 +4380,8 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 129,
"character": 15
"line": 142,
"character": 6
}
],
"type": {
@@ -4373,7 +4425,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 132,
"line": 148,
"character": 8
}
],
@@ -4395,7 +4447,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 132,
"line": 148,
"character": 16
}
],
@@ -4424,7 +4476,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 133,
"line": 149,
"character": 8
}
],
@@ -4461,7 +4513,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 136,
"line": 152,
"character": 8
}
],
@@ -4479,7 +4531,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 137,
"line": 153,
"character": 8
}
],
@@ -411,7 +411,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 81,
"line": 85,
"character": 8
}
],
@@ -465,21 +465,30 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the allowed mime types that this bucket can accept during upload"
"shortText": "specifies the allowed mime types that this bucket can accept during upload.\nThe default value is null, which allows files with all mime types to be uploaded.\nEach mime type specified can be a wildcard, e.g. image/*, or a specific mime type, e.g. image/png."
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 83,
"character": 65
"line": 90,
"character": 6
}
],
"type": {
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
}
]
}
},
{
@@ -491,18 +500,22 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the file size limit that this bucket can accept during upload"
"shortText": "specifies the max file size in bytes that can be uploaded to this bucket.\nThe global file size limit takes precedence over this value.\nThe default value is null, which doesn't set a per bucket file size limit."
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 83,
"character": 32
"line": 89,
"character": 6
}
],
"type": {
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "intrinsic",
"name": "string"
@@ -526,8 +539,8 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 83,
"character": 15
"line": 88,
"character": 6
}
],
"type": {
@@ -572,7 +585,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 88,
"line": 96,
"character": 8
}
],
@@ -603,7 +616,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 89,
"line": 97,
"character": 8
}
],
@@ -640,7 +653,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 92,
"line": 100,
"character": 8
}
],
@@ -658,7 +671,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 93,
"line": 101,
"character": 8
}
],
@@ -707,7 +720,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 203,
"line": 219,
"character": 8
}
],
@@ -761,7 +774,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 207,
"line": 223,
"character": 8
}
],
@@ -783,7 +796,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 207,
"line": 223,
"character": 16
}
],
@@ -812,7 +825,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 208,
"line": 224,
"character": 8
}
],
@@ -849,7 +862,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 211,
"line": 227,
"character": 8
}
],
@@ -867,7 +880,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 212,
"line": 228,
"character": 8
}
],
@@ -916,7 +929,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 168,
"line": 184,
"character": 8
}
],
@@ -970,7 +983,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 172,
"line": 188,
"character": 8
}
],
@@ -992,7 +1005,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 172,
"line": 188,
"character": 16
}
],
@@ -1021,7 +1034,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 173,
"line": 189,
"character": 8
}
],
@@ -1058,7 +1071,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 176,
"line": 192,
"character": 8
}
],
@@ -1076,7 +1089,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 177,
"line": 193,
"character": 8
}
],
@@ -1513,7 +1526,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 127,
"line": 139,
"character": 8
}
],
@@ -1566,21 +1579,30 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the allowed mime types that this bucket can accept during upload\n"
"shortText": "specifies the allowed mime types that this bucket can accept during upload.\nThe default value is null, which allows files with all mime types to be uploaded.\nEach mime type specified can be a wildcard, e.g. image/*, or a specific mime type, e.g. image/png.\n"
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 129,
"character": 65
"line": 144,
"character": 6
}
],
"type": {
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
}
]
}
},
{
@@ -1592,18 +1614,22 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the file size limit that this bucket can accept during upload"
"shortText": "specifies the max file size in bytes that can be uploaded to this bucket.\nThe global file size limit takes precedence over this value.\nThe default value is null, which doesn't set a per bucket file size limit."
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 129,
"character": 32
"line": 143,
"character": 6
}
],
"type": {
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "intrinsic",
"name": "string"
@@ -1627,8 +1653,8 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 129,
"character": 15
"line": 142,
"character": 6
}
],
"type": {
@@ -1672,7 +1698,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 132,
"line": 148,
"character": 8
}
],
@@ -1694,7 +1720,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 132,
"line": 148,
"character": 16
}
],
@@ -1723,7 +1749,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 133,
"line": 149,
"character": 8
}
],
@@ -1760,7 +1786,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 136,
"line": 152,
"character": 8
}
],
@@ -1778,7 +1804,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 137,
"line": 153,
"character": 8
}
],
@@ -3446,7 +3472,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 81,
"line": 85,
"character": 8
}
],
@@ -3500,21 +3526,30 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the allowed mime types that this bucket can accept during upload"
"shortText": "specifies the allowed mime types that this bucket can accept during upload.\nThe default value is null, which allows files with all mime types to be uploaded.\nEach mime type specified can be a wildcard, e.g. image/*, or a specific mime type, e.g. image/png."
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 83,
"character": 65
"line": 90,
"character": 6
}
],
"type": {
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
}
]
}
},
{
@@ -3526,18 +3561,22 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the file size limit that this bucket can accept during upload"
"shortText": "specifies the max file size in bytes that can be uploaded to this bucket.\nThe global file size limit takes precedence over this value.\nThe default value is null, which doesn't set a per bucket file size limit."
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 83,
"character": 32
"line": 89,
"character": 6
}
],
"type": {
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "intrinsic",
"name": "string"
@@ -3561,8 +3600,8 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 83,
"character": 15
"line": 88,
"character": 6
}
],
"type": {
@@ -3607,7 +3646,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 88,
"line": 96,
"character": 8
}
],
@@ -3638,7 +3677,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 89,
"line": 97,
"character": 8
}
],
@@ -3675,7 +3714,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 92,
"line": 100,
"character": 8
}
],
@@ -3693,7 +3732,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 93,
"line": 101,
"character": 8
}
],
@@ -3732,7 +3771,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 203,
"line": 219,
"character": 8
}
],
@@ -3786,7 +3825,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 207,
"line": 223,
"character": 8
}
],
@@ -3808,7 +3847,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 207,
"line": 223,
"character": 16
}
],
@@ -3837,7 +3876,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 208,
"line": 224,
"character": 8
}
],
@@ -3874,7 +3913,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 211,
"line": 227,
"character": 8
}
],
@@ -3892,7 +3931,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 212,
"line": 228,
"character": 8
}
],
@@ -3931,7 +3970,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 168,
"line": 184,
"character": 8
}
],
@@ -3985,7 +4024,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 172,
"line": 188,
"character": 8
}
],
@@ -4007,7 +4046,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 172,
"line": 188,
"character": 16
}
],
@@ -4036,7 +4075,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 173,
"line": 189,
"character": 8
}
],
@@ -4073,7 +4112,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 176,
"line": 192,
"character": 8
}
],
@@ -4091,7 +4130,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 177,
"line": 193,
"character": 8
}
],
@@ -4451,7 +4490,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 127,
"line": 139,
"character": 8
}
],
@@ -4504,21 +4543,30 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the allowed mime types that this bucket can accept during upload\n"
"shortText": "specifies the allowed mime types that this bucket can accept during upload.\nThe default value is null, which allows files with all mime types to be uploaded.\nEach mime type specified can be a wildcard, e.g. image/*, or a specific mime type, e.g. image/png.\n"
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 129,
"character": 65
"line": 144,
"character": 6
}
],
"type": {
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "array",
"elementType": {
"type": "intrinsic",
"name": "string"
}
}
]
}
},
{
@@ -4530,18 +4578,22 @@
"isOptional": true
},
"comment": {
"shortText": "specifies the file size limit that this bucket can accept during upload"
"shortText": "specifies the max file size in bytes that can be uploaded to this bucket.\nThe global file size limit takes precedence over this value.\nThe default value is null, which doesn't set a per bucket file size limit."
},
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 129,
"character": 32
"line": 143,
"character": 6
}
],
"type": {
"type": "union",
"types": [
{
"type": "literal",
"value": null
},
{
"type": "intrinsic",
"name": "string"
@@ -4565,8 +4617,8 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 129,
"character": 15
"line": 142,
"character": 6
}
],
"type": {
@@ -4610,7 +4662,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 132,
"line": 148,
"character": 8
}
],
@@ -4632,7 +4684,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 132,
"line": 148,
"character": 16
}
],
@@ -4661,7 +4713,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 133,
"line": 149,
"character": 8
}
],
@@ -4698,7 +4750,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 136,
"line": 152,
"character": 8
}
],
@@ -4716,7 +4768,7 @@
"sources": [
{
"fileName": "src/packages/StorageBucketApi.ts",
"line": 137,
"line": 153,
"character": 8
}
],
+37
View File
@@ -0,0 +1,37 @@
configspec: '001'
# This section outlines the general information for the tool.
info:
id: 'functions' # {string} A unique ID for this tool.
version: 'next' # {string} The current version number of the tool.
title: 'Functions' # {string} A readable name.
source: 'https://github.com/supabase/edge-runtime' # {string} Where developers can find the source code.
bugs: 'https://github.com/supabase/edge-runtime/issues' # {string} Where developers can file bugs.
spec: 'https://github.com/supabase/supabase/blob/master/spec/realtime_v0_config.yml' # {string} Where developers can find this spec (to link directly in the docs).
description: |
You can use environment variables to configure your Functions Server.
tags:
- id: general
title: General Settings
description: General server settings.
# This section is an array of public functions which a user might need to execute.
parameters:
- id: 'LOGFLARE_SINGLE_TENANT' # {string} A unique identifier for this param.
title: 'LOGFLARE_SINGLE_TENANT' # {string} Any name.
tags: ['general'] # {string[]} These tags are useful for grouping parameters
links: [] # {string[]} These tags are useful for grouping parameters
required: true
default: 'true'
type: 'boolean'
description: |
This is will seed a singular user into the database, and will disable browser authentication. All browser usage will default to this user. Inviting team users and other team-related functionality is currently not supported for self-hosted. Logflare self-hosted is currently intended for single-user experience only.
- id: 'LOGFLARE_API_KEY' # {string} A unique identifier for this param.
title: 'LOGFLARE_API_KEY' # {string} Any name.
tags: ['general'] # {string[]} These tags are useful for grouping parameters
links: [] # {string[]} These tags are useful for grouping parameters
required: true
default: ''
type: 'string'
description: |
Allows you to pass in an API key that will used for authentication. This is intended for programmatic usage where an external program sets the API key. It is advised to use the UI to configure the access tokens instead. If this value is not provided, the default API key will be automatically generated.
+983
View File
@@ -0,0 +1,983 @@
{
"components": {
"responses": {},
"schemas": {
"Accepted": {
"title": "Accepted"
},
"Endpoint": {
"properties": {
"cache_duration_seconds": {
"type": "integer"
},
"enable_auth": {
"type": "boolean"
},
"inserted_at": {
"format": "date-time",
"type": "string"
},
"max_limit": {
"type": "integer"
},
"name": {
"type": "string"
},
"proactive_requerying_seconds": {
"type": "integer"
},
"query": {
"type": "string"
},
"sandboxable": {
"type": "boolean"
},
"source_mapping": {
"type": "object"
},
"token": {
"type": "string"
},
"updated_at": {
"format": "date-time",
"type": "string"
}
},
"required": ["name", "query"],
"title": "Endpoint",
"type": "object"
},
"NotFound": {
"title": "NotFound"
},
"Notification": {
"properties": {
"other_email_notifications": {
"type": "string"
},
"team_user_ids_for_email": {
"allOf": {
"type": "string"
},
"type": "array"
},
"team_user_ids_for_schema_updates": {
"allOf": {
"type": "string"
},
"type": "array"
},
"team_user_ids_for_sms": {
"allOf": {
"type": "string"
},
"type": "array"
},
"user_email_notifications": {
"type": "boolean"
},
"user_schema_update_notifications": {
"type": "boolean"
},
"user_text_notifications": {
"type": "boolean"
}
},
"title": "Notification",
"type": "object"
},
"Source": {
"properties": {
"api_quota": {
"type": "integer"
},
"bigquery_table_ttl": {
"type": "integer"
},
"bq_table_id": {
"type": "string"
},
"bq_table_schema": {
"type": "object"
},
"custom_event_message_keys": {
"type": "string"
},
"favorite": {
"type": "boolean"
},
"has_rejected_events": {
"type": "boolean"
},
"id": {},
"inserted_at": {
"format": "date-time",
"type": "string"
},
"metrics": {
"type": "object"
},
"name": {
"type": "string"
},
"notifications": {
"items": {
"$ref": "#/components/schemas/Notification"
},
"type": "array"
},
"public_token": {
"type": "string"
},
"slack_hook_url": {
"type": "string"
},
"token": {
"type": "string"
},
"updated_at": {
"format": "date-time",
"type": "string"
},
"webhook_notification_url": {
"type": "string"
}
},
"required": ["name"],
"title": "Source",
"type": "object"
},
"Team": {
"properties": {
"name": {
"type": "string"
},
"team_users": {
"items": {
"$ref": "#/components/schemas/TeamUser"
},
"type": "array"
},
"token": {
"type": "string"
},
"user": {
"$ref": "#/components/schemas/User"
}
},
"required": ["name"],
"title": "Team",
"type": "object"
},
"TeamUser": {
"properties": {
"email": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": ["email", "name"],
"title": "TeamUser",
"type": "object"
},
"User": {
"properties": {
"api_key": {
"type": "string"
},
"api_quota": {
"type": "integer"
},
"bigquery_dataset_id": {
"type": "string"
},
"bigquery_dataset_location": {
"type": "string"
},
"bigquery_project_id": {
"type": "string"
},
"company": {
"type": "string"
},
"email": {
"type": "string"
},
"email_me_product": {
"type": "boolean"
},
"email_preferred": {
"type": "string"
},
"image": {
"type": "string"
},
"name": {
"type": "string"
},
"phone": {
"type": "string"
},
"provider": {
"type": "string"
},
"token": {
"type": "string"
}
},
"required": ["email", "provider", "token", "provider_uid", "api_key"],
"title": "User",
"type": "object"
}
}
},
"info": {
"title": "logflare",
"version": "1.0.0"
},
"openapi": "3.0.0",
"paths": {
"/api/endpoints": {
"get": {
"callbacks": {},
"operationId": "LogflareWeb.Api.EndpointController.index",
"parameters": [],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/Endpoint"
},
"type": "array"
}
}
},
"description": "Endpoint List Response"
}
},
"summary": "List endpoints",
"tags": ["management"]
},
"post": {
"callbacks": {},
"operationId": "LogflareWeb.Api.EndpointController.create",
"parameters": [],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Endpoint"
}
}
},
"description": "Endpoint Parameters",
"required": false
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Endpoint"
}
}
},
"description": "Created Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Create endpoint",
"tags": ["management"]
}
},
"/api/endpoints/{token}": {
"delete": {
"callbacks": {},
"operationId": "LogflareWeb.Api.EndpointController.delete",
"parameters": [
{
"description": "Endpoint Token",
"in": "path",
"name": "token",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"204": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/Accepted"
}
}
},
"description": "Accepted Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Delete endpoint",
"tags": ["management", "management"]
},
"get": {
"callbacks": {},
"operationId": "LogflareWeb.Api.EndpointController.show",
"parameters": [
{
"description": "Endpoint Token",
"in": "path",
"name": "token",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Endpoint"
}
}
},
"description": "Endpoint Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Fetch endpoint",
"tags": ["management"]
},
"patch": {
"callbacks": {},
"operationId": "LogflareWeb.Api.EndpointController.update",
"parameters": [
{
"description": "Endpoint Token",
"in": "path",
"name": "token",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Endpoint"
}
}
},
"description": "Endpoint Parameters",
"required": false
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Endpoint"
}
}
},
"description": "Created Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Update endpoint",
"tags": ["management"]
},
"put": {
"callbacks": {},
"operationId": "LogflareWeb.Api.EndpointController.update (2)",
"parameters": [
{
"description": "Endpoint Token",
"in": "path",
"name": "token",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Endpoint"
}
}
},
"description": "Endpoint Parameters",
"required": false
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Endpoint"
}
}
},
"description": "Created Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Update endpoint",
"tags": ["management"]
}
},
"/api/sources": {
"get": {
"callbacks": {},
"operationId": "LogflareWeb.Api.SourceController.index",
"parameters": [],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/Source"
},
"type": "array"
}
}
},
"description": "Source List Response"
}
},
"summary": "List sources",
"tags": ["management"]
},
"post": {
"callbacks": {},
"operationId": "LogflareWeb.Api.SourceController.create",
"parameters": [],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Source"
}
}
},
"description": "Source Parameters",
"required": false
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Source"
}
}
},
"description": "Created Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Create source",
"tags": ["management"]
}
},
"/api/sources/{token}": {
"delete": {
"callbacks": {},
"operationId": "LogflareWeb.Api.SourceController.delete",
"parameters": [
{
"description": "Source Token",
"in": "path",
"name": "token",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"204": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/Accepted"
}
}
},
"description": "Accepted Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Delete source",
"tags": ["management"]
},
"get": {
"callbacks": {},
"operationId": "LogflareWeb.Api.SourceController.show",
"parameters": [
{
"description": "Source Token",
"in": "path",
"name": "token",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Source"
}
}
},
"description": "Source Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Fetch source",
"tags": ["management"]
},
"patch": {
"callbacks": {},
"operationId": "LogflareWeb.Api.SourceController.update",
"parameters": [
{
"description": "Source Token",
"in": "path",
"name": "token",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Source"
}
}
},
"description": "Source Parameters",
"required": false
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Source"
}
}
},
"description": "Created Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Update source",
"tags": ["management"]
},
"put": {
"callbacks": {},
"operationId": "LogflareWeb.Api.SourceController.update (2)",
"parameters": [
{
"description": "Source Token",
"in": "path",
"name": "token",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Source"
}
}
},
"description": "Source Parameters",
"required": false
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Source"
}
}
},
"description": "Created Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Update source",
"tags": ["management"]
}
},
"/api/teams": {
"get": {
"callbacks": {},
"operationId": "LogflareWeb.Api.TeamController.index",
"parameters": [],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/Team"
},
"type": "array"
}
}
},
"description": "Team List Response"
}
},
"summary": "List teams",
"tags": ["management"]
},
"post": {
"callbacks": {},
"operationId": "LogflareWeb.Api.TeamController.create",
"parameters": [],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Team"
}
}
},
"description": "Team Parameters",
"required": false
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Team"
}
}
},
"description": "Created Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Create Team",
"tags": ["management"]
}
},
"/api/teams/{token}": {
"delete": {
"callbacks": {},
"operationId": "LogflareWeb.Api.TeamController.delete",
"parameters": [
{
"description": "Team Token",
"in": "path",
"name": "token",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"204": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/Accepted"
}
}
},
"description": "Accepted Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Delete Team",
"tags": ["management"]
},
"get": {
"callbacks": {},
"operationId": "LogflareWeb.Api.TeamController.show",
"parameters": [
{
"description": "Team Token",
"in": "path",
"name": "token",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Team"
}
}
},
"description": "Team Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Fetch team",
"tags": ["management"]
},
"patch": {
"callbacks": {},
"operationId": "LogflareWeb.Api.TeamController.update",
"parameters": [
{
"description": "Team Token",
"in": "path",
"name": "token",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Team"
}
}
},
"description": "Team Parameters",
"required": false
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Team"
}
}
},
"description": "Created Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Update team",
"tags": ["management"]
},
"put": {
"callbacks": {},
"operationId": "LogflareWeb.Api.TeamController.update (2)",
"parameters": [
{
"description": "Team Token",
"in": "path",
"name": "token",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Team"
}
}
},
"description": "Team Parameters",
"required": false
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Team"
}
}
},
"description": "Created Response"
},
"404": {
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/NotFound"
}
}
},
"description": "Not found"
}
},
"summary": "Update team",
"tags": ["management"]
}
}
},
"security": [],
"servers": [
{
"url": "https://logflare.app",
"variables": {}
}
],
"tags": []
}
+9 -8
View File
@@ -85,8 +85,8 @@
"public": { "type": "boolean", "examples": [false] },
"file_size_limit": {
"anyOf": [
{ "type": "integer", "examples": [1000] },
{ "type": "string", "examples": ["100MB"] }
{ "type": "integer", "examples": [1000], "nullable": true, "minimum": 0 },
{ "type": "string", "examples": ["100MB"], "nullable": true }
]
},
"allowed_mime_types": {
@@ -161,7 +161,7 @@
"name": { "type": "string" },
"owner": { "type": "string" },
"public": { "type": "boolean" },
"file_size_limit": { "type": "integer" },
"file_size_limit": { "type": ["null", "integer"] },
"allowed_mime_types": {
"type": ["null", "array"],
"items": { "type": "string" }
@@ -291,7 +291,7 @@
"name": { "type": "string" },
"owner": { "type": "string" },
"public": { "type": "boolean" },
"file_size_limit": { "type": "integer" },
"file_size_limit": { "type": ["null", "integer"] },
"allowed_mime_types": {
"type": ["null", "array"],
"items": { "type": "string" }
@@ -337,12 +337,13 @@
"public": { "type": "boolean", "examples": [false] },
"file_size_limit": {
"anyOf": [
{ "type": "integer", "examples": [1000] },
{ "type": "string", "examples": ["100MB"] }
{ "type": "integer", "examples": [1000], "nullable": true, "minimum": 0 },
{ "type": "string", "examples": ["100MB"], "nullable": true }
]
},
"allowed_mime_types": {
"type": "array",
"nullable": true,
"items": { "type": "string", "examples": [["image/png", "image/jpg"]] }
}
}
@@ -694,7 +695,7 @@
"name": { "type": "string" },
"owner": { "type": "string" },
"public": { "type": "boolean" },
"file_size_limit": { "type": "integer" },
"file_size_limit": { "type": ["null", "integer"] },
"allowed_mime_types": {
"type": ["null", "array"],
"items": { "type": "string" }
@@ -1241,7 +1242,7 @@
"name": { "type": "string" },
"owner": { "type": "string" },
"public": { "type": "boolean" },
"file_size_limit": { "type": "integer" },
"file_size_limit": { "type": ["null", "integer"] },
"allowed_mime_types": {
"type": ["null", "array"],
"items": { "type": "string" }
@@ -2682,6 +2682,307 @@
]
}
},
"/v1/projects/{ref}/config/database/postgres": {
"get": {
"operationId": "getConfig",
"summary": "Gets project's Postgres config",
"parameters": [
{
"name": "ref",
"required": true,
"in": "path",
"description": "Project ref",
"schema": {
"minLength": 20,
"maxLength": 20,
"type": "string"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"statement_timeout": {
"type": "integer",
"minimum": 0,
"maximum": 2147483647
},
"effective_cache_size": {
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"maintenance_work_mem": {
"type": "integer",
"minimum": 1024,
"maximum": 2147483647
},
"max_connections": {
"type": "integer",
"minimum": 1,
"maximum": 262143
},
"max_parallel_maintenance_workers": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_parallel_workers": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_parallel_workers_per_gather": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_worker_processes": {
"type": "integer",
"minimum": 0,
"maximum": 262143
},
"shared_buffers": {
"type": "integer",
"minimum": 16,
"maximum": 1073741823
},
"work_mem": {
"type": "integer",
"minimum": 64,
"maximum": 2147483647
},
"session_replication_role": {
"enum": ["origin", "replica", "local"],
"type": "string"
}
},
"required": [
"statement_timeout",
"effective_cache_size",
"maintenance_work_mem",
"max_connections",
"max_parallel_maintenance_workers",
"max_parallel_workers",
"max_parallel_workers_per_gather",
"max_worker_processes",
"shared_buffers",
"work_mem",
"session_replication_role"
]
}
}
}
},
"500": {
"description": "Failed to retrieve project's Postgres config"
}
},
"tags": ["projects config"],
"security": [
{
"bearer": []
},
{
"bearer": []
}
]
},
"put": {
"operationId": "updateConfig",
"summary": "Updates project's Postgres config",
"parameters": [
{
"name": "ref",
"required": true,
"in": "path",
"description": "Project ref",
"schema": {
"minLength": 20,
"maxLength": 20,
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"statement_timeout": {
"type": "integer",
"minimum": 0,
"maximum": 2147483647
},
"effective_cache_size": {
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"maintenance_work_mem": {
"type": "integer",
"minimum": 1024,
"maximum": 2147483647
},
"max_connections": {
"type": "integer",
"minimum": 1,
"maximum": 262143
},
"max_parallel_maintenance_workers": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_parallel_workers": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_parallel_workers_per_gather": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_worker_processes": {
"type": "integer",
"minimum": 0,
"maximum": 262143
},
"shared_buffers": {
"type": "integer",
"minimum": 16,
"maximum": 1073741823
},
"work_mem": {
"type": "integer",
"minimum": 64,
"maximum": 2147483647
},
"session_replication_role": {
"enum": ["origin", "replica", "local"],
"type": "string"
}
},
"required": [
"statement_timeout",
"effective_cache_size",
"maintenance_work_mem",
"max_connections",
"max_parallel_maintenance_workers",
"max_parallel_workers",
"max_parallel_workers_per_gather",
"max_worker_processes",
"shared_buffers",
"work_mem",
"session_replication_role"
]
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"statement_timeout": {
"type": "integer",
"minimum": 0,
"maximum": 2147483647
},
"effective_cache_size": {
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"maintenance_work_mem": {
"type": "integer",
"minimum": 1024,
"maximum": 2147483647
},
"max_connections": {
"type": "integer",
"minimum": 1,
"maximum": 262143
},
"max_parallel_maintenance_workers": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_parallel_workers": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_parallel_workers_per_gather": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_worker_processes": {
"type": "integer",
"minimum": 0,
"maximum": 262143
},
"shared_buffers": {
"type": "integer",
"minimum": 16,
"maximum": 1073741823
},
"work_mem": {
"type": "integer",
"minimum": 64,
"maximum": 2147483647
},
"session_replication_role": {
"enum": ["origin", "replica", "local"],
"type": "string"
}
},
"required": [
"statement_timeout",
"effective_cache_size",
"maintenance_work_mem",
"max_connections",
"max_parallel_maintenance_workers",
"max_parallel_workers",
"max_parallel_workers_per_gather",
"max_worker_processes",
"shared_buffers",
"work_mem",
"session_replication_role"
]
}
}
}
},
"500": {
"description": "Failed to update project's Postgres config"
}
},
"tags": ["projects config"],
"security": [
{
"bearer": []
},
{
"bearer": []
}
]
}
},
"/v1/projects/{ref}/config/auth/sso/providers": {
"post": {
"operationId": "createProviderForProject",
@@ -4118,6 +4419,150 @@
},
"required": ["enabled", "override_enabled", "override_active_until"]
},
"PostgresConfigResponse": {
"type": "object",
"properties": {
"statement_timeout": {
"type": "integer",
"minimum": 0,
"maximum": 2147483647
},
"effective_cache_size": {
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"maintenance_work_mem": {
"type": "integer",
"minimum": 1024,
"maximum": 2147483647
},
"max_connections": {
"type": "integer",
"minimum": 1,
"maximum": 262143
},
"max_parallel_maintenance_workers": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_parallel_workers": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_parallel_workers_per_gather": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_worker_processes": {
"type": "integer",
"minimum": 0,
"maximum": 262143
},
"shared_buffers": {
"type": "integer",
"minimum": 16,
"maximum": 1073741823
},
"work_mem": {
"type": "integer",
"minimum": 64,
"maximum": 2147483647
},
"session_replication_role": {
"enum": ["origin", "replica", "local"],
"type": "string"
}
},
"required": [
"statement_timeout",
"effective_cache_size",
"maintenance_work_mem",
"max_connections",
"max_parallel_maintenance_workers",
"max_parallel_workers",
"max_parallel_workers_per_gather",
"max_worker_processes",
"shared_buffers",
"work_mem",
"session_replication_role"
]
},
"UpdatePostgresConfigBody": {
"type": "object",
"properties": {
"statement_timeout": {
"type": "integer",
"minimum": 0,
"maximum": 2147483647
},
"effective_cache_size": {
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"maintenance_work_mem": {
"type": "integer",
"minimum": 1024,
"maximum": 2147483647
},
"max_connections": {
"type": "integer",
"minimum": 1,
"maximum": 262143
},
"max_parallel_maintenance_workers": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_parallel_workers": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_parallel_workers_per_gather": {
"type": "integer",
"minimum": 0,
"maximum": 1024
},
"max_worker_processes": {
"type": "integer",
"minimum": 0,
"maximum": 262143
},
"shared_buffers": {
"type": "integer",
"minimum": 16,
"maximum": 1073741823
},
"work_mem": {
"type": "integer",
"minimum": 64,
"maximum": 2147483647
},
"session_replication_role": {
"enum": ["origin", "replica", "local"],
"type": "string"
}
},
"required": [
"statement_timeout",
"effective_cache_size",
"maintenance_work_mem",
"max_connections",
"max_parallel_maintenance_workers",
"max_parallel_workers",
"max_parallel_workers_per_gather",
"max_worker_processes",
"shared_buffers",
"work_mem",
"session_replication_role"
]
},
"AttributeValue": {
"type": "object",
"properties": {
File diff suppressed because it is too large. Load diff
@@ -134,11 +134,14 @@
"anyOf": [
{
"type": "integer",
"examples": [1000]
"examples": [1000],
"nullable": true,
"minimum": 0
},
{
"type": "string",
"examples": ["100MB"]
"examples": ["100MB"],
"nullable": true
}
]
},
@@ -250,7 +253,7 @@
"type": "boolean"
},
"file_size_limit": {
"type": "integer"
"type": ["null", "integer"]
},
"allowed_mime_types": {
"type": ["null", "array"],
@@ -439,7 +442,7 @@
"type": "boolean"
},
"file_size_limit": {
"type": "integer"
"type": ["null", "integer"]
},
"allowed_mime_types": {
"type": ["null", "array"],
@@ -513,16 +516,20 @@
"anyOf": [
{
"type": "integer",
"examples": [1000]
"examples": [1000],
"nullable": true,
"minimum": 0
},
{
"type": "string",
"examples": ["100MB"]
"examples": ["100MB"],
"nullable": true
}
]
},
"allowed_mime_types": {
"type": "array",
"nullable": true,
"items": {
"type": "string",
"examples": [["image/png", "image/jpg"]]
@@ -1083,7 +1090,7 @@
"type": "boolean"
},
"file_size_limit": {
"type": "integer"
"type": ["null", "integer"]
},
"allowed_mime_types": {
"type": ["null", "array"],
@@ -1938,7 +1945,7 @@
"type": "boolean"
},
"file_size_limit": {
"type": "integer"
"type": ["null", "integer"]
},
"allowed_mime_types": {
"type": ["null", "array"],
@@ -52,7 +52,7 @@ const ColumnDefaultValue: FC<Props> = ({
<InputWithSuggestions
label="Default Value"
layout="vertical"
description="Can either be a literal or an expression (e.g uuid_generate_v4())"
description="Can either be a literal or an expression. When using an expression wrap your expression in brackets, e.g. (uuid_generate_v4())"
placeholder={
typeof columnFields.defaultValue === 'string' && columnFields.defaultValue.length === 0
? 'EMPTY'
@@ -410,13 +410,13 @@ const SidePanelEditor = ({
queryClient.invalidateQueries(sqlKeys.query(project?.ref, ['foreign-key-constraints']))
await Promise.all([
queryClient.invalidateQueries(
sqlKeys.query(project?.ref, [selectedTable!.schema, selectedTable!.name])
sqlKeys.query(project?.ref, [selectedTableToEdit.schema, selectedTableToEdit.name])
),
queryClient.invalidateQueries(
sqlKeys.query(project?.ref, [
'table-definition',
selectedTable!.schema,
selectedTable!.name,
selectedTableToEdit.schema,
selectedTableToEdit.name,
])
),
queryClient.invalidateQueries(entityTypeKeys.list(project?.ref)),
@@ -431,7 +431,7 @@ const SidePanelEditor = ({
}
} catch (error: any) {
saveTableError = true
ui.setNotification({ id: toastId, category: 'error', message: error.message })
ui.setNotification({ error, id: toastId, category: 'error', message: error.message })
}
if (!saveTableError) {
@@ -452,42 +452,71 @@ const SidePanelEditor = ({
category: 'loading',
message: `Adding ${rowCount.toLocaleString()} rows to ${selectedTable.name}`,
})
const { error }: any = await meta.insertRowsViaSpreadsheet(
file,
selectedTable,
selectedHeaders,
(progress: number) => {
ui.setNotification({
id: toastId,
progress,
category: 'loading',
message: `Adding ${rowCount.toLocaleString()} rows to ${selectedTable.name}`,
})
}
)
if (error) {
ui.setNotification({
error,
id: toastId,
category: 'error',
message: `Failed to import data: ${error.message}`,
})
resolve()
if (file && rowCount > 0) {
// CSV file upload
const { error }: any = await meta.insertRowsViaSpreadsheet(
file,
selectedTable,
selectedHeaders,
(progress: number) => {
ui.setNotification({
id: toastId,
progress,
category: 'loading',
message: `Adding ${rowCount.toLocaleString()} rows to ${selectedTable.name}`,
})
}
)
if (error) {
ui.setNotification({
error,
id: toastId,
category: 'error',
message: `Failed to import data: ${error.message}`,
})
return resolve()
}
} else {
await Promise.all([
queryClient.invalidateQueries(
sqlKeys.query(project?.ref, [selectedTable!.schema, selectedTable!.name])
),
])
ui.setNotification({
id: toastId,
category: 'success',
message: `Successfully imported ${rowCount} rows of data into ${selectedTable.name}`,
})
resolve()
closePanel()
// Text paste
const { error } = await meta.insertTableRows(
selectedTable,
importContent.rows,
selectedHeaders,
(progress: number) => {
ui.setNotification({
id: toastId,
progress,
category: 'loading',
message: `Adding ${importContent.rows.length.toLocaleString()} rows to ${
selectedTable.name
}`,
})
}
)
if (error) {
ui.setNotification({
error,
id: toastId,
category: 'error',
message: `Failed to import data: ${error.message}`,
})
return resolve()
}
}
await Promise.all([
queryClient.invalidateQueries(
sqlKeys.query(project?.ref, [selectedTable!.schema, selectedTable!.name])
),
])
ui.setNotification({
id: toastId,
category: 'success',
message: `Successfully imported ${rowCount} rows of data into ${selectedTable.name}`,
})
resolve()
closePanel()
}
const onClosePanel = () => {
@@ -47,6 +47,7 @@ const SpreadsheetImport: FC<Props> = ({
}
}, [visible])
const [tab, setTab] = useState<'fileUpload' | 'pasteText'>('fileUpload')
const [input, setInput] = useState<string>('')
const [uploadedFile, setUploadedFile] = useState<File>()
const [parseProgress, setParseProgress] = useState<number>(0)
@@ -142,7 +143,7 @@ const SpreadsheetImport: FC<Props> = ({
}
const onConfirm = (resolve: () => void) => {
if (uploadedFile === undefined) {
if (tab === 'fileUpload' && uploadedFile === undefined) {
ui.setNotification({
category: 'error',
message: 'Please upload a file to import your data with',
@@ -198,7 +199,7 @@ const SpreadsheetImport: FC<Props> = ({
>
<SidePanel.Content>
<div className="pt-6">
<Tabs block type="pills">
<Tabs block type="pills" onChange={setTab}>
<Tabs.Panel id="fileUpload" label="Upload CSV">
<SpreadSheetFileUpload
parseProgress={parseProgress}
Loaded 100 of 107 files, more files were not shown because too many files have changed in this diff. Show more