@unieojs/unio-supabase-shim 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # @unieojs/unio-supabase-shim
2
+
3
+ Minimal Supabase-compatible helpers for the Unio generic preview MVP.
4
+
5
+ This package uses `@electric-sql/pglite` as the Postgres core and keeps only the
6
+ minimal Supabase-compatible client, auth, handler, and snapshot facade needed by
7
+ the preview runtime.
8
+
9
+ Implemented MVP surface:
10
+
11
+ - Auth: `signUp`, `signInWithPassword`, `getSession`, `onAuthStateChange`
12
+ - PostgREST subset: `select`, `eq`, `gte`, `lte`, `order`, `insert`,
13
+ `single`, `delete`
14
+ - Same-origin handler for `/api/_supabase`
15
+ - `init.sql` bootstrap through `SupabaseShimDatabase.bootstrap()`
16
+ - Snapshot/restore through a pluggable `SnapshotStorage`
17
+
18
+ Not implemented in this MVP:
19
+
20
+ - OSS credentials or runtime storage wiring
21
+ - RLS, Realtime, Storage, RPC, nested select, and full JWT semantics
package/dist/auth.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ import type { AuthChangeEvent, ShimSession, ShimUser, SupabaseAuthResponse } from "./types.js";
2
+ type AuthListener = (event: AuthChangeEvent, session: ShimSession | null) => void;
3
+ export declare class SupabaseShimAuthClient {
4
+ #private;
5
+ signUp(credentials: {
6
+ email: string;
7
+ password: string;
8
+ }): Promise<SupabaseAuthResponse<{
9
+ user: ShimUser;
10
+ session: ShimSession;
11
+ }>>;
12
+ signInWithPassword(credentials: {
13
+ email: string;
14
+ password: string;
15
+ }): Promise<SupabaseAuthResponse<{
16
+ user: ShimUser | null;
17
+ session: ShimSession | null;
18
+ }>>;
19
+ getSession(): Promise<SupabaseAuthResponse<{
20
+ session: ShimSession | null;
21
+ }>>;
22
+ onAuthStateChange(listener: AuthListener): {
23
+ data: {
24
+ subscription: {
25
+ unsubscribe: () => void;
26
+ };
27
+ };
28
+ };
29
+ }
30
+ export {};
package/dist/auth.js ADDED
@@ -0,0 +1,78 @@
1
+ export class SupabaseShimAuthClient {
2
+ #usersByEmail = new Map();
3
+ #listeners = new Set();
4
+ #session = null;
5
+ #nextUserId = 1;
6
+ async signUp(credentials) {
7
+ if (this.#usersByEmail.has(credentials.email)) {
8
+ return {
9
+ data: { user: { id: "", email: credentials.email }, session: emptySession() },
10
+ error: { message: "User already registered", status: 400 },
11
+ };
12
+ }
13
+ const user = {
14
+ id: `shim-user-${this.#nextUserId.toString(36)}`,
15
+ email: credentials.email,
16
+ password: credentials.password,
17
+ };
18
+ this.#nextUserId += 1;
19
+ this.#usersByEmail.set(user.email, user);
20
+ const session = createSession(user);
21
+ this.#session = session;
22
+ this.#emit("SIGNED_UP", session);
23
+ return { data: { user: publicUser(user), session }, error: null };
24
+ }
25
+ async signInWithPassword(credentials) {
26
+ const user = this.#usersByEmail.get(credentials.email);
27
+ if (!user || user.password !== credentials.password) {
28
+ return {
29
+ data: { user: null, session: null },
30
+ error: { message: "Invalid login credentials", status: 400 },
31
+ };
32
+ }
33
+ this.#session = createSession(user);
34
+ this.#emit("SIGNED_IN", this.#session);
35
+ return {
36
+ data: { user: this.#session.user, session: this.#session },
37
+ error: null,
38
+ };
39
+ }
40
+ async getSession() {
41
+ return { data: { session: this.#session }, error: null };
42
+ }
43
+ onAuthStateChange(listener) {
44
+ this.#listeners.add(listener);
45
+ return {
46
+ data: {
47
+ subscription: {
48
+ unsubscribe: () => {
49
+ this.#listeners.delete(listener);
50
+ },
51
+ },
52
+ },
53
+ };
54
+ }
55
+ #emit(event, session) {
56
+ for (const listener of this.#listeners) {
57
+ listener(event, session);
58
+ }
59
+ }
60
+ }
61
+ function createSession(user) {
62
+ return {
63
+ access_token: `shim-token-${user.id}`,
64
+ token_type: "bearer",
65
+ user: publicUser(user),
66
+ };
67
+ }
68
+ function publicUser(user) {
69
+ return { id: user.id, email: user.email };
70
+ }
71
+ function emptySession() {
72
+ return {
73
+ access_token: "",
74
+ token_type: "bearer",
75
+ user: { id: "", email: "" },
76
+ };
77
+ }
78
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { SupabaseShimAuthClient } from "./auth.js";
2
+ import { SupabasePostgrestBuilder } from "./query-builder.js";
3
+ import type { SupabaseShimDatabase } from "./types.js";
4
+ export declare class SupabaseShimClient {
5
+ #private;
6
+ readonly auth: SupabaseShimAuthClient;
7
+ constructor(database: SupabaseShimDatabase);
8
+ from(table: string): SupabasePostgrestBuilder;
9
+ }
package/dist/client.js ADDED
@@ -0,0 +1,13 @@
1
+ import { SupabaseShimAuthClient } from "./auth.js";
2
+ import { SupabasePostgrestBuilder } from "./query-builder.js";
3
+ export class SupabaseShimClient {
4
+ auth = new SupabaseShimAuthClient();
5
+ #database;
6
+ constructor(database) {
7
+ this.#database = database;
8
+ }
9
+ from(table) {
10
+ return new SupabasePostgrestBuilder(this.#database, table);
11
+ }
12
+ }
13
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,MAAM,OAAO,kBAAkB;IACpB,IAAI,GAAG,IAAI,sBAAsB,EAAE,CAAC;IACpC,SAAS,CAAuB;IAEzC,YAAY,QAA8B;QACxC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,KAAa;QAChB,OAAO,IAAI,wBAAwB,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ import type { SupabaseShimClient } from "./client.js";
2
+ export declare function handleSupabaseShimRequest(request: Request, client: SupabaseShimClient, basePath?: string): Promise<Response>;
@@ -0,0 +1,120 @@
1
+ export async function handleSupabaseShimRequest(request, client, basePath = "/api/_supabase") {
2
+ const url = new URL(request.url);
3
+ if (!url.pathname.startsWith(basePath)) {
4
+ return jsonResponse({ error: "Not found" }, 404);
5
+ }
6
+ const path = url.pathname.slice(basePath.length).replace(/^\/+/, "");
7
+ if (path.startsWith("auth/v1/")) {
8
+ return handleAuthRequest(path, request, client);
9
+ }
10
+ if (path.startsWith("rest/v1/")) {
11
+ return handleRestRequest(path, request, url, client);
12
+ }
13
+ return jsonResponse({ error: "Not found" }, 404);
14
+ }
15
+ async function handleAuthRequest(path, request, client) {
16
+ if (request.method === "POST" && path === "auth/v1/signup") {
17
+ const body = (await request.json());
18
+ const result = await client.auth.signUp({
19
+ email: body.email ?? "",
20
+ password: body.password ?? "",
21
+ });
22
+ return jsonResponse(result.error ? { error: result.error } : result.data, result.error?.status ?? 200);
23
+ }
24
+ if (request.method === "POST" && path === "auth/v1/token") {
25
+ const body = (await request.json());
26
+ const result = await client.auth.signInWithPassword({
27
+ email: body.email ?? "",
28
+ password: body.password ?? "",
29
+ });
30
+ return jsonResponse(result.error ? { error: result.error } : result.data, result.error?.status ?? 200);
31
+ }
32
+ if (request.method === "GET" && path === "auth/v1/session") {
33
+ const result = await client.auth.getSession();
34
+ return jsonResponse(result.data, 200);
35
+ }
36
+ return jsonResponse({ error: "Unsupported auth endpoint" }, 404);
37
+ }
38
+ async function handleRestRequest(path, request, url, client) {
39
+ const table = decodeURIComponent(path.slice("rest/v1/".length).split("/")[0] ?? "");
40
+ if (!table) {
41
+ return jsonResponse({ error: "Missing table" }, 400);
42
+ }
43
+ if (request.method === "GET") {
44
+ const builder = applyUrlQuery(client.from(table).select(url.searchParams.get("select") ?? "*"), url);
45
+ if (wantsSingleObject(request)) {
46
+ return jsonResponseFromPostgrest(await builder.single());
47
+ }
48
+ return jsonResponseFromPostgrest(await builder);
49
+ }
50
+ if (request.method === "POST") {
51
+ const body = await request.json();
52
+ const rows = Array.isArray(body) ? body : [body];
53
+ const builder = client.from(table).insert(rows);
54
+ if (url.searchParams.has("select")) {
55
+ builder.select(url.searchParams.get("select") ?? "*");
56
+ }
57
+ return jsonResponseFromPostgrest(await applyUrlQuery(builder, url));
58
+ }
59
+ if (request.method === "DELETE") {
60
+ const builder = applyUrlQuery(client.from(table).delete(), url);
61
+ if (url.searchParams.has("select")) {
62
+ builder.select(url.searchParams.get("select") ?? "*");
63
+ }
64
+ return jsonResponseFromPostgrest(await builder);
65
+ }
66
+ return jsonResponse({ error: "Unsupported PostgREST method" }, 405);
67
+ }
68
+ function applyUrlQuery(builder, url) {
69
+ for (const [key, value] of url.searchParams.entries()) {
70
+ if (key === "select") {
71
+ continue;
72
+ }
73
+ if (key === "order") {
74
+ const [column, direction] = value.split(".");
75
+ if (column) {
76
+ builder.order(column, { ascending: direction !== "desc" });
77
+ }
78
+ continue;
79
+ }
80
+ const [operator, rawValue] = value.split(".", 2);
81
+ if (operator === "eq" || operator === "gte" || operator === "lte") {
82
+ builder[operator](key, parseUrlValue(rawValue ?? ""));
83
+ }
84
+ }
85
+ return builder;
86
+ }
87
+ function wantsSingleObject(request) {
88
+ return (request.headers.get("accept") ?? "")
89
+ .split(",")
90
+ .map((value) => value.trim().toLowerCase())
91
+ .includes("application/vnd.pgrst.object+json");
92
+ }
93
+ function parseUrlValue(value) {
94
+ if (value === "null") {
95
+ return null;
96
+ }
97
+ if (value === "true") {
98
+ return true;
99
+ }
100
+ if (value === "false") {
101
+ return false;
102
+ }
103
+ const numeric = Number(value);
104
+ return Number.isFinite(numeric) && value.trim() !== "" ? numeric : value;
105
+ }
106
+ function jsonResponseFromPostgrest(result) {
107
+ if (result.error) {
108
+ return jsonResponse({ error: result.error }, result.status);
109
+ }
110
+ return jsonResponse(result.data, result.status);
111
+ }
112
+ function jsonResponse(body, status) {
113
+ return new Response(JSON.stringify(body), {
114
+ status,
115
+ headers: {
116
+ "content-type": "application/json",
117
+ },
118
+ });
119
+ }
120
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { SupabaseShimClient } from "./client.js";
2
+ import type { SnapshotStorage, SupabaseShimDatabase } from "./types.js";
3
+ export { SupabaseShimAuthClient } from "./auth.js";
4
+ export { SupabaseShimClient } from "./client.js";
5
+ export { handleSupabaseShimRequest } from "./handler.js";
6
+ export { PGliteShimDatabase } from "./pglite-database.js";
7
+ export { SupabasePostgrestBuilder } from "./query-builder.js";
8
+ export { InMemorySnapshotStorage } from "./snapshot.js";
9
+ export type { AuthChangeEvent, PostgrestResponse, QueryFilter, QueryOrder, SelectQuery, ShimRow, ShimSession, ShimUser, ShimValue, SnapshotStorage, SupabaseAuthResponse, SupabaseShimDatabase, SupabaseShimError, } from "./types.js";
10
+ export interface SupabaseShimOptions {
11
+ initSql?: string;
12
+ database?: SupabaseShimDatabase;
13
+ snapshotStorage?: SnapshotStorage;
14
+ snapshotKey?: string;
15
+ basePath?: string;
16
+ }
17
+ export interface SupabaseShim {
18
+ client: SupabaseShimClient;
19
+ database: SupabaseShimDatabase;
20
+ snapshot(): Promise<void>;
21
+ restore(): Promise<boolean>;
22
+ handleRequest(request: Request): Promise<Response>;
23
+ close(): Promise<void>;
24
+ }
25
+ export declare function createSupabaseShim(options?: SupabaseShimOptions): Promise<SupabaseShim>;
26
+ export declare function bootstrapPgliteFromInitSql(database: SupabaseShimDatabase, initSql: string): Promise<void>;
27
+ export declare function bootstrapShimDatabaseFromInitSql(database: SupabaseShimDatabase, initSql: string): Promise<void>;
package/dist/index.js ADDED
@@ -0,0 +1,51 @@
1
+ import { SupabaseShimClient } from "./client.js";
2
+ import { handleSupabaseShimRequest } from "./handler.js";
3
+ import { PGliteShimDatabase } from "./pglite-database.js";
4
+ export { SupabaseShimAuthClient } from "./auth.js";
5
+ export { SupabaseShimClient } from "./client.js";
6
+ export { handleSupabaseShimRequest } from "./handler.js";
7
+ export { PGliteShimDatabase } from "./pglite-database.js";
8
+ export { SupabasePostgrestBuilder } from "./query-builder.js";
9
+ export { InMemorySnapshotStorage } from "./snapshot.js";
10
+ export async function createSupabaseShim(options = {}) {
11
+ const database = options.database ?? (await PGliteShimDatabase.create());
12
+ if (options.initSql) {
13
+ await bootstrapShimDatabaseFromInitSql(database, options.initSql);
14
+ }
15
+ const client = new SupabaseShimClient(database);
16
+ const snapshotKey = options.snapshotKey ?? "default";
17
+ return {
18
+ client,
19
+ database,
20
+ async snapshot() {
21
+ if (!options.snapshotStorage) {
22
+ return;
23
+ }
24
+ await options.snapshotStorage.set(snapshotKey, await database.snapshot());
25
+ },
26
+ async restore() {
27
+ if (!options.snapshotStorage) {
28
+ return false;
29
+ }
30
+ const snapshot = await options.snapshotStorage.get(snapshotKey);
31
+ if (snapshot === null) {
32
+ return false;
33
+ }
34
+ await database.restore(snapshot);
35
+ return true;
36
+ },
37
+ handleRequest(request) {
38
+ return handleSupabaseShimRequest(request, client, options.basePath);
39
+ },
40
+ async close() {
41
+ await database.close?.();
42
+ },
43
+ };
44
+ }
45
+ export async function bootstrapPgliteFromInitSql(database, initSql) {
46
+ await bootstrapShimDatabaseFromInitSql(database, initSql);
47
+ }
48
+ export async function bootstrapShimDatabaseFromInitSql(database, initSql) {
49
+ await database.bootstrap(initSql);
50
+ }
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAkCxD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAA+B,EAAE;IACxE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,MAAM,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,gCAAgC,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,SAAS,CAAC;IAErD,OAAO;QACL,MAAM;QACN,QAAQ;QACR,KAAK,CAAC,QAAQ;YACZ,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,MAAM,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,KAAK,CAAC,OAAO;YACX,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAChE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,aAAa,CAAC,OAAgB;YAC5B,OAAO,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtE,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;QAC3B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,QAA8B,EAC9B,OAAe;IAEf,MAAM,gCAAgC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,QAA8B,EAC9B,OAAe;IAEf,MAAM,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { SelectQuery, ShimRow, SupabaseShimDatabase } from "./types.js";
2
+ export declare class PGliteShimDatabase implements SupabaseShimDatabase {
3
+ #private;
4
+ private constructor();
5
+ static create(): Promise<PGliteShimDatabase>;
6
+ bootstrap(initSql: string): Promise<void>;
7
+ select(table: string, query?: SelectQuery): Promise<ShimRow[]>;
8
+ insert(table: string, rows: ShimRow[], query?: SelectQuery): Promise<ShimRow[]>;
9
+ delete(table: string, query?: SelectQuery): Promise<ShimRow[]>;
10
+ snapshot(): Promise<string>;
11
+ restore(snapshot: string): Promise<void>;
12
+ close(): Promise<void>;
13
+ }
@@ -0,0 +1,185 @@
1
+ import { PGlite } from "@electric-sql/pglite";
2
+ export class PGliteShimDatabase {
3
+ #database;
4
+ constructor(database) {
5
+ this.#database = database;
6
+ }
7
+ static async create() {
8
+ return new PGliteShimDatabase(await PGlite.create());
9
+ }
10
+ async bootstrap(initSql) {
11
+ await this.#database.exec(initSql);
12
+ }
13
+ async select(table, query = {}) {
14
+ const statement = buildSelectStatement(table, query);
15
+ const result = await this.#database.query(statement.sql, statement.params);
16
+ return result.rows;
17
+ }
18
+ async insert(table, rows, query = {}) {
19
+ if (rows.length === 0) {
20
+ return [];
21
+ }
22
+ const statement = buildInsertStatement(table, rows, query);
23
+ const result = await this.#database.query(statement.sql, statement.params);
24
+ return result.rows;
25
+ }
26
+ async delete(table, query = {}) {
27
+ const statement = buildDeleteStatement(table, query);
28
+ const result = await this.#database.query(statement.sql, statement.params);
29
+ return result.rows;
30
+ }
31
+ async snapshot() {
32
+ const dataDir = await this.#database.dumpDataDir("gzip");
33
+ const data = encodeBase64(new Uint8Array(await dataDir.arrayBuffer()));
34
+ return JSON.stringify({
35
+ kind: "pglite-data-dir",
36
+ compression: "gzip",
37
+ type: dataDir.type,
38
+ data,
39
+ });
40
+ }
41
+ async restore(snapshot) {
42
+ const parsed = JSON.parse(snapshot);
43
+ if (parsed.kind !== "pglite-data-dir" || parsed.compression !== "gzip") {
44
+ throw new Error("Unsupported PGlite snapshot format");
45
+ }
46
+ const dataDir = new Blob([toArrayBuffer(decodeBase64(parsed.data))], {
47
+ type: parsed.type || "application/gzip",
48
+ });
49
+ const next = await PGlite.create({ loadDataDir: dataDir });
50
+ await this.#database.close();
51
+ this.#database = next;
52
+ }
53
+ async close() {
54
+ await this.#database.close();
55
+ }
56
+ }
57
+ function buildSelectStatement(table, query) {
58
+ const params = [];
59
+ const where = buildWhereClause(query.filters ?? [], params);
60
+ const order = buildOrderClause(query);
61
+ return {
62
+ sql: `SELECT ${buildColumnList(query)} FROM ${quoteQualifiedIdentifier(table)}${where}${order}`,
63
+ params,
64
+ };
65
+ }
66
+ function buildInsertStatement(table, rows, query) {
67
+ const params = [];
68
+ const tableName = quoteQualifiedIdentifier(table);
69
+ if (rows.length === 1) {
70
+ return buildSingleInsertStatement(tableName, rows[0] ?? {}, query, params);
71
+ }
72
+ const insertCtes = rows.map((row, index) => {
73
+ const { columnsSql, valuesSql } = buildInsertValues(row, params);
74
+ return `inserted_${index} AS (INSERT INTO ${tableName}${columnsSql} ${valuesSql} RETURNING *)`;
75
+ });
76
+ const insertedSelects = rows
77
+ .map((_, index) => `SELECT * FROM inserted_${index}`)
78
+ .join(" UNION ALL ");
79
+ const where = buildWhereClause(query.filters ?? [], params);
80
+ const order = buildOrderClause(query);
81
+ return {
82
+ sql: `WITH ${insertCtes.join(", ")}, inserted AS (${insertedSelects}) SELECT ${buildColumnList(query)} FROM inserted${where}${order}`,
83
+ params,
84
+ };
85
+ }
86
+ function buildSingleInsertStatement(tableName, row, query, params) {
87
+ const { columnsSql, valuesSql } = buildInsertValues(row, params);
88
+ const where = buildWhereClause(query.filters ?? [], params);
89
+ const order = buildOrderClause(query);
90
+ return {
91
+ sql: `WITH inserted AS (INSERT INTO ${tableName}${columnsSql} ${valuesSql} RETURNING *) SELECT ${buildColumnList(query)} FROM inserted${where}${order}`,
92
+ params,
93
+ };
94
+ }
95
+ function buildDeleteStatement(table, query) {
96
+ const params = [];
97
+ const where = buildWhereClause(query.filters ?? [], params);
98
+ const order = buildOrderClause(query);
99
+ return {
100
+ sql: `WITH deleted AS (DELETE FROM ${quoteQualifiedIdentifier(table)}${where} RETURNING *) SELECT ${buildColumnList(query)} FROM deleted${order}`,
101
+ params,
102
+ };
103
+ }
104
+ function buildInsertValues(row, params) {
105
+ const columns = Object.keys(row);
106
+ if (columns.length === 0) {
107
+ return { columnsSql: "", valuesSql: "DEFAULT VALUES" };
108
+ }
109
+ const placeholders = columns.map((column) => {
110
+ params.push(row[column] ?? null);
111
+ return `$${params.length}`;
112
+ });
113
+ return {
114
+ columnsSql: ` (${columns.map(quoteIdentifier).join(", ")})`,
115
+ valuesSql: `VALUES (${placeholders.join(", ")})`,
116
+ };
117
+ }
118
+ function buildColumnList(query) {
119
+ const columns = query.columns ?? ["*"];
120
+ if (columns.includes("*")) {
121
+ return "*";
122
+ }
123
+ return columns.map(quoteIdentifier).join(", ");
124
+ }
125
+ function buildWhereClause(filters, params) {
126
+ if (filters.length === 0) {
127
+ return "";
128
+ }
129
+ const clauses = filters.map((filter) => {
130
+ const column = quoteIdentifier(filter.column);
131
+ if (filter.operator === "eq" && filter.value === null) {
132
+ return `${column} IS NULL`;
133
+ }
134
+ params.push(filter.value);
135
+ return `${column} ${sqlOperatorForFilter(filter)} $${params.length}`;
136
+ });
137
+ return ` WHERE ${clauses.join(" AND ")}`;
138
+ }
139
+ function sqlOperatorForFilter(filter) {
140
+ switch (filter.operator) {
141
+ case "eq":
142
+ return "=";
143
+ case "gte":
144
+ return ">=";
145
+ case "lte":
146
+ return "<=";
147
+ }
148
+ }
149
+ function buildOrderClause(query) {
150
+ if (!query.order) {
151
+ return "";
152
+ }
153
+ return ` ORDER BY ${quoteIdentifier(query.order.column)} ${query.order.ascending ? "ASC" : "DESC"}`;
154
+ }
155
+ function quoteQualifiedIdentifier(identifier) {
156
+ return identifier.split(".").map(quoteIdentifier).join(".");
157
+ }
158
+ function quoteIdentifier(identifier) {
159
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) {
160
+ throw new Error(`Unsupported SQL identifier "${identifier}"`);
161
+ }
162
+ return `"${identifier}"`;
163
+ }
164
+ function encodeBase64(bytes) {
165
+ let binary = "";
166
+ const chunkSize = 0x8000;
167
+ for (let index = 0; index < bytes.length; index += chunkSize) {
168
+ binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize));
169
+ }
170
+ return globalThis.btoa(binary);
171
+ }
172
+ function decodeBase64(base64) {
173
+ const binary = globalThis.atob(base64);
174
+ const bytes = new Uint8Array(binary.length);
175
+ for (let index = 0; index < binary.length; index += 1) {
176
+ bytes[index] = binary.charCodeAt(index);
177
+ }
178
+ return bytes;
179
+ }
180
+ function toArrayBuffer(bytes) {
181
+ const buffer = new ArrayBuffer(bytes.byteLength);
182
+ new Uint8Array(buffer).set(bytes);
183
+ return buffer;
184
+ }
185
+ //# sourceMappingURL=pglite-database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pglite-database.js","sourceRoot":"","sources":["../src/pglite-database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAiB9C,MAAM,OAAO,kBAAkB;IAC7B,SAAS,CAAS;IAElB,YAAoB,QAAgB;QAClC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM;QACjB,OAAO,IAAI,kBAAkB,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe;QAC7B,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,QAAqB,EAAE;QACjD,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAU,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACpF,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAAe,EAAE,QAAqB,EAAE;QAClE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAU,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACpF,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,QAAqB,EAAE;QACjD,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAU,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACpF,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,UAAU,CAAC,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,MAAM;YACnB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI;SACoB,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAmB,CAAC;QACtD,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YACnE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,kBAAkB;SACxC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3D,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;CACF;AAOD,SAAS,oBAAoB,CAAC,KAAa,EAAE,KAAkB;IAC7D,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO;QACL,GAAG,EAAE,UAAU,eAAe,CAAC,KAAK,CAAC,SAAS,wBAAwB,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,EAAE;QAC/F,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,IAAe,EAAE,KAAkB;IAC9E,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAElD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,0BAA0B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACzC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACjE,OAAO,YAAY,KAAK,oBAAoB,SAAS,GAAG,UAAU,IAAI,SAAS,eAAe,CAAC;IACjG,CAAC,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,IAAI;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,0BAA0B,KAAK,EAAE,CAAC;SACpD,IAAI,CAAC,aAAa,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAEtC,OAAO;QACL,GAAG,EAAE,QAAQ,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,eAAe,YAAY,eAAe,CAC5F,KAAK,CACN,iBAAiB,KAAK,GAAG,KAAK,EAAE;QACjC,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CACjC,SAAiB,EACjB,GAAY,EACZ,KAAkB,EAClB,MAAmB;IAEnB,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAEtC,OAAO;QACL,GAAG,EAAE,iCAAiC,SAAS,GAAG,UAAU,IAAI,SAAS,wBAAwB,eAAe,CAC9G,KAAK,CACN,iBAAiB,KAAK,GAAG,KAAK,EAAE;QACjC,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,KAAkB;IAC7D,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAEtC,OAAO;QACL,GAAG,EAAE,gCAAgC,wBAAwB,CAC3D,KAAK,CACN,GAAG,KAAK,wBAAwB,eAAe,CAAC,KAAK,CAAC,gBAAgB,KAAK,EAAE;QAC9E,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,GAAY,EACZ,MAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,UAAU,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAC3D,SAAS,EAAE,WAAW,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAkB;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAsB,EAAE,MAAmB;IACnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACtD,OAAO,GAAG,MAAM,UAAU,CAAC;QAC7B,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO,GAAG,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAmB;IAC/C,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,IAAI;YACP,OAAO,GAAG,CAAC;QACb,KAAK,KAAK;YACR,OAAO,IAAI,CAAC;QACd,KAAK,KAAK;YACR,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAkB;IAC1C,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,aAAa,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IACrD,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAClC,EAAE,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAkB;IAClD,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB;IACzC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,GAAG,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,IAAI,UAAU,GAAG,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,KAAiB;IACrC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,SAAS,GAAG,MAAM,CAAC;IACzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,SAAS,EAAE,CAAC;QAC7D,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAiB;IACtC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { PostgrestResponse, QueryFilter, QueryOrder, ShimRow, ShimValue, SupabaseShimDatabase } from "./types.js";
2
+ type QueryAction = "select" | "insert" | "delete";
3
+ interface QueryState {
4
+ action: QueryAction;
5
+ columns?: string[];
6
+ filters: QueryFilter[];
7
+ order?: QueryOrder;
8
+ rows?: ShimRow[];
9
+ wantsRows: boolean;
10
+ single: boolean;
11
+ }
12
+ type BuilderData<Single extends boolean> = Single extends true ? ShimRow | null : ShimRow[];
13
+ export declare class SupabasePostgrestBuilder<Single extends boolean = false> implements PromiseLike<PostgrestResponse<BuilderData<Single>>> {
14
+ #private;
15
+ constructor(database: SupabaseShimDatabase, table: string, state?: Partial<QueryState>);
16
+ select(columns?: string): this;
17
+ insert(rows: ShimRow | ShimRow[]): this;
18
+ delete(): this;
19
+ eq(column: string, value: ShimValue): this;
20
+ gte(column: string, value: ShimValue): this;
21
+ lte(column: string, value: ShimValue): this;
22
+ order(column: string, options?: {
23
+ ascending?: boolean;
24
+ }): this;
25
+ single(): SupabasePostgrestBuilder<true>;
26
+ then<TResult1 = PostgrestResponse<BuilderData<Single>>, TResult2 = never>(onfulfilled?: ((value: PostgrestResponse<BuilderData<Single>>) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null): PromiseLike<TResult1 | TResult2>;
27
+ catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null): Promise<PostgrestResponse<BuilderData<Single>> | TResult>;
28
+ finally(onfinally?: (() => void) | null): Promise<PostgrestResponse<BuilderData<Single>>>;
29
+ }
30
+ export {};