Open gregnr opened 3 weeks ago
This is great! 💯
We're also slowly moving all pg-meta functionality to the main Supabase repo, which is pure-JS and is simply a SQL builder - would that be a better place for this?
There's a lot of work that still needs to be done for that though - feature parity, publishing the package somewhere, tests, the works.
Or maybe we keep this feature here for now and switch to the pure-JS version once we reach parity? Wdyt?
Adds a
PostgresMetaBase
class that allows you to bring-your-own-pg-client™. Instead of depending onpg
, the base class accepts customquery()
andend()
functions allowing you to choose how these methods are implemented.The existing
PostgresMeta
class now extendsPostgresMetaBase
and implementsquery()
andend()
usingpg
exactly as before without breaking changes.Why?
Browser support 🤓 ElectricSQL's pglite gives us a working Postgres instance in the browser (via wasm). Offering a platform-agnostic version of this lib means we can use it in any environment including the browser.
Example using PGlite
Other important notes
In order to make this platform-agnostic, all code needed to be pure TS (no native deps). We do 3 things:
PostgresMetaBase
class which doesn't import thepg
dependencyCreate a new entrypoint
base.ts
with a package export at/base
. This means you canimport { PostgresMetaBase } from '@supabase/postgres-meta/base'
without importingpg
.Importing
@supabase/postgres-meta
will continue to usepg
as before without breaking changes.Create custom loader for
.sql
files that live under./src/lib/sql
. Previously these were loaded using Node'sfs
API. Now they are imported directly likeimport tablesSql from './sql/tables.sql'
.This custom import is accomplished by adding a lightweight bundler to the build step:
tsup
(esbuild
bundler under the hood). So nowtsup
/esbuild
run the build process instead of puretsc
. I did my best to make sure thedist
outputs were consistent with previoustsc
builds, but worth double checking (there are some differences, like bundling into single files). Also outputs both ESM and CJS outputs which should provide more flexibility to consumers.All tests continue to pass. Only change needed was adding a custom
vitest
plugin to load.sql
files, similar to what we do withtsup
.