mirror of
https://github.com/supabase/supabase.git
synced 2026-10-12 21:05:06 +03:00
Merge pull request #8826 from supabase/feat/pg_blog_sept
feat/primary-keys-blog-post
This commit is contained in:
9 files changed
+958
-457
No files matched your search
@@ -0,0 +1,488 @@
|
||||
---
|
||||
title: Choosing a Postgres Primary Key
|
||||
description: Turns out the question of which identifier to use as a Primary Key is complicated -- we're going to dive into some of the complexity and inherent trade-offs, and figure things out
|
||||
author: victor
|
||||
image: primary-keys/choosing-a-postgres-primary-key-og.jpg
|
||||
thumb: primary-keys/choosing-a-postgres-primary-key-og.jpg
|
||||
tags:
|
||||
- postgres
|
||||
date: '2022-09-08'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
Primary keys are important. They uniquely identify rows of data in tables, and make it easy to fetch data. The job of a database is to archive and recall data and you're going to have a hard time finding data without a good primary key or a good index.
|
||||
|
||||
Sometimes it makes sense to use a [“natural key”](https://en.wikipedia.org/wiki/Natural_key) (like an `email` column in a `users` table) and sometimes it’s better to use a “[surrogate key”](https://en.wikipedia.org/wiki/Surrogate_key), a value made *for the purpose* of identifying a row (and has no other meaning).
|
||||
|
||||
At first glance, the question of *which* primary key to use is easy! Just throw a `integer`/`serial` on there, right? Numeric IDs are cool, but what about random value IDs or [Universally Unique IDentifiers (UUIDs)](https://en.wikipedia.org/wiki/Uuid)?
|
||||
|
||||
Turns out the question of which identifier (and in this case, UUID) to use is complicated -- we're going to dive into some of the complexity and inherent trade-offs, and figure things out:
|
||||
|
||||
- What are the choices for identifiers?
|
||||
- If we choose to use/add UUIDs, which ones should we choose?
|
||||
- How can we get these UUIDs into postgres?
|
||||
- Which UUIDs perform best?
|
||||
|
||||
But first, a quick history lesson.
|
||||
|
||||
## A brief history of identifiers and why we use them
|
||||
|
||||
### `integer`/`biginteger`
|
||||
|
||||
Let's think about identifying rows of data from first principles. What's the first way you might think of identifying things? Assigning them numbers!
|
||||
|
||||
We can set up a table like this:
|
||||
|
||||
```sql
|
||||
-- Let's enable access to case-insensitive text
|
||||
CREATE EXTENSION IF NOT EXISTS citext;
|
||||
|
||||
-- Heres a basic users table
|
||||
CREATE TABLE users (
|
||||
id integer PRIMARY KEY,
|
||||
email citext NOT NULL CHECK (LENGTH(email) < 255),
|
||||
name text NOT NULL
|
||||
);
|
||||
|
||||
-- Let's assume we don't want two users with the exact same email
|
||||
CREATE UNIQUE INDEX users_email_uniq ON users USING BTREE (email);
|
||||
```
|
||||
|
||||
This looks great, but what should `id` be on new rows? I don't know -- maybe the application can figure it out? If they store some value in memory? That doesn't seem right.
|
||||
|
||||
Maybe we could figure out the next integer from what's in the table itself -- we just need to be able to "count" upwards. We *do* have all the `users` tables rows in there, so we should be able to do it:
|
||||
|
||||
```sql
|
||||
INSERT INTO users (id, email, name)
|
||||
SELECT COUNT(*) + 1, 'new@example.com', 'new_user' FROM users;
|
||||
```
|
||||
|
||||
After running that query, we can double check our results:
|
||||
|
||||
```sql
|
||||
SELECT * FROM users;
|
||||
```
|
||||
|
||||
| id | email | name |
|
||||
|----|------------------|----------|
|
||||
| 1 | new@example.com | new user |
|
||||
| 2 | new2@example.com | new user |
|
||||
|
||||
```sql
|
||||
(2 rows)
|
||||
```
|
||||
|
||||
Using `COUNT(*)` in our query is not the most efficient (or even easiest) solution though, and hopefully it's clear why -- **counting a sequence of numbers for primary keys is a feature built in to Postgres**!
|
||||
|
||||
[serial/bigserial](https://www.postgresql.org/docs/current/datatype-numeric.html#DATATYPE-SERIAL) is the right tool in our toolbox to maintain a shared, auto-incrementing sequence of numbers. Let's pretend we read the [postgres documentation](https://www.postgresql.org/docs) and use those instead.
|
||||
|
||||
### `serial`/`bigserial`
|
||||
|
||||
`serial` is essentially a convenient macro for using [Postgres sequences](https://www.postgresql.org/docs/current/sql-createsequence.html), a database-managed auto-incrementing stream of `integer`.
|
||||
|
||||
Let's hear it from the docs:
|
||||
|
||||
> The data types `smallserial`, `serial` and `bigserial` are not true types, but merely a notational convenience for creating unique identifier columns (similar to the `AUTO_INCREMENT` property supported by some other databases).
|
||||
>
|
||||
|
||||
Using a `serial` column to create the `users` table would look like this:
|
||||
|
||||
```sql
|
||||
CREATE TABLE users (
|
||||
id serial PRIMARY KEY,
|
||||
email citext NOT NULL CHECK (LENGTH(email) < 255),
|
||||
name text NOT NULL
|
||||
);
|
||||
```
|
||||
|
||||
OK, now let's try inserting into it - we shouldn't have to specify `id`:
|
||||
|
||||
```sql
|
||||
INSERT INTO users_serial (email, name) VALUES ('user@example.com', 'new user');
|
||||
```
|
||||
|
||||
```sql
|
||||
SELECT * FROM users;
|
||||
```
|
||||
|
||||
|
||||
| id | email | name |
|
||||
|----|------------------|----------|
|
||||
| 1 | user@example.com | new user |
|
||||
|
||||
|
||||
```sql
|
||||
(1 row)
|
||||
INSERT 0 1
|
||||
```
|
||||
|
||||
It works, as you might expect - now the application doesn't have to *somehow magically know* the right ID to use when inserting.
|
||||
|
||||
But what does `serial` actually do? Using a serial column is operationally similar to the following SQL:
|
||||
|
||||
```sql
|
||||
CREATE SEQUENCE tablename_colname_seq AS integer;
|
||||
CREATE TABLE tablename (
|
||||
colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
|
||||
);
|
||||
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
|
||||
```
|
||||
|
||||
Back in application land, the `INSERT` statement returns, and provides the new `id` the database assigned our new row. Multiple application instances don't need to coordinate what ID to use -- they just *don't*, and find out from the database.
|
||||
|
||||
**We've taken a somewhat meandering path to get here, but this is the standard solution for most reasonable database schemas.**
|
||||
|
||||
### Why not stop at `serial`?
|
||||
|
||||
There are few issues with sequences:
|
||||
|
||||
- When writing automation that simply iterates through id values, note that `serial` columns can have gaps, even if you never `DELETE` (e.x. if an `INSERT` was rolled back — sequences live *outside* transactions).
|
||||
- When used from outside code `serial` may leak some data or give attackers an edge (e.x., if `yoursite.com/users/50` works, how about `yoursite.com/users/51`?).
|
||||
- `serial` is PostgreSQL specific (i.e. not SQL standards compliant)
|
||||
|
||||
Don't be too put off by these reasons -- `serial` is still the go-to for most use-cases.
|
||||
|
||||
Even the last point about `serial` not being standards compliant is solved in Postgres 10+ by using...
|
||||
|
||||
### `integer`/`biginteger` (again!)
|
||||
|
||||
[Postgres 10 added support for the `IDENTITY` column](https://www.postgresql.org/docs/10/release-10.html#id-1.11.6.26.5.7) syntax in `CREATE TABLE` ([EDB has a great writeup on the addition](https://www.enterprisedb.com/blog/postgresql-10-identity-columns-explained)).
|
||||
|
||||
This means we can happily go back to using `integer`/`biginteger`:
|
||||
|
||||
```sql
|
||||
CREATE TABLE (
|
||||
id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
|
||||
email citext NOT NULL CHECK (LENGTH(email) < 255),
|
||||
name text NOT NULL
|
||||
)
|
||||
```
|
||||
|
||||
So how does *this* work? Postgres does the same thing under the covers -- it generates a `sequence`. As this syntax is standards compliant, it's generally recommended practice for DBAs going forward, for the sake of the realm.
|
||||
|
||||
**So `integer`s are great, but information leakage is still a problem. How do we fix that?** Well, make the numbers random, obviously.
|
||||
|
||||
### Random Numeric IDs
|
||||
|
||||
Let's say the application using the DB has some [Python](https://python.org) code like the following:
|
||||
|
||||
```sql
|
||||
import randrange from random
|
||||
import User from models;
|
||||
MAX_RANDOM_USER_ID = 1_000_000_000
|
||||
def create_user():
|
||||
"""
|
||||
Add new user to the database
|
||||
"""
|
||||
user_id = randrange(1, MAX_RANDOM_USER_ID)
|
||||
user = User(id=user_id, email="new@example.com", name="new user")
|
||||
db.save(user)
|
||||
|
||||
```
|
||||
|
||||
That *looks* good, but there's a problem -- [random](https://docs.python.org/3/library/random.html) is a *pseudorandom* generator.
|
||||
|
||||
[Pseudo-random](https://en.wikipedia.org/wiki/Pseudorandomness) numbers are *not* what we want for ensuring user IDs cannot be easily guessed/collide. It's possible to get the exact same sequence of values out of a pseudo-random number generator by using the same *seed value*.
|
||||
|
||||
Sometimes you *want* pseudo-random behavior (let's say for testing or fuzzing), but it's generally not desired for production systems that might run from a duplicated identical application image, since they *could* have weak pseudo-random seed initialization.
|
||||
|
||||
### (Secure) Random Numeric IDs
|
||||
|
||||
**At the very least** we need a properly secure random numbers -- we need Python's [secrets](https://docs.python.org/3/library/secrets.html) module:
|
||||
|
||||
```python
|
||||
from secrets import randbelow
|
||||
# ...
|
||||
def create_user():
|
||||
"""
|
||||
Add new user to the database (using secure random numbers)
|
||||
"""
|
||||
user_id = randrange(1, MAX_RANDOM_USER_ID)
|
||||
user = User(id=user_id, email="new@example.com", name="new user")
|
||||
db.save(user)
|
||||
|
||||
```
|
||||
|
||||
Now we have a secure random value coming in for our user IDs. But having values like `583247` and `8923916` get generated are cool and all, but there are a few problems:
|
||||
|
||||
- These numbers are random *and* quite inscrutable
|
||||
- The keyspace is fairly small (maybe good for comments on a popular website, but not for IDs!)
|
||||
- People can still *technically* check them all (the guessing space is 1 to `MAX_RANDOM_USER_ID`!)
|
||||
|
||||
We need something better.
|
||||
|
||||
### (Secure) Random UUIDs
|
||||
|
||||
Along comes UUIDs -- you're probably used to seeing them now, values like this UUIDv4:
|
||||
|
||||
`468e8075-5815-4fe2-80d3-45a31827954b` .
|
||||
|
||||
They're *very* random (almost always generated with secure random sources), and while they're even worse for remembering, they're near impossible to practically guess -- the search space is just too large!
|
||||
|
||||
More importantly, UUIDs introduce methodology to the madness -- different versions of UUID are derived different ways -- combined with other sources of randomness or known values.
|
||||
|
||||
There are a lot of [versions of UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Versions), but let's discuss the ones we're more likely to use/see day to day.
|
||||
|
||||
### UUIDv1
|
||||
|
||||
[Version 1 UUIDs](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_(date-time_and_MAC_address)) have three two components:
|
||||
|
||||
- a 60 bit date-time (at nanosecond precision)
|
||||
- a 48 bit [MAC address](https://en.wikipedia.org/wiki/MAC_address)
|
||||
|
||||
But where's the randomness? Well v1s assume that you *won't* generate a ton of values in the same nanosecond (and there are some extra bits reserved for differentiating even when you do), but another source is the MAC address. MAC addresses uniquely (usually) identify network cards -- which is a security risk -- and those bits can be made random.
|
||||
|
||||
Here's what a UUIDv1 looks like:
|
||||
|
||||
```
|
||||
a9957082-0b47-11ed-8a91-3cf011fe32f1
|
||||
```
|
||||
|
||||
You can generate v1 UUIDs in Postgres natively thanks to the [uuid-ossp contrib module](https://www.postgresql.org/docs/current/uuid-ossp.html). Here's how to generate a v1 UUID with random MAC address:
|
||||
|
||||
```sql
|
||||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||
CREATE EXTENSION
|
||||
|
||||
SELECT uuid_generate_v1mc();
|
||||
uuid_generate_v1mc
|
||||
--------------------------------------
|
||||
dd1bbf10-0b47-11ed-80de-db48f6faaf86
|
||||
(1 row)
|
||||
```
|
||||
|
||||
### UUIDv4
|
||||
|
||||
Version 4 UUIDs use *all* the available bits for randomness -- *122 bits worth*!.
|
||||
|
||||
UUIDv4s look like this:
|
||||
|
||||
```
|
||||
ce0b897d-03a0-4f54-8c97-41d29a325a23
|
||||
```
|
||||
|
||||
These don't have a time component, but they don't have in time they make up for in randomness -- it is *very* unlikely for them to collide, so they make for excellent Global Unique IDentifiers ("GUID"s).
|
||||
|
||||
We can generate them in Postgres like this (with `uuid-ossp`):
|
||||
|
||||
```bash
|
||||
postgres=# SELECT uuid_generate_v4();
|
||||
uuid_generate_v4
|
||||
--------------------------------------
|
||||
6ca93dde-81d4-4ea0-bfe1-92ecb4d81ee4
|
||||
(1 row)
|
||||
```
|
||||
|
||||
Since Postgres would catch a collision on a `PRIMARY KEY` or `UNIQUE INDEX` column, we're done right? If we want to generate UUIDs all we need to do is choose UUID v1 or V4, and we won't leak any schema structure information to the outside world, right?
|
||||
|
||||
This is a workable solution, but as you might expect, it's not that easy.
|
||||
|
||||
### The Post-UUIDv1/v4 era: A Cambrian explosion of identifiers
|
||||
|
||||

|
||||
|
||||
UUIDv1 and v4 were a start, but weren't enough for *many* companies out there. There are a couple shortcomings that plague both v1 and v2:
|
||||
|
||||
- UUIDs are twice the size of `bigint`/`bigserial`
|
||||
- UUIDv1s contain a time element but they're *not* lexicographically sortable (this means they `SORT` terribly, relative to `integer` or a `timestamp` column)
|
||||
- UUIDv1s are less random than UUIDv4, and can collide/overlap in close enough time intervals, at large scale
|
||||
- UUIDv4s index *terribly*, as they're essentially random values (obviously, they `SORT` terribly as well)
|
||||
|
||||
Many of the world's biggest companies generated UUIDs at speeds that made all of these deficiencies a problem.
|
||||
|
||||
A cambrian explosion of UUIDs resulted, as noticed by the IETF -- this resulted in [the new UUID formats (v6,v7,v8) being published in 2021](https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-01.html).
|
||||
|
||||
Here's a quick list (from that IETF document):
|
||||
|
||||
- LexicalUUID by [Twitter](https://blog.twitter.com/engineering)
|
||||
- [Snowflake](https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake) by [Twitter](https://blog.twitter.com/engineering)
|
||||
- [Flake](https://github.com/boundary/flake) by [Boundary (now BMC TrueSight Pulse)](http://www.bmc.com/)
|
||||
- ShardingID by [Instagram](http://instagram-engineering.com/)
|
||||
- [KSUID](https://github.com/segmentio/ksuid) by [Segment](https://segment.com/blog/engineering/)
|
||||
- [Elasticflake](https://github.com/ppearcy/elasticflake) by [P. Pearcy](https://github.com/ppearcy/elasticflake)
|
||||
- [FlakeID](https://github.com/s-yadav/FlakeId) by [T. Pawlak](https://github.com/T-PWK)
|
||||
- [Sonyflake](https://github.com/sony/sonyflake) by [Sony](https://github.com/sony)
|
||||
- [orderedUuid](https://laravel.com/docs/5.7/helpers#method-str-ordered-uuid) by [IT. Cabrera](https://darkghosthunter.medium.com/)
|
||||
- COMBGUID by [R. Tallent](https://github.com/richardtallent)
|
||||
- [ULID](https://github.com/ulid/spec) by [A. Feerasta](https://github.com/alizain)
|
||||
- [SID](https://github.com/chilts/sid) by [A. Chilton](https://github.com/chilts)
|
||||
- [pushID](https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html) by [Google](https://google.com/)
|
||||
- [XID](https://github.com/rs/xid) by [O. Poitrey](https://github.com/rs)
|
||||
- [ObjectID](https://www.mongodb.com/docs/manual/reference/method/ObjectId/) by [MongoDB](https://www.mongodb.com/blog/channel/engineering-blog)
|
||||
- [CUID](https://github.com/ericelliott/cuid) by [E. Elliott](https://github.com/ericelliott)
|
||||
|
||||
That's... A lot of UUIDs. They're all slightly different, but the innovation was summed up by the IETF:
|
||||
|
||||
> An inspection of these implementations details the following trends that help define this standard:
|
||||
>
|
||||
> - Timestamps MUST be k-sortable. That is, values within or close to the same timestamp are ordered properly by sorting algorithms.
|
||||
> - Timestamps SHOULD be big-endian with the most-significant bits of the time embedded as-is without reordering.
|
||||
> - Timestamps SHOULD utilize millisecond precision and Unix Epoch as timestamp source. Although, there is some variation to this among implementations depending on the application requirements.
|
||||
> - The ID format SHOULD be Lexicographically sortable while in the textual representation.
|
||||
> - IDs MUST ensure proper embedded sequencing to facilitate sorting when multiple UUIDs are created during a given timestamp.
|
||||
> - IDs MUST NOT require unique network identifiers as part of achieving uniqueness.
|
||||
> - Distributed nodes MUST be able to create collision resistant Unique IDs without a consulting a centralized resource.
|
||||
> **The IETF went on to introduce three 3 new types of UUIDs** that have these properties these companies were looking for: UUIDv6, UUIDv7, and UUIDv8.
|
||||
|
||||
So what's the difference you ask?
|
||||
|
||||
- **UUIDv6** - 62 bits of [gregorian](https://en.wikipedia.org/wiki/Gregorian_calendar) time + 48 bits of randomness
|
||||
- **UUIDv7** - 36 bits of big endian unix timestamp (seconds since epoch + leapseconds w/ optional sub-second precision) + variable randomness up to 62 bits
|
||||
- **UUIDv8** - variable size timestamp (32/48/60/64 bits) + variable size clock (8/12 bits) + variable randomness (54/62 bits)
|
||||
|
||||
It's not quite easy to work out what this all *means* but let's boil it down:
|
||||
|
||||
- All of these UUIDs sort properly (the "high bits" of time are first, like putting the year before the month -- "2022/07")
|
||||
- UUIDv6 *requires* randomness
|
||||
- The data contained in the UUID can be variable (ex. UUIDv8), this means you can bytes that mean something else (ex. an encoding of the compute region you're running in)
|
||||
|
||||
Alright, done hearing about UUIDs? Let's get to the fun part.
|
||||
|
||||
## Benchmarking ID generation with `uuid-ossp` and `pg_idkit`
|
||||
|
||||
With the history lesson behind us, let’s benchmark these ID generation mechanisms against each other! For UUIDv1 and UUIDv4 we can use [uuid-ossp](https://www.postgresql.org/docs/current/uuid-ossp.html).
|
||||
|
||||
Unfortunately, `uuid-ossp` isn't *quite* so advanced as to have many of these newer UUIDs we've been discussing, so we’ll pull in [pg_idkit](https://github.com/t3hmrman/pg_idkit) here.
|
||||
|
||||
[pg_idkit](https://github.com/t3hmrman/pg_idkit) is built with Rust, so it gives us access to the following ID generation crates:
|
||||
|
||||
- [nanoid](https://crates.io/crates/nanoid) (a [well known package](https://www.npmjs.com/package/nanoid) from the the NodeJS ecosystem)
|
||||
- [ksuid](https://crates.io/crates/ksuid)
|
||||
- [ulid](https://crates.io/crates/ulid)
|
||||
- [rs-snowflake](https://crates.io/crates/rs-snowflake) (Twitter's Snowflake algorithm)
|
||||
- [timeflake-rs](https://crates.io/crates/timeflake-rs) (Inspired by Twitter's Snowflake, Instagram's ID and Firebase's PushID)
|
||||
- [sonyflake](https://crates.io/crates/sonyflake)
|
||||
- [pushid](https://crates.io/crates/pushid)
|
||||
- [xid](https://crates.io/crates/xid)
|
||||
- [cuid](https://crates.io/crates/cuid)
|
||||
- [uuidv6](https://crates.io/crates/uuidv6)
|
||||
- [uuid7](https://crates.io/crates/uuid7)
|
||||
|
||||
For each type of UUID, we can test the following:
|
||||
|
||||
- **Generation speed:** **How fast can I generate IDs (let's say 1,000,000 of them)?
|
||||
- **Table & Index size:** How much larger do tables and associated indices get?
|
||||
|
||||
<aside>
|
||||
⚠️ Grain of salt required for these tests - we haven't audited the implementations of all the underlying crates!
|
||||
|
||||
</aside>
|
||||
|
||||
### Generation speed
|
||||
|
||||
Generation speed is pretty easy to test, we can enable `\\timing` mode on `psql` and run a simple benchmark with `generate_series`:
|
||||
|
||||
```sql
|
||||
\timing -- enable psql timing mode
|
||||
|
||||
-- Generate IDs 1 million times with ksuid
|
||||
SELECT COUNT(idkit_ksuid_generate()) FROM generate_series(1, 1000000);
|
||||
```
|
||||
|
||||
Running all of the ID generation mechanisms on a *single core* of my machine (which happens to be an [Oryx Pro](https://system76.com/laptops/oryx)), the lowest of 5 runs for each ID looks like this:
|
||||
|
||||
!(Generation speed test)[/images/blog/primary-keys/generation-speed-chart.jpg]
|
||||
|
||||
To be fair, **generation speed shouldn’t be a deal breaker** as it’s unlikely to be the bottle neck for most applications. That said, it is nice to have some data on where each ID generation mechanism lands.
|
||||
|
||||
<aside>
|
||||
ℹ️ Percona and CyberTec have some excellent posts on the topic:
|
||||
|
||||
[https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/](https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/)
|
||||
[https://www.cybertec-postgresql.com/en/uuid-serial-or-identity-columns-for-postgresql-auto-generated-primary-keys/](https://www.cybertec-postgresql.com/en/uuid-serial-or-identity-columns-for-postgresql-auto-generated-primary-keys/)
|
||||
</aside>
|
||||
|
||||
### Table & Index size
|
||||
|
||||
We can check the size of our tables & related indices with this query (after running `VACUUM`):
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
relname as table_name,
|
||||
pg_size_pretty(pg_total_relation_size(relid)) As "Table Size",
|
||||
pg_size_pretty(pg_indexes_size(relid)) as "Index Size",
|
||||
pg_size_pretty(pg_relation_size(relid)) as "Total Size"
|
||||
FROM pg_catalog.pg_statio_user_tables
|
||||
ORDER BY pg_total_relation_size(relid) DESC;
|
||||
```
|
||||
|
||||
Here are the sizes in tabular form:
|
||||
|
||||

|
||||
|
||||
These numbers are *mostly* a reflection of the *length* of the default settings of `pg_idkit` but probably worth having in front of you anyway.
|
||||
|
||||
With this, we probably have enough information to make a decision (and a new library to generate our UUIDs with)!
|
||||
|
||||
## Which ID should you use?
|
||||
|
||||
As usual, *it depends* -- you didn't think it'd be that easy, did you?
|
||||
|
||||
All I can offer are some general rules of thumb that hopefully work for you:
|
||||
|
||||
- `integer`s and `serial` have obvious benefits for simplicity, storage, and sortability. You *might* not want to expose them to the world though.
|
||||
- If you want the ultimate in collision avoidance UUIDv4 is OK
|
||||
- UUIDv1 *could* have been great, *but* it doesn't lexicographically sort.
|
||||
- The best time-based ID seems to be `xid`, with good performance *and* sort friendliness
|
||||
- If you want to be a little more standards-oriented, UUID v6/v7
|
||||
|
||||
As usual, the best results will come from weighing all the options and finding what's best for your use-case, and doing appropriate testing on your data.
|
||||
|
||||
## Possible Improvements
|
||||
|
||||
We’ve done some good exploration so far, but here are some ideas for interesting use cases for `pg_idkit` and measuring the impact of ID generation using it.
|
||||
|
||||
### Usecase: Generating our `created_at` columns from our IDs
|
||||
|
||||
One interesting feature would be using at least partially time-based UUIDs for `created_at` columns -- we could save space by *virtualizing* our `created_at` columns:
|
||||
|
||||
```sql
|
||||
-- At table creation
|
||||
CREATE TABLE users (
|
||||
id text PRIMARY KEY DEFAULT idkit_ksuid_generate(),
|
||||
name text,
|
||||
email text,
|
||||
);
|
||||
|
||||
-- An example query for a specific KSUID that uses created_at
|
||||
SELECT *, idkit_ksuid_extract_timestamptz(id)
|
||||
FROM users
|
||||
WHERE id = '0F755149A55730412B0AEC0E3B5B089C14B5B58D';
|
||||
```
|
||||
|
||||
Ideally we could use [the `GENERATED ALWAYS AS ( ... )` syntax for generated columns](https://www.postgresql.org/docs/current/ddl-generated-columns.html) while creating the table, but as the time of this post *Postgres does not yet support virtual generated columns (only stored ones)*.
|
||||
|
||||
### Benchmarking: Measuring index fragmentation
|
||||
|
||||
How fragmented do our indices get after use of each of these methods?
|
||||
|
||||
Luckily for us Postgres has the [pgstattuple extension](https://www.postgresql.org/docs/current/pgstattuple.html) so we can find out -- thanks to [Laurenz Albe on StackOverflow](https://dba.stackexchange.com/questions/273556/how-do-we-select-fragmented-indexes-from-postgresql)).
|
||||
|
||||
Integrating and including these tests in the `pg_idkit` README would greatly help people looking to make a decision.
|
||||
|
||||
### Benchmarking: Measuring `SORT` friendliness
|
||||
|
||||
Another great metric to measure might be performance of these indices on certain common `SORT` patterns. While this is inherently workload-specific, it would be great to pick a workload and see what we get.
|
||||
|
||||
In most code bases, simple `WHERE` queries with `SORT`s abound, and one of the big benefits of UUIDv6, UUIDv7 and the other alternatives is lexicographic sorting, after all.
|
||||
|
||||
Knowing *just how good* a certain ID generation method is at maintaining locality would be nice to know.
|
||||
|
||||
Creating and using a function like `idkit_uuidv1_extract_timestamptz` and using it in a [“functional index” (an index on an expression)](https://www.postgresql.org/docs/14/indexes-expressional.html) could resolve the sort unfriendliness of UUIDv1 as well!
|
||||
|
||||
## Wrap-up
|
||||
|
||||
Identifiers have a long history and are surprisingly unsolved at present. It can be confusing but thanks to the power of Postgres we don't have to over-think it -- tables can be migrated from one ID pattern to another, and we can use DDL statements in transactions.
|
||||
|
||||
Hopefully this article helps you head off some bikeshedding with your teammates when you next discuss which IDs are best to use.
|
||||
|
||||
## More Postgres articles
|
||||
|
||||
- [Partial data dumps using Postgres Row Level Security](https://supabase.com/blog/partial-postgresql-data-dumps-with-rls)
|
||||
- [Postgres Views](https://supabase.com/blog/postgresql-views)
|
||||
- [Postgres Auditing in 150 lines of SQL](https://supabase.com/blog/audit)
|
||||
- [Cracking PostgreSQL Interview Questions](https://supabase.com/blog/cracking-postgres-interview)
|
||||
- [What are PostgreSQL Templates?](https://supabase.com/blog/postgresql-templates)
|
||||
- [Realtime Postgres RLS on Supabase](https://supabase.com/blog/realtime-row-level-security-in-postgresql)
|
||||
- [Implementing "seen by" functionality with Postgres](https://supabase.com/blog/seen-by-in-postgresql)
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 438 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 108 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 114 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 172 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 208 KiB |
+134
-120
@@ -5,840 +5,854 @@
|
||||
<link>https://supabase.com</link>
|
||||
<description>Latest news from Supabase</description>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Tue, 23 Aug 2022 23:11:00 +0000</lastBuildDate>
|
||||
<lastBuildDate>Tue, 06 Sep 2022 22:10:00 +0000</lastBuildDate>
|
||||
<atom:link href="https://supabase.com/rss.xml" rel="self" type="application/rss+xml"/>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/choosing-a-postgres-primary-key</guid>
|
||||
<title>Choosing a Postgres Primary Key</title>
|
||||
<link>https://supabase.com/blog/choosing-a-postgres-primary-key</link>
|
||||
<description>Turns out the question of which identifier to use as a Primary Key is complicated -- we're going to dive into some of the complexity and inherent trade-offs, and figure things out</description>
|
||||
<pubDate>Tue, 06 Sep 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/launch-week-5-hackathon-winners</guid>
|
||||
<title>Launch Week 5 Hackathon Winners</title>
|
||||
<link>https://supabase.com/blog/launch-week-5-hackathon-winners</link>
|
||||
<description>Announcing the winners of the Launch Week 5 Hackathon!</description>
|
||||
<pubDate>Wed, 24 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/building-a-realtime-trello-board-with-supabase-and-angular</guid>
|
||||
<title>Building a Realtime Trello Board with Supabase and Angular</title>
|
||||
<link>https://supabase.com/blog/building-a-realtime-trello-board-with-supabase-and-angular</link>
|
||||
<description>Go beyond the hello world example with this real world project.</description>
|
||||
<pubDate>Tue, 23 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 23 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-vault</guid>
|
||||
<title>Supabase Vault</title>
|
||||
<link>https://supabase.com/blog/supabase-vault</link>
|
||||
<description>Today we're announcing Vault, a Postgres extension for managing secrets and encryption inside your database.</description>
|
||||
<pubDate>Thu, 18 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 18 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgrest-v10</guid>
|
||||
<title>PostgREST v10: EXPLAIN and Improved Relationship Detection</title>
|
||||
<link>https://supabase.com/blog/postgrest-v10</link>
|
||||
<description>Today, PostgREST 10 was released. Let's take a look at some of the new features that go hand in hand with supabase-js v2.</description>
|
||||
<pubDate>Thu, 18 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 18 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validation</guid>
|
||||
<title>pg_jsonschema: JSON Schema support for Postgres</title>
|
||||
<link>https://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validation</link>
|
||||
<description>Today we're releasing pg_jsonschema, a Postgres extension for JSON validation.</description>
|
||||
<pubDate>Thu, 18 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 18 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/launch-week-5-one-more-thing</guid>
|
||||
<title>One more thing</title>
|
||||
<link>https://supabase.com/blog/launch-week-5-one-more-thing</link>
|
||||
<description>Let's be honest, it's never just one more thing.</description>
|
||||
<pubDate>Thu, 18 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 18 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/launch-week-5-community-day</guid>
|
||||
<title>Community Day</title>
|
||||
<link>https://supabase.com/blog/launch-week-5-community-day</link>
|
||||
<description>Wrapping up Launch Week 5 with contributors, partners, and friends.</description>
|
||||
<pubDate>Thu, 18 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 18 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-realtime-multiplayer-general-availability</guid>
|
||||
<title>Realtime: Multiplayer Edition</title>
|
||||
<link>https://supabase.com/blog/supabase-realtime-multiplayer-general-availability</link>
|
||||
<description>Announcing the general availability of Realtime's Broadcast and Presence.</description>
|
||||
<pubDate>Wed, 17 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Wed, 17 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-soc2</guid>
|
||||
<title>Supabase is SOC2 compliant</title>
|
||||
<link>https://supabase.com/blog/supabase-soc2</link>
|
||||
<description>Supabase is now SOC2 compliant. Learn how we got here and what it means for our customers.</description>
|
||||
<pubDate>Tue, 16 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 16 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-js-v2</guid>
|
||||
<title>supabase-js v2 Release Candidate</title>
|
||||
<link>https://supabase.com/blog/supabase-js-v2</link>
|
||||
<description>First peek of supabase-js v2, which focuses on quality-of-life improvements for developers.</description>
|
||||
<pubDate>Mon, 15 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Mon, 15 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-cli-v1-and-admin-api-beta</guid>
|
||||
<title>Supabase CLI v1 and Admin API Beta</title>
|
||||
<link>https://supabase.com/blog/supabase-cli-v1-and-admin-api-beta</link>
|
||||
<description>We are moving Supabase CLI v1 out of beta, and releasing Admin API beta.</description>
|
||||
<pubDate>Sun, 14 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 14 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-series-b</guid>
|
||||
<title>Supabase Series B</title>
|
||||
<link>https://supabase.com/blog/supabase-series-b</link>
|
||||
<description>Supabase raised $80M in May, bringing our total funding to $116M.</description>
|
||||
<pubDate>Thu, 11 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 11 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/launch-week-5-hackathon</guid>
|
||||
<title>Launch Week 5 Hackathon</title>
|
||||
<link>https://supabase.com/blog/launch-week-5-hackathon</link>
|
||||
<description>Build to win $1500 - Friday 12th to Monday 21st August 2022</description>
|
||||
<pubDate>Tue, 09 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 09 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/slack-consolidate-slackbot-to-consolidate-messages</guid>
|
||||
<title>Slack Consolidate: a slackbot built with Python and Supabase</title>
|
||||
<link>https://supabase.com/blog/slack-consolidate-slackbot-to-consolidate-messages</link>
|
||||
<description>A slackbot to consolidate messages from different channels using Supabase, Slack SDK and Python</description>
|
||||
<pubDate>Mon, 08 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Mon, 08 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-update-july-2022</guid>
|
||||
<title>Supabase Beta July 2022</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-update-july-2022</link>
|
||||
<description>Launch Week Golden Tickets, Flutter SDK 1.0 Developer Preview and more...</description>
|
||||
<pubDate>Tue, 02 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 02 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-flutter-sdk-1-developer-preview</guid>
|
||||
<title>Supabase Flutter SDK 1.0 Developer Preview</title>
|
||||
<link>https://supabase.com/blog/supabase-flutter-sdk-1-developer-preview</link>
|
||||
<description>Supabase Flutter SDK is getting a major update and we need your help making it better.</description>
|
||||
<pubDate>Mon, 01 Aug 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Mon, 01 Aug 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/seen-by-in-postgresql</guid>
|
||||
<title>Implementing "seen by" functionality with Postgres</title>
|
||||
<link>https://supabase.com/blog/seen-by-in-postgresql</link>
|
||||
<description>Different approaches for tracking visitor counts with PostgreSQL.</description>
|
||||
<pubDate>Sun, 17 Jul 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 17 Jul 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-auth-helpers-with-sveltekit-support</guid>
|
||||
<title>Revamped Auth Helpers for Supabase (with SvelteKit support)</title>
|
||||
<link>https://supabase.com/blog/supabase-auth-helpers-with-sveltekit-support</link>
|
||||
<description>Supabase Auth Helpers now have improved developer experience, Sveltekit support, and more.</description>
|
||||
<pubDate>Tue, 12 Jul 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 12 Jul 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/beta-update-june-2022</guid>
|
||||
<title>Supabase Beta June 2022</title>
|
||||
<link>https://supabase.com/blog/beta-update-june-2022</link>
|
||||
<description>Auth Helpers, Unlimited Free Projects, CLI and more...</description>
|
||||
<pubDate>Tue, 05 Jul 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 05 Jul 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/flutter-tutorial-building-a-chat-app</guid>
|
||||
<title>Flutter Tutorial: building a Flutter chat app</title>
|
||||
<link>https://supabase.com/blog/flutter-tutorial-building-a-chat-app</link>
|
||||
<description>How to create a real time chat app using Flutter.</description>
|
||||
<pubDate>Wed, 29 Jun 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Wed, 29 Jun 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/visualizing-supabase-data-using-metabase</guid>
|
||||
<title>Visualizing Supabase Data using Metabase</title>
|
||||
<link>https://supabase.com/blog/visualizing-supabase-data-using-metabase</link>
|
||||
<description>How to create different kinds of charts out of data stored in Supabase using Metabase.</description>
|
||||
<pubDate>Tue, 28 Jun 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 28 Jun 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/partial-postgresql-data-dumps-with-rls</guid>
|
||||
<title>Partial data dumps using Postgres Row Level Security</title>
|
||||
<link>https://supabase.com/blog/partial-postgresql-data-dumps-with-rls</link>
|
||||
<description>Using RLS to create seed files for local PostgreSQL testing.</description>
|
||||
<pubDate>Mon, 27 Jun 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Mon, 27 Jun 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/loading-data-supabase-python</guid>
|
||||
<title>Python data loading with Supabase</title>
|
||||
<link>https://supabase.com/blog/loading-data-supabase-python</link>
|
||||
<description>An example of how to load data into Supabase using supabase-py</description>
|
||||
<pubDate>Thu, 16 Jun 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 16 Jun 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/beta-update-may-2022</guid>
|
||||
<title>Supabase Beta May 2022</title>
|
||||
<link>https://supabase.com/blog/beta-update-may-2022</link>
|
||||
<description>Product and community updates including wildcard auth redirects, edge functions with webhooks, and Prometheus endpoints for everybody.</description>
|
||||
<pubDate>Tue, 31 May 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 31 May 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/how-supabase-accelerates-development-of-all-pull-together</guid>
|
||||
<title>How Mike Lyndon is using Supabase to accelerate development of AllPullTogether</title>
|
||||
<link>https://supabase.com/blog/how-supabase-accelerates-development-of-all-pull-together</link>
|
||||
<description>Mike Lyndon is learning web development as he builds AllPullTogether, and Supabase is helping him accelerate what he can accomplish.</description>
|
||||
<pubDate>Wed, 25 May 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Wed, 25 May 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/partner-gallery-works-with-supabase</guid>
|
||||
<title>Works With Supabase - announcing our Partner Gallery</title>
|
||||
<link>https://supabase.com/blog/partner-gallery-works-with-supabase</link>
|
||||
<description>Introducing our Partner Gallery - open source and made with Supabase.</description>
|
||||
<pubDate>Tue, 19 Apr 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 19 Apr 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/bring-the-func-hackathon-winners</guid>
|
||||
<title>Bring the Func Hackathon Winners 2022</title>
|
||||
<link>https://supabase.com/blog/bring-the-func-hackathon-winners</link>
|
||||
<description>Celebrating many amazing OSS Hackathon projects using GraphQL and Edge Functions.</description>
|
||||
<pubDate>Sun, 17 Apr 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 17 Apr 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/beta-update-march-2022</guid>
|
||||
<title>Supabase Beta March 2022</title>
|
||||
<link>https://supabase.com/blog/beta-update-march-2022</link>
|
||||
<description>Functions, GraphQL, and much more.</description>
|
||||
<pubDate>Thu, 14 Apr 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 14 Apr 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabrew</guid>
|
||||
<title>Supabrew - Never Code Thirsty</title>
|
||||
<link>https://supabase.com/blog/supabrew</link>
|
||||
<description>A light and refreshing non-alcoholic beer for devs.</description>
|
||||
<pubDate>Thu, 31 Mar 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 31 Mar 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-realtime-with-multiplayer-features</guid>
|
||||
<title>Supabase Realtime, with Multiplayer Features</title>
|
||||
<link>https://supabase.com/blog/supabase-realtime-with-multiplayer-features</link>
|
||||
<description>Today we're announced Realtime, with multiplayer features. Realtime enables broadcast, presence, and listening to database changes delivered over WebSockets.</description>
|
||||
<pubDate>Thu, 31 Mar 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 31 Mar 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/hackathon-bring-the-func</guid>
|
||||
<title>Hackathon: Bring the Func(🕺)</title>
|
||||
<link>https://supabase.com/blog/hackathon-bring-the-func</link>
|
||||
<description>Build open-source projects with our latest features, win limited edition swag and plant a tree!</description>
|
||||
<pubDate>Thu, 31 Mar 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 31 Mar 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-edge-functions</guid>
|
||||
<title>Edge Functions are now available in Supabase</title>
|
||||
<link>https://supabase.com/blog/supabase-edge-functions</link>
|
||||
<description>Today we're launching Edge Functions. Edge Functions let you execute Typescript code close to your users, no matter where they're located.</description>
|
||||
<pubDate>Wed, 30 Mar 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Wed, 30 Mar 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-enterprise</guid>
|
||||
<title>Introducing Supabase Enterprise</title>
|
||||
<link>https://supabase.com/blog/supabase-enterprise</link>
|
||||
<description>Today we are releasing Supabase Enterprise, a suite of features to scale your project.</description>
|
||||
<pubDate>Tue, 29 Mar 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 29 Mar 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/graphql-now-available</guid>
|
||||
<title>GraphQL is now available in Supabase</title>
|
||||
<link>https://supabase.com/blog/graphql-now-available</link>
|
||||
<description>GraphQL support is now in general availability on the Supabase platform via our open source PostgreSQL extension, pg_graphql (beta).</description>
|
||||
<pubDate>Mon, 28 Mar 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Mon, 28 Mar 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/community-day-lw4</guid>
|
||||
<title>Community Day</title>
|
||||
<link>https://supabase.com/blog/community-day-lw4</link>
|
||||
<description>Kicking off Launch Week 4 with contributors, partners, and friends.</description>
|
||||
<pubDate>Sun, 27 Mar 2022 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 27 Mar 2022 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-launch-week-four</guid>
|
||||
<title>Supabase Launch Week 4</title>
|
||||
<link>https://supabase.com/blog/supabase-launch-week-four</link>
|
||||
<description>Launch Week 4: One new feature every day for an entire week. Starting Monday 28th March.</description>
|
||||
<pubDate>Fri, 25 Mar 2022 00:12:00 +0000</pubDate>
|
||||
<pubDate>Thu, 24 Mar 2022 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/should-i-open-source-my-company</guid>
|
||||
<title>Should I Open Source my Company?</title>
|
||||
<link>https://supabase.com/blog/should-i-open-source-my-company</link>
|
||||
<description>The unexpected upsides of building in public</description>
|
||||
<pubDate>Fri, 25 Mar 2022 00:12:00 +0000</pubDate>
|
||||
<pubDate>Thu, 24 Mar 2022 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/audit</guid>
|
||||
<title>Postgres Auditing in 150 lines of SQL</title>
|
||||
<link>https://supabase.com/blog/audit</link>
|
||||
<description>PostgreSQL has a robust set of features which we can leverage to create a generic auditing solution in 150 lines of SQL.</description>
|
||||
<pubDate>Tue, 08 Mar 2022 00:12:00 +0000</pubDate>
|
||||
<pubDate>Mon, 07 Mar 2022 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-january-2022</guid>
|
||||
<title>Supabase Beta January 2022</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-january-2022</link>
|
||||
<description>New auth providers, SMS providers, and new videos.</description>
|
||||
<pubDate>Tue, 22 Feb 2022 00:12:00 +0000</pubDate>
|
||||
<pubDate>Mon, 21 Feb 2022 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-december-2021</guid>
|
||||
<title>Supabase Beta December 2021</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-december-2021</link>
|
||||
<description>New crypto extension, Postgres videos, and a bunch of cool integrations.</description>
|
||||
<pubDate>Thu, 20 Jan 2022 00:12:00 +0000</pubDate>
|
||||
<pubDate>Wed, 19 Jan 2022 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/product-hunt-golden-kitty-awards-2021</guid>
|
||||
<title>Golden Kitty Awards Ceremony Watch Party with Supabase</title>
|
||||
<link>https://supabase.com/blog/product-hunt-golden-kitty-awards-2021</link>
|
||||
<description>Hang out with us while watching the Product Hunt Golden Kitty Awards Ceremony</description>
|
||||
<pubDate>Thu, 20 Jan 2022 00:12:00 +0000</pubDate>
|
||||
<pubDate>Wed, 19 Jan 2022 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/holiday-hackdays-winners-2021</guid>
|
||||
<title>Holiday Hackdays Winners 2021</title>
|
||||
<link>https://supabase.com/blog/holiday-hackdays-winners-2021</link>
|
||||
<description>Celebrating many amazing projects submitted to our Holiday Hackdays Hackathon.</description>
|
||||
<pubDate>Fri, 17 Dec 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Thu, 16 Dec 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/beta-november-2021-launch-week-recap</guid>
|
||||
<title>Supabase Beta November 2021: Launch Week Recap</title>
|
||||
<link>https://supabase.com/blog/beta-november-2021-launch-week-recap</link>
|
||||
<description>We wrapped up November with Supabase's third Launch Week. Here's all the awesome stuff that got shipped ...</description>
|
||||
<pubDate>Wed, 15 Dec 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Tue, 14 Dec 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-holiday-hackdays-hackathon</guid>
|
||||
<title>Kicking off the Holiday Hackdays</title>
|
||||
<link>https://supabase.com/blog/supabase-holiday-hackdays-hackathon</link>
|
||||
<description>Build cool stuff and celebrate open-source software with us during the Holiday Hackdays!</description>
|
||||
<pubDate>Fri, 03 Dec 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Thu, 02 Dec 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/pg-graphql</guid>
|
||||
<title>pg_graphql: A GraphQL extension for PostgreSQL</title>
|
||||
<link>https://supabase.com/blog/pg-graphql</link>
|
||||
<description>GraphQL support is in development for PostgreSQL + Supabase.</description>
|
||||
<pubDate>Fri, 03 Dec 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Thu, 02 Dec 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/launch-week-three-friday-five-more-things</guid>
|
||||
<title>Five more things</title>
|
||||
<link>https://supabase.com/blog/launch-week-three-friday-five-more-things</link>
|
||||
<description>It's never just one more thing!</description>
|
||||
<pubDate>Fri, 03 Dec 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Thu, 02 Dec 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-acquires-logflare</guid>
|
||||
<title>Supabase acquires Logflare</title>
|
||||
<link>https://supabase.com/blog/supabase-acquires-logflare</link>
|
||||
<description>Today, we're ecstatic to announce that Logflare is joining Supabase.</description>
|
||||
<pubDate>Thu, 02 Dec 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Wed, 01 Dec 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/realtime-row-level-security-in-postgresql</guid>
|
||||
<title>Realtime Postgres RLS now available on Supabase</title>
|
||||
<link>https://supabase.com/blog/realtime-row-level-security-in-postgresql</link>
|
||||
<description>Realtime database changes are now broadcast to authenticated users, respecting the same PostgreSQL policies that you use for Row Level Security.</description>
|
||||
<pubDate>Wed, 01 Dec 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Tue, 30 Nov 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-studio</guid>
|
||||
<title>Supabase Studio</title>
|
||||
<link>https://supabase.com/blog/supabase-studio</link>
|
||||
<description>The same Dashboard that you're using on our Platform is now available for local development and Self-Hosting.</description>
|
||||
<pubDate>Tue, 30 Nov 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Mon, 29 Nov 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/community-day-lw3</guid>
|
||||
<title>Community Day</title>
|
||||
<link>https://supabase.com/blog/community-day-lw3</link>
|
||||
<description>Kicking off launch week by highlighting the communities around Supabase.</description>
|
||||
<pubDate>Mon, 29 Nov 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Sun, 28 Nov 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/whats-new-in-postgres-14</guid>
|
||||
<title>New in PostgreSQL 14: What every developer should know</title>
|
||||
<link>https://supabase.com/blog/whats-new-in-postgres-14</link>
|
||||
<description>A quick look at some new features and functionality in PostgreSQL 14.</description>
|
||||
<pubDate>Sun, 28 Nov 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Sat, 27 Nov 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgrest-9</guid>
|
||||
<title>PostgREST 9</title>
|
||||
<link>https://supabase.com/blog/postgrest-9</link>
|
||||
<description>New features and updates in PostgREST version 9.</description>
|
||||
<pubDate>Sat, 27 Nov 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Fri, 26 Nov 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-launch-week-the-trilogy</guid>
|
||||
<title>Supabase Launch Week III: Holiday Special</title>
|
||||
<link>https://supabase.com/blog/supabase-launch-week-the-trilogy</link>
|
||||
<description>Tis the season to be shipping.</description>
|
||||
<pubDate>Fri, 26 Nov 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Thu, 25 Nov 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-how-we-launch</guid>
|
||||
<title>How we launch at Supabase</title>
|
||||
<link>https://supabase.com/blog/supabase-how-we-launch</link>
|
||||
<description>The history and methodology of Supabase Launch Week.</description>
|
||||
<pubDate>Fri, 26 Nov 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Thu, 25 Nov 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-october-2021</guid>
|
||||
<title>Supabase Beta October 2021</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-october-2021</link>
|
||||
<description>Three new Auth providers, multi-schema support, and we're gearing up for another Launch Week.</description>
|
||||
<pubDate>Sun, 07 Nov 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Sat, 06 Nov 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-series-a</guid>
|
||||
<title>Supabase $30m Series A</title>
|
||||
<link>https://supabase.com/blog/supabase-series-a</link>
|
||||
<description>Supabase just raised $30M, bringing our total funding to $36M.</description>
|
||||
<pubDate>Wed, 27 Oct 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Wed, 27 Oct 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/replenysh-time-to-value-in-less-than-24-hours</guid>
|
||||
<title>Replenysh uses Supabase to implement OTP in less than 24-hours</title>
|
||||
<link>https://supabase.com/blog/replenysh-time-to-value-in-less-than-24-hours</link>
|
||||
<description>Learn how Replenysh uses Supabase to power the circular economy, redefining how brands interact with their customers and products.</description>
|
||||
<pubDate>Mon, 18 Oct 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Mon, 18 Oct 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/hacktoberfest-hackathon-winners-2021</guid>
|
||||
<title>Hacktoberfest Hackathon Winners 2021</title>
|
||||
<link>https://supabase.com/blog/hacktoberfest-hackathon-winners-2021</link>
|
||||
<description>Celebrating many amazing projects submitted to our Hacktoberfest Hackathon.</description>
|
||||
<pubDate>Wed, 13 Oct 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Wed, 13 Oct 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-sept-2021</guid>
|
||||
<title>Supabase Beta Sept 2021</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-sept-2021</link>
|
||||
<description>Hackathon, Aborting request, UI updates, and now Hiring.</description>
|
||||
<pubDate>Sun, 03 Oct 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 03 Oct 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-hacktoberfest-hackathon-2021</guid>
|
||||
<title>Supabase Hacktoberfest Hackathon 2021</title>
|
||||
<link>https://supabase.com/blog/supabase-hacktoberfest-hackathon-2021</link>
|
||||
<description>We're running another Supabase Hackathon during Hacktoberfest!</description>
|
||||
<pubDate>Mon, 27 Sep 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Mon, 27 Sep 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-august-2021</guid>
|
||||
<title>Supabase Beta August 2021</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-august-2021</link>
|
||||
<description>Fundraising, Realtime Security, custom SMS templates, and deployments in South Korea.</description>
|
||||
<pubDate>Thu, 09 Sep 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 09 Sep 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-july-2021</guid>
|
||||
<title>Supabase Beta July 2021</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-july-2021</link>
|
||||
<description>Discord Logins, Vercel Integration, Full text search, and OAuth guides.</description>
|
||||
<pubDate>Wed, 11 Aug 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Wed, 11 Aug 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/hackathon-winners</guid>
|
||||
<title>Open Source Hackathon Winners</title>
|
||||
<link>https://supabase.com/blog/hackathon-winners</link>
|
||||
<description>Let the medal ceremony begin for the best projects submitted during the Supabase Hackathon.</description>
|
||||
<pubDate>Sun, 08 Aug 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 08 Aug 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-swag-store</guid>
|
||||
<title>Supabase Swag Store</title>
|
||||
<link>https://supabase.com/blog/supabase-swag-store</link>
|
||||
<description>Today we are officially launching the Supabase Swag Store.</description>
|
||||
<pubDate>Thu, 29 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 29 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-functions-updates</guid>
|
||||
<title>Updates for Supabase Functions</title>
|
||||
<link>https://supabase.com/blog/supabase-functions-updates</link>
|
||||
<description>The question on everyone's mind - are we launching Supabase Functions? Well, it's complicated.</description>
|
||||
<pubDate>Thu, 29 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 29 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/1-the-supabase-hackathon</guid>
|
||||
<title>The Supabase Hackathon</title>
|
||||
<link>https://supabase.com/blog/1-the-supabase-hackathon</link>
|
||||
<description>A whole week of Hacking for Fun and Prizes.</description>
|
||||
<pubDate>Thu, 29 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 29 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-reports-and-metrics</guid>
|
||||
<title>Supabase Reports and Metrics</title>
|
||||
<link>https://supabase.com/blog/supabase-reports-and-metrics</link>
|
||||
<description>We're exposing a full set of metrics in your projects, so that you can build better (and faster) products for your users.</description>
|
||||
<pubDate>Wed, 28 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Wed, 28 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-auth-passwordless-sms-login</guid>
|
||||
<title>Supabase Auth v2: Phone Auth now available</title>
|
||||
<link>https://supabase.com/blog/supabase-auth-passwordless-sms-login</link>
|
||||
<description>Phone Auth is available today on all new and existing Supabase projects.</description>
|
||||
<pubDate>Tue, 27 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 27 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/mobbin-supabase-200000-users</guid>
|
||||
<title>Mobbin uses Supabase to authenticate 200,000 users</title>
|
||||
<link>https://supabase.com/blog/mobbin-supabase-200000-users</link>
|
||||
<description>Learn how Mobbin migrated 200,000 users from Firebase for a better authentication experience.</description>
|
||||
<pubDate>Tue, 27 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 27 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/storage-beta</guid>
|
||||
<title>Supabase Storage now in Beta</title>
|
||||
<link>https://supabase.com/blog/storage-beta</link>
|
||||
<description>Supabase Storage moves into Beta.</description>
|
||||
<pubDate>Mon, 26 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Mon, 26 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/spot-flutter-with-postgres</guid>
|
||||
<title>Spot: a video sharing app built with Flutter</title>
|
||||
<link>https://supabase.com/blog/spot-flutter-with-postgres</link>
|
||||
<description>Spot is a geolocation-based video-sharing app with some social networking features.</description>
|
||||
<pubDate>Mon, 26 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Mon, 26 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-postgres-13</guid>
|
||||
<title>Supabase is now on Postgres 13.3</title>
|
||||
<link>https://supabase.com/blog/supabase-postgres-13</link>
|
||||
<description>From today, new Supabase projects will be on a version of Supabase Postgres that runs on Postgres 13.3.</description>
|
||||
<pubDate>Sun, 25 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 25 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-community-day</guid>
|
||||
<title>Supabase Community Day</title>
|
||||
<link>https://supabase.com/blog/supabase-community-day</link>
|
||||
<description>Community Day</description>
|
||||
<pubDate>Sun, 25 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 25 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/epsilon3-self-hosting</guid>
|
||||
<title>Epsilon3 Self-Host Supabase To Revolutionize Space Operations </title>
|
||||
<link>https://supabase.com/blog/epsilon3-self-hosting</link>
|
||||
<description>Learn how the team at Epsilon3 use Supabase to help teams execute secure and reliable operations in an industry that project spend runs into the billions.</description>
|
||||
<pubDate>Sun, 25 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 25 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-launch-week-sql</guid>
|
||||
<title>Supabase Launch Week II: The SQL</title>
|
||||
<link>https://supabase.com/blog/supabase-launch-week-sql</link>
|
||||
<description>Five days of Supabase. Again.</description>
|
||||
<pubDate>Wed, 21 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Wed, 21 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/roles-postgres-hooks</guid>
|
||||
<title>Protecting reserved roles with PostgreSQL Hooks</title>
|
||||
<link>https://supabase.com/blog/roles-postgres-hooks</link>
|
||||
<description>Using Postgres Hooks to protect functionality in your Postgres database.</description>
|
||||
<pubDate>Thu, 01 Jul 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 01 Jul 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-june-2021</guid>
|
||||
<title>Supabase Beta June 2021</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-june-2021</link>
|
||||
<description>Discord Logins, Vercel Integration, Full text search, and OAuth guides.</description>
|
||||
<pubDate>Tue, 01 Jun 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 01 Jun 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-may-2021</guid>
|
||||
<title>Supabase Beta May 2021</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-may-2021</link>
|
||||
<description>Apple & Twitter Logins, Supabase Grid, Go & Swift Libraries.</description>
|
||||
<pubDate>Tue, 01 Jun 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 01 Jun 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-april-2021</guid>
|
||||
<title>Supabase Beta April 2021</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-april-2021</link>
|
||||
<description>Supabase "gardening" - stability, security, and community support.</description>
|
||||
<pubDate>Tue, 04 May 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 04 May 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-march-2021</guid>
|
||||
<title>Supabase Beta March 2021</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-march-2021</link>
|
||||
<description>Launch week, Storage, Supabase CLI, Connection Pooling, Supabase UI, and Pricing.</description>
|
||||
<pubDate>Mon, 05 Apr 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Mon, 05 Apr 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-workflows</guid>
|
||||
<title>Workflows are coming to Supabase</title>
|
||||
<link>https://supabase.com/blog/supabase-workflows</link>
|
||||
<description>Functions are great, but you know what's better?</description>
|
||||
<pubDate>Thu, 01 Apr 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 01 Apr 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-pgbouncer</guid>
|
||||
<title>PgBouncer is now available in Supabase</title>
|
||||
<link>https://supabase.com/blog/supabase-pgbouncer</link>
|
||||
<description>Better support for Serverless and Postgres.</description>
|
||||
<pubDate>Thu, 01 Apr 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 01 Apr 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-dot-com</guid>
|
||||
<title>Supabase Dot Com</title>
|
||||
<link>https://supabase.com/blog/supabase-dot-com</link>
|
||||
<description>The Supabase Domain name is changing.</description>
|
||||
<pubDate>Thu, 01 Apr 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 01 Apr 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-nft-marketplace</guid>
|
||||
<title>Supabase Launches NFT Marketplace</title>
|
||||
<link>https://supabase.com/blog/supabase-nft-marketplace</link>
|
||||
<description>A fully encrypted NFT platform to protect and transact your digital assets</description>
|
||||
<pubDate>Wed, 31 Mar 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Wed, 31 Mar 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-cli</guid>
|
||||
<title>Supabase CLI</title>
|
||||
<link>https://supabase.com/blog/supabase-cli</link>
|
||||
<description>Local development, database migrations, and self-hosting.</description>
|
||||
<pubDate>Tue, 30 Mar 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 30 Mar 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-storage</guid>
|
||||
<title>Storage is now available in Supabase</title>
|
||||
<link>https://supabase.com/blog/supabase-storage</link>
|
||||
<description>Launching Supabase Storage and how you can use it in your apps</description>
|
||||
<pubDate>Mon, 29 Mar 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Mon, 29 Mar 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/pricing</guid>
|
||||
<title>Supabase Beta Pricing</title>
|
||||
<link>https://supabase.com/blog/pricing</link>
|
||||
<description>Supabase launches Beta pricing structure</description>
|
||||
<pubDate>Sun, 28 Mar 2021 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 28 Mar 2021 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/launch-week</guid>
|
||||
<title>Launch week</title>
|
||||
<link>https://supabase.com/blog/launch-week</link>
|
||||
<description>Five days of Supabase.</description>
|
||||
<pubDate>Thu, 25 Mar 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Wed, 24 Mar 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/angels-of-supabase</guid>
|
||||
<title>Angels of Supabase</title>
|
||||
<link>https://supabase.com/blog/angels-of-supabase</link>
|
||||
<description>Meet the investors of Supabase.</description>
|
||||
<pubDate>Thu, 25 Mar 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Wed, 24 Mar 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/In-The-Loop</guid>
|
||||
<title>Developers stay up to date with intheloop.dev</title>
|
||||
<link>https://supabase.com/blog/In-The-Loop</link>
|
||||
<description>Learn why Kevin is building intheloop.dev with Supabase</description>
|
||||
<pubDate>Mon, 22 Mar 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Sun, 21 Mar 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/using-supabase-replit</guid>
|
||||
<title>Using Supabase in Replit</title>
|
||||
<link>https://supabase.com/blog/using-supabase-replit</link>
|
||||
<description>Free hosted relational database from within your node.js repl</description>
|
||||
<pubDate>Thu, 11 Mar 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Wed, 10 Mar 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/toad-a-link-shortener-with-simple-apis-for-low-coders</guid>
|
||||
<title>Toad, a link shortener with simple APIs for low-coders</title>
|
||||
<link>https://supabase.com/blog/toad-a-link-shortener-with-simple-apis-for-low-coders</link>
|
||||
<description>An easy-to-use link shortening tool with simple APIs</description>
|
||||
<pubDate>Mon, 08 Mar 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Sun, 07 Mar 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgres-as-a-cron-server</guid>
|
||||
<title>Postgres as a CRON Server</title>
|
||||
<link>https://supabase.com/blog/postgres-as-a-cron-server</link>
|
||||
<description>Running repetitive tasks with your Postgres database.</description>
|
||||
<pubDate>Fri, 05 Mar 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Thu, 04 Mar 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-february-2021</guid>
|
||||
<title>Supabase Beta February 2021</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-february-2021</link>
|
||||
<description>One year of building.</description>
|
||||
<pubDate>Tue, 02 Mar 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Mon, 01 Mar 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/cracking-postgres-interview</guid>
|
||||
<title>Cracking PostgreSQL Interview Questions</title>
|
||||
<link>https://supabase.com/blog/cracking-postgres-interview</link>
|
||||
<description>Understand the top PostgreSQL Interview Questions</description>
|
||||
<pubDate>Sat, 27 Feb 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Fri, 26 Feb 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/case-study-roboflow</guid>
|
||||
<title>Roboflow.com choose Supabase to power Paint.wtf leaderboard</title>
|
||||
<link>https://supabase.com/blog/case-study-roboflow</link>
|
||||
<description>Learn how Roboflow.com used Supabase to build their Paint.wtf leaderboard</description>
|
||||
<pubDate>Tue, 09 Feb 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Mon, 08 Feb 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-january-2021</guid>
|
||||
<title>Supabase Beta January 2021</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-january-2021</link>
|
||||
<description>Eleven months of building.</description>
|
||||
<pubDate>Tue, 02 Feb 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Mon, 01 Feb 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-beta-december-2020</guid>
|
||||
<title>Supabase Beta December 2020</title>
|
||||
<link>https://supabase.com/blog/supabase-beta-december-2020</link>
|
||||
<description>Ten months of building.</description>
|
||||
<pubDate>Sat, 02 Jan 2021 00:12:00 +0000</pubDate>
|
||||
<pubDate>Fri, 01 Jan 2021 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-dashboard-performance</guid>
|
||||
<title>Making the Supabase Dashboard Supa-fast</title>
|
||||
<link>https://supabase.com/blog/supabase-dashboard-performance</link>
|
||||
<description>Improving the performance of the Supabase dashboard</description>
|
||||
<pubDate>Sun, 13 Dec 2020 00:12:00 +0000</pubDate>
|
||||
<pubDate>Sat, 12 Dec 2020 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-striveschool</guid>
|
||||
<title>Supabase Partners With Strive School To Help Teach Open Source</title>
|
||||
<link>https://supabase.com/blog/supabase-striveschool</link>
|
||||
<description>Supabase Partners With Strive School To Help Teach Open Source To The Next Generation Of Developers</description>
|
||||
<pubDate>Wed, 02 Dec 2020 00:12:00 +0000</pubDate>
|
||||
<pubDate>Tue, 01 Dec 2020 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/case-study-xendit</guid>
|
||||
<title>Xendit Built a Counter-Fraud Watchlist for the Fintech Industry</title>
|
||||
<link>https://supabase.com/blog/case-study-xendit</link>
|
||||
<description>See how Xendit use Supabase to build a full-text search engine.</description>
|
||||
<pubDate>Wed, 02 Dec 2020 00:12:00 +0000</pubDate>
|
||||
<pubDate>Tue, 01 Dec 2020 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/case-study-tayfa</guid>
|
||||
<title>TAYFA Built a No-Code Website Builder in Seven Days</title>
|
||||
<link>https://supabase.com/blog/case-study-tayfa</link>
|
||||
<description>See how Tayfa went from idea to paying customer in less than 30 days.</description>
|
||||
<pubDate>Wed, 02 Dec 2020 00:12:00 +0000</pubDate>
|
||||
<pubDate>Tue, 01 Dec 2020 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/case-study-monitoro</guid>
|
||||
<title>Monitoro Built a Web Crawler Handling Millions of API Requests</title>
|
||||
<link>https://supabase.com/blog/case-study-monitoro</link>
|
||||
<description>See how Monitoro built an automated scraping platform using Supabase.</description>
|
||||
<pubDate>Wed, 02 Dec 2020 00:12:00 +0000</pubDate>
|
||||
<pubDate>Tue, 01 Dec 2020 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-alpha-november-2020</guid>
|
||||
<title>Supabase Alpha November 2020</title>
|
||||
<link>https://supabase.com/blog/supabase-alpha-november-2020</link>
|
||||
<description>Nine months of building.</description>
|
||||
<pubDate>Tue, 01 Dec 2020 00:12:00 +0000</pubDate>
|
||||
<pubDate>Mon, 30 Nov 2020 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgresql-views</guid>
|
||||
<title>Postgres Views</title>
|
||||
<link>https://supabase.com/blog/postgresql-views</link>
|
||||
<description>Creating and using a view in PostgreSQL.</description>
|
||||
<pubDate>Wed, 18 Nov 2020 00:12:00 +0000</pubDate>
|
||||
<pubDate>Tue, 17 Nov 2020 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-alpha-october-2020</guid>
|
||||
<title>Supabase Alpha October 2020</title>
|
||||
<link>https://supabase.com/blog/supabase-alpha-october-2020</link>
|
||||
<description>Eight months of building.</description>
|
||||
<pubDate>Mon, 02 Nov 2020 00:12:00 +0000</pubDate>
|
||||
<pubDate>Sun, 01 Nov 2020 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/improved-dx</guid>
|
||||
<title>Supabase.js 1.0</title>
|
||||
<link>https://supabase.com/blog/improved-dx</link>
|
||||
<description>We're releasing a new version of our Supabase client with some awesome new improvements.</description>
|
||||
<pubDate>Fri, 30 Oct 2020 00:12:00 +0000</pubDate>
|
||||
<pubDate>Thu, 29 Oct 2020 23:11:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-alpha-september-2020</guid>
|
||||
<title>Supabase Alpha September 2020</title>
|
||||
<link>https://supabase.com/blog/supabase-alpha-september-2020</link>
|
||||
<description>Seven months of building.</description>
|
||||
<pubDate>Fri, 02 Oct 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Fri, 02 Oct 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-hacktoberfest-2020</guid>
|
||||
<title>Supabase Hacktoberfest 2020</title>
|
||||
<link>https://supabase.com/blog/supabase-hacktoberfest-2020</link>
|
||||
<description>Join us for a celebration of open source software and learn how to contribute to Supabase.</description>
|
||||
<pubDate>Thu, 10 Sep 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 10 Sep 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-alpha-august-2020</guid>
|
||||
<title>Supabase Alpha August 2020</title>
|
||||
<link>https://supabase.com/blog/supabase-alpha-august-2020</link>
|
||||
<description>Six months of building</description>
|
||||
<pubDate>Wed, 02 Sep 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Wed, 02 Sep 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-auth</guid>
|
||||
<title>Supabase Auth</title>
|
||||
<link>https://supabase.com/blog/supabase-auth</link>
|
||||
<description>Authenticate and authorize your users with Supabase Auth</description>
|
||||
<pubDate>Tue, 04 Aug 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 04 Aug 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-alpha-july-2020</guid>
|
||||
<title>Supabase Alpha July 2020</title>
|
||||
<link>https://supabase.com/blog/supabase-alpha-july-2020</link>
|
||||
<description>Five months of building</description>
|
||||
<pubDate>Sat, 01 Aug 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sat, 01 Aug 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/continuous-postgresql-backup-walg</guid>
|
||||
<title>Continuous PostgreSQL Backups using WAL-G</title>
|
||||
<link>https://supabase.com/blog/continuous-postgresql-backup-walg</link>
|
||||
<description>Have you ever wanted to restore your database's state to a particular moment in time? This post explains how, using WAL-G.</description>
|
||||
<pubDate>Sat, 01 Aug 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sat, 01 Aug 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/alpha-launch-postmortem</guid>
|
||||
<title>Alpha Launch Postmortem</title>
|
||||
<link>https://supabase.com/blog/alpha-launch-postmortem</link>
|
||||
<description>Everything that went wrong with Supabase's launch</description>
|
||||
<pubDate>Thu, 09 Jul 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Thu, 09 Jul 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgresql-templates</guid>
|
||||
<title>What are PostgreSQL Templates?</title>
|
||||
<link>https://supabase.com/blog/postgresql-templates</link>
|
||||
<description>What are PostgreSQL templates and what are they used for?</description>
|
||||
<pubDate>Wed, 08 Jul 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Wed, 08 Jul 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgresql-physical-logical-backups</guid>
|
||||
<title>Physical vs Logical Backups in PostgreSQL</title>
|
||||
<link>https://supabase.com/blog/postgresql-physical-logical-backups</link>
|
||||
<description>What are physical and logical backups in Postgres?</description>
|
||||
<pubDate>Mon, 06 Jul 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Mon, 06 Jul 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-alpha-june-2020</guid>
|
||||
<title>Supabase Alpha June 2020</title>
|
||||
<link>https://supabase.com/blog/supabase-alpha-june-2020</link>
|
||||
<description>Four months of building</description>
|
||||
<pubDate>Tue, 30 Jun 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Tue, 30 Jun 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-steve-chavez</guid>
|
||||
<title>Steve Chavez has joined Supabase</title>
|
||||
<link>https://supabase.com/blog/supabase-steve-chavez</link>
|
||||
<description>Steve joins Supabase to help build Auth.</description>
|
||||
<pubDate>Sun, 14 Jun 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 14 Jun 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-alpha-may-2020</guid>
|
||||
<title>Supabase Alpha May 2020</title>
|
||||
<link>https://supabase.com/blog/supabase-alpha-may-2020</link>
|
||||
<description>Three months of building</description>
|
||||
<pubDate>Sun, 31 May 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 31 May 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-alpha-april-2020</guid>
|
||||
<title>Supabase Alpha April 2020</title>
|
||||
<link>https://supabase.com/blog/supabase-alpha-april-2020</link>
|
||||
<description>Two months of building</description>
|
||||
<pubDate>Sun, 31 May 2020 23:11:00 +0000</pubDate>
|
||||
<pubDate>Sun, 31 May 2020 22:10:00 +0000</pubDate>
|
||||
</item>
|
||||
|
||||
</channel>
|
||||
|
||||
Generated
+336
-337
@@ -728,7 +728,6 @@
|
||||
}
|
||||
},
|
||||
"apps/temp-docs": {
|
||||
"name": "docs",
|
||||
"version": "0.0.0",
|
||||
"dependencies": {
|
||||
"@apollo/client": "^3.6.6",
|
||||
@@ -7444,10 +7443,6 @@
|
||||
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
|
||||
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
|
||||
},
|
||||
"node_modules/docs": {
|
||||
"resolved": "apps/temp-docs",
|
||||
"link": true
|
||||
},
|
||||
"node_modules/doctrine": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
|
||||
@@ -16752,6 +16747,10 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/temp-docs": {
|
||||
"resolved": "apps/temp-docs",
|
||||
"link": true
|
||||
},
|
||||
"node_modules/terminal-link": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
|
||||
@@ -23037,338 +23036,6 @@
|
||||
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
|
||||
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
|
||||
},
|
||||
"docs": {
|
||||
"version": "file:apps/temp-docs",
|
||||
"requires": {
|
||||
"@apollo/client": "^3.6.6",
|
||||
"@mdx-js/loader": "^1.6.22",
|
||||
"@mdx-js/react": "^1.6.22",
|
||||
"@next/mdx": "^12.0.4",
|
||||
"@supabase/ui": "v0.37.0-alpha.50",
|
||||
"@tailwindcss/typography": "^0.4.1",
|
||||
"@types/node": "^17.0.12",
|
||||
"@types/react": "17.0.39",
|
||||
"common": "*",
|
||||
"config": "*",
|
||||
"eslint": "8.9.0",
|
||||
"graphql": "^16.5.0",
|
||||
"gray-matter": "^4.0.3",
|
||||
"markdown-toc": "^1.2.0",
|
||||
"next": "12.1.0",
|
||||
"next-mdx-remote": "^3.0.8",
|
||||
"next-themes": "0.0.15",
|
||||
"next-transpile-modules": "9.0.0",
|
||||
"react": "17.0.2",
|
||||
"react-copy-to-clipboard": "^5.0.2",
|
||||
"react-dom": "17.0.2",
|
||||
"react-markdown": "^8.0.3",
|
||||
"react-syntax-highlighter": "^15.3.1",
|
||||
"remark": "^14.0.2",
|
||||
"remark-html": "^15.0.0",
|
||||
"remark-mdx": "^2.0.0-rc.2",
|
||||
"remark-prism": "^1.3.6",
|
||||
"tsconfig": "*",
|
||||
"typescript": "^4.5.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@mdx-js/react": {
|
||||
"version": "1.6.22",
|
||||
"requires": {}
|
||||
},
|
||||
"@next/mdx": {
|
||||
"version": "12.1.5",
|
||||
"requires": {}
|
||||
},
|
||||
"@tailwindcss/typography": {
|
||||
"version": "0.4.1",
|
||||
"requires": {
|
||||
"lodash.castarray": "^4.4.0",
|
||||
"lodash.isplainobject": "^4.0.6",
|
||||
"lodash.merge": "^4.6.2",
|
||||
"lodash.uniq": "^4.5.0"
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "17.0.27",
|
||||
"dev": true
|
||||
},
|
||||
"bail": {
|
||||
"version": "2.0.2"
|
||||
},
|
||||
"ccount": {
|
||||
"version": "2.0.1"
|
||||
},
|
||||
"character-entities-html4": {
|
||||
"version": "2.1.0"
|
||||
},
|
||||
"character-entities-legacy": {
|
||||
"version": "3.0.0"
|
||||
},
|
||||
"comma-separated-tokens": {
|
||||
"version": "2.0.2"
|
||||
},
|
||||
"find-up": {
|
||||
"version": "5.0.0",
|
||||
"requires": {
|
||||
"locate-path": "^6.0.0",
|
||||
"path-exists": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"hast-util-is-element": {
|
||||
"version": "2.1.2",
|
||||
"requires": {
|
||||
"@types/hast": "^2.0.0",
|
||||
"@types/unist": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"hast-util-sanitize": {
|
||||
"version": "4.0.0",
|
||||
"requires": {
|
||||
"@types/hast": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"hast-util-to-html": {
|
||||
"version": "8.0.3",
|
||||
"requires": {
|
||||
"@types/hast": "^2.0.0",
|
||||
"ccount": "^2.0.0",
|
||||
"comma-separated-tokens": "^2.0.0",
|
||||
"hast-util-is-element": "^2.0.0",
|
||||
"hast-util-whitespace": "^2.0.0",
|
||||
"html-void-elements": "^2.0.0",
|
||||
"property-information": "^6.0.0",
|
||||
"space-separated-tokens": "^2.0.0",
|
||||
"stringify-entities": "^4.0.2",
|
||||
"unist-util-is": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"html-void-elements": {
|
||||
"version": "2.0.1"
|
||||
},
|
||||
"is-plain-obj": {
|
||||
"version": "4.0.0"
|
||||
},
|
||||
"locate-path": {
|
||||
"version": "6.0.0",
|
||||
"requires": {
|
||||
"p-locate": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"longest-streak": {
|
||||
"version": "3.0.1"
|
||||
},
|
||||
"mdast-util-definitions": {
|
||||
"version": "5.1.0",
|
||||
"requires": {
|
||||
"@types/mdast": "^3.0.0",
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-visit": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"unist-util-visit": {
|
||||
"version": "3.1.0",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-is": "^5.0.0",
|
||||
"unist-util-visit-parents": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"unist-util-visit-parents": {
|
||||
"version": "4.1.1",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-is": "^5.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"mdast-util-to-hast": {
|
||||
"version": "12.1.1",
|
||||
"requires": {
|
||||
"@types/hast": "^2.0.0",
|
||||
"@types/mdast": "^3.0.0",
|
||||
"@types/mdurl": "^1.0.0",
|
||||
"mdast-util-definitions": "^5.0.0",
|
||||
"mdurl": "^1.0.0",
|
||||
"micromark-util-sanitize-uri": "^1.0.0",
|
||||
"unist-builder": "^3.0.0",
|
||||
"unist-util-generated": "^2.0.0",
|
||||
"unist-util-position": "^4.0.0",
|
||||
"unist-util-visit": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"mdast-util-to-markdown": {
|
||||
"version": "1.3.0",
|
||||
"requires": {
|
||||
"@types/mdast": "^3.0.0",
|
||||
"@types/unist": "^2.0.0",
|
||||
"longest-streak": "^3.0.0",
|
||||
"mdast-util-to-string": "^3.0.0",
|
||||
"micromark-util-decode-string": "^1.0.0",
|
||||
"unist-util-visit": "^4.0.0",
|
||||
"zwitch": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"mdast-util-to-string": {
|
||||
"version": "3.1.0"
|
||||
},
|
||||
"next-mdx-remote": {
|
||||
"version": "3.0.8",
|
||||
"requires": {
|
||||
"@mdx-js/mdx": "^1.6.22",
|
||||
"@mdx-js/react": "^1.6.22",
|
||||
"esbuild": "^0.12.9",
|
||||
"pkg-dir": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"p-limit": {
|
||||
"version": "3.1.0",
|
||||
"requires": {
|
||||
"yocto-queue": "^0.1.0"
|
||||
}
|
||||
},
|
||||
"p-locate": {
|
||||
"version": "5.0.0",
|
||||
"requires": {
|
||||
"p-limit": "^3.0.2"
|
||||
}
|
||||
},
|
||||
"pkg-dir": {
|
||||
"version": "5.0.0",
|
||||
"requires": {
|
||||
"find-up": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"property-information": {
|
||||
"version": "6.1.1"
|
||||
},
|
||||
"remark": {
|
||||
"version": "14.0.2",
|
||||
"requires": {
|
||||
"@types/mdast": "^3.0.0",
|
||||
"remark-parse": "^10.0.0",
|
||||
"remark-stringify": "^10.0.0",
|
||||
"unified": "^10.0.0"
|
||||
}
|
||||
},
|
||||
"remark-html": {
|
||||
"version": "15.0.1",
|
||||
"requires": {
|
||||
"@types/mdast": "^3.0.0",
|
||||
"hast-util-sanitize": "^4.0.0",
|
||||
"hast-util-to-html": "^8.0.0",
|
||||
"mdast-util-to-hast": "^12.0.0",
|
||||
"unified": "^10.0.0"
|
||||
}
|
||||
},
|
||||
"remark-mdx": {
|
||||
"version": "2.1.1",
|
||||
"requires": {
|
||||
"mdast-util-mdx": "^2.0.0",
|
||||
"micromark-extension-mdxjs": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"remark-parse": {
|
||||
"version": "10.0.1",
|
||||
"requires": {
|
||||
"@types/mdast": "^3.0.0",
|
||||
"mdast-util-from-markdown": "^1.0.0",
|
||||
"unified": "^10.0.0"
|
||||
}
|
||||
},
|
||||
"remark-stringify": {
|
||||
"version": "10.0.2",
|
||||
"requires": {
|
||||
"@types/mdast": "^3.0.0",
|
||||
"mdast-util-to-markdown": "^1.0.0",
|
||||
"unified": "^10.0.0"
|
||||
}
|
||||
},
|
||||
"space-separated-tokens": {
|
||||
"version": "2.0.1"
|
||||
},
|
||||
"stringify-entities": {
|
||||
"version": "4.0.2",
|
||||
"requires": {
|
||||
"character-entities-html4": "^2.0.0",
|
||||
"character-entities-legacy": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"trough": {
|
||||
"version": "2.1.0"
|
||||
},
|
||||
"unified": {
|
||||
"version": "10.1.2",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"bail": "^2.0.0",
|
||||
"extend": "^3.0.0",
|
||||
"is-buffer": "^2.0.0",
|
||||
"is-plain-obj": "^4.0.0",
|
||||
"trough": "^2.0.0",
|
||||
"vfile": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"unist-builder": {
|
||||
"version": "3.0.0",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"unist-util-generated": {
|
||||
"version": "2.0.0"
|
||||
},
|
||||
"unist-util-is": {
|
||||
"version": "5.1.1"
|
||||
},
|
||||
"unist-util-position": {
|
||||
"version": "4.0.3",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"unist-util-stringify-position": {
|
||||
"version": "3.0.2",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"unist-util-visit": {
|
||||
"version": "4.1.0",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-is": "^5.0.0",
|
||||
"unist-util-visit-parents": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"unist-util-visit-parents": {
|
||||
"version": "5.1.0",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-is": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"vfile": {
|
||||
"version": "5.3.2",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"is-buffer": "^2.0.0",
|
||||
"unist-util-stringify-position": "^3.0.0",
|
||||
"vfile-message": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"vfile-message": {
|
||||
"version": "3.1.2",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-stringify-position": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"zwitch": {
|
||||
"version": "2.0.2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"doctrine": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
|
||||
@@ -30311,6 +29978,338 @@
|
||||
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
|
||||
"devOptional": true
|
||||
},
|
||||
"temp-docs": {
|
||||
"version": "file:apps/temp-docs",
|
||||
"requires": {
|
||||
"@apollo/client": "^3.6.6",
|
||||
"@mdx-js/loader": "^1.6.22",
|
||||
"@mdx-js/react": "^1.6.22",
|
||||
"@next/mdx": "^12.0.4",
|
||||
"@supabase/ui": "v0.37.0-alpha.50",
|
||||
"@tailwindcss/typography": "^0.4.1",
|
||||
"@types/node": "^17.0.12",
|
||||
"@types/react": "17.0.39",
|
||||
"common": "*",
|
||||
"config": "*",
|
||||
"eslint": "8.9.0",
|
||||
"graphql": "^16.5.0",
|
||||
"gray-matter": "^4.0.3",
|
||||
"markdown-toc": "^1.2.0",
|
||||
"next": "12.1.0",
|
||||
"next-mdx-remote": "^3.0.8",
|
||||
"next-themes": "0.0.15",
|
||||
"next-transpile-modules": "9.0.0",
|
||||
"react": "17.0.2",
|
||||
"react-copy-to-clipboard": "^5.0.2",
|
||||
"react-dom": "17.0.2",
|
||||
"react-markdown": "^8.0.3",
|
||||
"react-syntax-highlighter": "^15.3.1",
|
||||
"remark": "^14.0.2",
|
||||
"remark-html": "^15.0.0",
|
||||
"remark-mdx": "^2.0.0-rc.2",
|
||||
"remark-prism": "^1.3.6",
|
||||
"tsconfig": "*",
|
||||
"typescript": "^4.5.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@mdx-js/react": {
|
||||
"version": "1.6.22",
|
||||
"requires": {}
|
||||
},
|
||||
"@next/mdx": {
|
||||
"version": "12.1.5",
|
||||
"requires": {}
|
||||
},
|
||||
"@tailwindcss/typography": {
|
||||
"version": "0.4.1",
|
||||
"requires": {
|
||||
"lodash.castarray": "^4.4.0",
|
||||
"lodash.isplainobject": "^4.0.6",
|
||||
"lodash.merge": "^4.6.2",
|
||||
"lodash.uniq": "^4.5.0"
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "17.0.27",
|
||||
"dev": true
|
||||
},
|
||||
"bail": {
|
||||
"version": "2.0.2"
|
||||
},
|
||||
"ccount": {
|
||||
"version": "2.0.1"
|
||||
},
|
||||
"character-entities-html4": {
|
||||
"version": "2.1.0"
|
||||
},
|
||||
"character-entities-legacy": {
|
||||
"version": "3.0.0"
|
||||
},
|
||||
"comma-separated-tokens": {
|
||||
"version": "2.0.2"
|
||||
},
|
||||
"find-up": {
|
||||
"version": "5.0.0",
|
||||
"requires": {
|
||||
"locate-path": "^6.0.0",
|
||||
"path-exists": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"hast-util-is-element": {
|
||||
"version": "2.1.2",
|
||||
"requires": {
|
||||
"@types/hast": "^2.0.0",
|
||||
"@types/unist": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"hast-util-sanitize": {
|
||||
"version": "4.0.0",
|
||||
"requires": {
|
||||
"@types/hast": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"hast-util-to-html": {
|
||||
"version": "8.0.3",
|
||||
"requires": {
|
||||
"@types/hast": "^2.0.0",
|
||||
"ccount": "^2.0.0",
|
||||
"comma-separated-tokens": "^2.0.0",
|
||||
"hast-util-is-element": "^2.0.0",
|
||||
"hast-util-whitespace": "^2.0.0",
|
||||
"html-void-elements": "^2.0.0",
|
||||
"property-information": "^6.0.0",
|
||||
"space-separated-tokens": "^2.0.0",
|
||||
"stringify-entities": "^4.0.2",
|
||||
"unist-util-is": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"html-void-elements": {
|
||||
"version": "2.0.1"
|
||||
},
|
||||
"is-plain-obj": {
|
||||
"version": "4.0.0"
|
||||
},
|
||||
"locate-path": {
|
||||
"version": "6.0.0",
|
||||
"requires": {
|
||||
"p-locate": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"longest-streak": {
|
||||
"version": "3.0.1"
|
||||
},
|
||||
"mdast-util-definitions": {
|
||||
"version": "5.1.0",
|
||||
"requires": {
|
||||
"@types/mdast": "^3.0.0",
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-visit": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"unist-util-visit": {
|
||||
"version": "3.1.0",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-is": "^5.0.0",
|
||||
"unist-util-visit-parents": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"unist-util-visit-parents": {
|
||||
"version": "4.1.1",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-is": "^5.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"mdast-util-to-hast": {
|
||||
"version": "12.1.1",
|
||||
"requires": {
|
||||
"@types/hast": "^2.0.0",
|
||||
"@types/mdast": "^3.0.0",
|
||||
"@types/mdurl": "^1.0.0",
|
||||
"mdast-util-definitions": "^5.0.0",
|
||||
"mdurl": "^1.0.0",
|
||||
"micromark-util-sanitize-uri": "^1.0.0",
|
||||
"unist-builder": "^3.0.0",
|
||||
"unist-util-generated": "^2.0.0",
|
||||
"unist-util-position": "^4.0.0",
|
||||
"unist-util-visit": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"mdast-util-to-markdown": {
|
||||
"version": "1.3.0",
|
||||
"requires": {
|
||||
"@types/mdast": "^3.0.0",
|
||||
"@types/unist": "^2.0.0",
|
||||
"longest-streak": "^3.0.0",
|
||||
"mdast-util-to-string": "^3.0.0",
|
||||
"micromark-util-decode-string": "^1.0.0",
|
||||
"unist-util-visit": "^4.0.0",
|
||||
"zwitch": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"mdast-util-to-string": {
|
||||
"version": "3.1.0"
|
||||
},
|
||||
"next-mdx-remote": {
|
||||
"version": "3.0.8",
|
||||
"requires": {
|
||||
"@mdx-js/mdx": "^1.6.22",
|
||||
"@mdx-js/react": "^1.6.22",
|
||||
"esbuild": "^0.12.9",
|
||||
"pkg-dir": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"p-limit": {
|
||||
"version": "3.1.0",
|
||||
"requires": {
|
||||
"yocto-queue": "^0.1.0"
|
||||
}
|
||||
},
|
||||
"p-locate": {
|
||||
"version": "5.0.0",
|
||||
"requires": {
|
||||
"p-limit": "^3.0.2"
|
||||
}
|
||||
},
|
||||
"pkg-dir": {
|
||||
"version": "5.0.0",
|
||||
"requires": {
|
||||
"find-up": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"property-information": {
|
||||
"version": "6.1.1"
|
||||
},
|
||||
"remark": {
|
||||
"version": "14.0.2",
|
||||
"requires": {
|
||||
"@types/mdast": "^3.0.0",
|
||||
"remark-parse": "^10.0.0",
|
||||
"remark-stringify": "^10.0.0",
|
||||
"unified": "^10.0.0"
|
||||
}
|
||||
},
|
||||
"remark-html": {
|
||||
"version": "15.0.1",
|
||||
"requires": {
|
||||
"@types/mdast": "^3.0.0",
|
||||
"hast-util-sanitize": "^4.0.0",
|
||||
"hast-util-to-html": "^8.0.0",
|
||||
"mdast-util-to-hast": "^12.0.0",
|
||||
"unified": "^10.0.0"
|
||||
}
|
||||
},
|
||||
"remark-mdx": {
|
||||
"version": "2.1.1",
|
||||
"requires": {
|
||||
"mdast-util-mdx": "^2.0.0",
|
||||
"micromark-extension-mdxjs": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"remark-parse": {
|
||||
"version": "10.0.1",
|
||||
"requires": {
|
||||
"@types/mdast": "^3.0.0",
|
||||
"mdast-util-from-markdown": "^1.0.0",
|
||||
"unified": "^10.0.0"
|
||||
}
|
||||
},
|
||||
"remark-stringify": {
|
||||
"version": "10.0.2",
|
||||
"requires": {
|
||||
"@types/mdast": "^3.0.0",
|
||||
"mdast-util-to-markdown": "^1.0.0",
|
||||
"unified": "^10.0.0"
|
||||
}
|
||||
},
|
||||
"space-separated-tokens": {
|
||||
"version": "2.0.1"
|
||||
},
|
||||
"stringify-entities": {
|
||||
"version": "4.0.2",
|
||||
"requires": {
|
||||
"character-entities-html4": "^2.0.0",
|
||||
"character-entities-legacy": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"trough": {
|
||||
"version": "2.1.0"
|
||||
},
|
||||
"unified": {
|
||||
"version": "10.1.2",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"bail": "^2.0.0",
|
||||
"extend": "^3.0.0",
|
||||
"is-buffer": "^2.0.0",
|
||||
"is-plain-obj": "^4.0.0",
|
||||
"trough": "^2.0.0",
|
||||
"vfile": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"unist-builder": {
|
||||
"version": "3.0.0",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"unist-util-generated": {
|
||||
"version": "2.0.0"
|
||||
},
|
||||
"unist-util-is": {
|
||||
"version": "5.1.1"
|
||||
},
|
||||
"unist-util-position": {
|
||||
"version": "4.0.3",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"unist-util-stringify-position": {
|
||||
"version": "3.0.2",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"unist-util-visit": {
|
||||
"version": "4.1.0",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-is": "^5.0.0",
|
||||
"unist-util-visit-parents": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"unist-util-visit-parents": {
|
||||
"version": "5.1.0",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-is": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"vfile": {
|
||||
"version": "5.3.2",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"is-buffer": "^2.0.0",
|
||||
"unist-util-stringify-position": "^3.0.0",
|
||||
"vfile-message": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"vfile-message": {
|
||||
"version": "3.1.2",
|
||||
"requires": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-stringify-position": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"zwitch": {
|
||||
"version": "2.0.2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"terminal-link": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
|
||||
|
||||
Reference in new issue
Block a user