@supabase-cache-helpers/postgrest-swr
Version:
A collection of SWR utilities for working with Supabase.
1,185 lines (1,153 loc) • 39.1 kB
JavaScript
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __objRest = (source, exclude) => {
var target = {};
for (var prop in source)
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
target[prop] = source[prop];
if (source != null && __getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(source)) {
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
target[prop] = source[prop];
}
return target;
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/cache/use-delete-item.ts
import {
deleteItem
} from "@supabase-cache-helpers/postgrest-core";
import { flatten } from "flat";
import { useSWRConfig as useSWRConfig3 } from "swr";
// src/lib/constants.ts
var KEY_PREFIX = "postgrest";
var POSTGREST_FILTER_KEY_PREFIX = "postgrest-filter";
var KEY_SEPARATOR = "$";
var INFINITE_PREFIX = "$inf$";
var INFINITE_KEY_PREFIX = "page";
// src/lib/create-key-getter.ts
import {
get,
isPlainObject,
isPostgrestHasMorePaginationResponse,
isPostgrestPaginationResponse
} from "@supabase-cache-helpers/postgrest-core";
// src/lib/parse-order-by.ts
import { parseOrderBy as core } from "@supabase-cache-helpers/postgrest-core";
function parseOrderBy(searchParams, {
orderByPath,
uqOrderByPath
}) {
const orderByDef = core(searchParams);
const orderBy = orderByDef.find((o) => o.column === orderByPath);
if (!orderBy) {
throw new Error(`No ordering key found for path ${orderByPath}`);
}
const uqOrderBy = uqOrderByPath ? orderByDef.find((o) => o.column === uqOrderByPath) : null;
return {
orderBy,
uqOrderBy
};
}
// src/lib/create-key-getter.ts
var createOffsetKeyGetter = (queryFactory, {
pageSize,
rpcArgs
}) => {
if (!queryFactory) return () => null;
return (pageIndex, previousPageData) => {
if (previousPageData && (isPostgrestHasMorePaginationResponse(previousPageData) && !previousPageData.data.length || isPostgrestPaginationResponse(previousPageData) && !previousPageData.length)) {
return null;
}
const cursor = pageIndex * pageSize;
const query = queryFactory();
if (rpcArgs) {
if (query["method"] === "GET") {
query["url"].searchParams.set(rpcArgs.limit, String(pageSize));
query["url"].searchParams.set(rpcArgs.offset, String(cursor));
} else {
query["body"] = __spreadProps(__spreadValues({}, isPlainObject(query["body"]) ? query["body"] : {}), {
[rpcArgs.limit]: pageSize,
[rpcArgs.offset]: cursor
});
}
return query;
}
return query.range(cursor, cursor + pageSize - 1);
};
};
var createCursorKeyGetter = (queryFactory, {
orderBy,
uqOrderBy: uqColumn,
rpcArgs
}) => {
if (!queryFactory) return () => null;
return (_pageIndex, previousPageData) => {
if (previousPageData && isEmptyPreviousPage(previousPageData)) {
return null;
}
const query = queryFactory();
if (!previousPageData) return query;
const lastItem = getLastItem(previousPageData);
if (!lastItem) return query;
const lastValueOrderBy = get(lastItem, orderBy);
if (!lastValueOrderBy) return query;
const lastValueUqColumn = uqColumn ? get(lastItem, uqColumn) : null;
if (rpcArgs) {
if (query["method"] === "GET") {
if (lastValueOrderBy) {
query["url"].searchParams.set(rpcArgs.orderBy, lastValueOrderBy);
}
if (lastValueUqColumn && rpcArgs.uqOrderBy) {
query["url"].searchParams.set(rpcArgs.uqOrderBy, lastValueUqColumn);
}
} else {
query["body"] = __spreadValues(__spreadProps(__spreadValues({}, isPlainObject(query["body"]) ? query["body"] : {}), {
[rpcArgs.orderBy]: lastValueOrderBy
}), lastValueUqColumn && rpcArgs.uqOrderBy ? { [rpcArgs.uqOrderBy]: lastValueUqColumn } : {});
}
return query;
}
const { orderBy: mainOrderBy, uqOrderBy } = parseOrderBy(
query["url"].searchParams,
{ orderByPath: orderBy, uqOrderByPath: uqColumn }
);
if (uqColumn && uqOrderBy && lastValueOrderBy && lastValueUqColumn) {
const operator = mainOrderBy.ascending ? "gt" : "lt";
const uqOperator = uqOrderBy.ascending ? "gt" : "lt";
query["url"].searchParams.append(
"or",
`(${orderBy}.${operator}.${lastValueOrderBy},and(${orderBy}.eq.${lastValueOrderBy},${uqColumn}.${uqOperator}.${lastValueUqColumn}))`
);
} else if (lastValueOrderBy) {
const operator = mainOrderBy.ascending ? "gt" : "lt";
query["url"].searchParams.append(
orderBy,
`${operator}.${lastValueOrderBy}`
);
}
return query;
};
};
function isEmptyPreviousPage(previousPageData) {
return isPostgrestHasMorePaginationResponse(previousPageData) && !previousPageData.data.length || isPostgrestPaginationResponse(previousPageData) && !previousPageData.length;
}
function getLastItem(data) {
if (isPostgrestHasMorePaginationResponse(data)) {
return data.data.length ? data.data[data.data.length - 1] : null;
} else if (isPostgrestPaginationResponse(data)) {
return data.length ? data[data.length - 1] : null;
}
return null;
}
// src/lib/decode.ts
var decode = (key) => {
if (typeof key !== "string") return null;
const isInfinite = key.startsWith(INFINITE_PREFIX);
let parsedKey = key.replace(INFINITE_PREFIX, "");
const isPostgrestKey = parsedKey.startsWith(`${KEY_PREFIX}${KEY_SEPARATOR}`);
if (!isPostgrestKey) {
return null;
}
parsedKey = parsedKey.replace(`${KEY_PREFIX}${KEY_SEPARATOR}`, "");
const [
pagePrefix,
schema,
table,
queryKey,
bodyKey,
count,
head,
orderByKey
] = parsedKey.split(KEY_SEPARATOR);
const params = new URLSearchParams(queryKey);
const limit = params.get("limit");
const offset = params.get("offset");
const countValue = count.replace("count=", "");
return {
limit: limit ? Number(limit) : void 0,
offset: offset ? Number(offset) : void 0,
bodyKey,
count: countValue === "null" ? null : countValue,
isHead: head === "head=true",
isInfinite,
key,
isInfiniteKey: pagePrefix === INFINITE_KEY_PREFIX,
queryKey,
schema,
table,
orderByKey
};
};
// src/lib/encode.ts
var encode = (parser, isInfinite) => {
var _a;
return [
KEY_PREFIX,
isInfinite ? INFINITE_KEY_PREFIX : "null",
parser.schema,
parser.table,
parser.queryKey,
(_a = parser.bodyKey) != null ? _a : "null",
`count=${parser.count}`,
`head=${parser.isHead}`,
parser.orderByKey
].join(KEY_SEPARATOR);
};
// src/lib/middleware.ts
import {
PostgrestParser,
isPostgrestBuilder
} from "@supabase-cache-helpers/postgrest-core";
var infiniteMiddleware = (useSWRInfiniteNext) => {
return (keyFn, fetcher, config) => {
return useSWRInfiniteNext(
(index, previousPageData) => {
const query = keyFn(index, previousPageData);
if (!query) return null;
if (!isPostgrestBuilder(query)) {
throw new Error("Key is not a PostgrestBuilder");
}
return encode(new PostgrestParser(query), true);
},
typeof fetcher === "function" ? (query) => fetcher(query) : fetcher,
config
);
};
};
// src/lib/use-postgrest-filter-cache.ts
import {
PostgrestFilter,
encodeObject
} from "@supabase-cache-helpers/postgrest-core";
import { useSWRConfig } from "swr";
var usePostgrestFilterCache = () => {
const { cache } = useSWRConfig();
return (query, opts) => {
const key = [
POSTGREST_FILTER_KEY_PREFIX,
query,
opts ? encodeObject(opts) : null
].filter(Boolean).join(KEY_SEPARATOR);
const cacheData = cache.get(key);
if (cacheData && cacheData.data instanceof PostgrestFilter) {
return cacheData.data;
}
const filter = PostgrestFilter.fromQuery(query, opts);
cache.set(key, { data: filter });
return filter;
};
};
// src/lib/use-queries-for-table-loader.ts
import { useSWRConfig as useSWRConfig2 } from "swr";
var useQueriesForTableLoader = (table) => {
const { cache } = useSWRConfig2();
const getPostgrestFilter = usePostgrestFilterCache();
return () => Array.from(cache.keys()).reduce((prev, curr) => {
const decodedKey = decode(curr);
if ((decodedKey == null ? void 0 : decodedKey.table) === table) {
prev.push(getPostgrestFilter(decodedKey.queryKey).params);
}
return prev;
}, []);
};
// src/lib/mutable-keys.ts
var getMutableKeys = (keys) => {
return keys.filter((k) => {
const decoded = decode(k);
return decoded && (decoded.isInfinite || !decoded.isInfiniteKey);
});
};
// src/cache/use-delete-item.ts
function useDeleteItem(opts) {
const { mutate, cache } = useSWRConfig3();
const getPostgrestFilter = usePostgrestFilterCache();
return (input) => __async(this, null, function* () {
return yield deleteItem(
__spreadValues({
input: flatten(input)
}, opts),
{
cacheKeys: getMutableKeys(Array.from(cache.keys())),
getPostgrestFilter,
revalidate: (key) => {
mutate(key);
},
mutate: (key, data) => {
var _a;
mutate(key, data, __spreadProps(__spreadValues({}, opts), { revalidate: (_a = opts == null ? void 0 : opts.revalidate) != null ? _a : false }));
},
decode
}
);
});
}
// src/cache/use-mutate-item.ts
import {
mutateItem
} from "@supabase-cache-helpers/postgrest-core";
import { flatten as flatten2 } from "flat";
import { useSWRConfig as useSWRConfig4 } from "swr";
function useMutateItem(opts) {
const { mutate, cache } = useSWRConfig4();
const getPostgrestFilter = usePostgrestFilterCache();
return (input, mutateFn) => __async(this, null, function* () {
return yield mutateItem(
__spreadValues({
input: flatten2(input),
mutate: mutateFn
}, opts),
{
cacheKeys: getMutableKeys(Array.from(cache.keys())),
getPostgrestFilter,
revalidate: (key) => {
mutate(key);
},
mutate: (key, data) => {
var _a;
mutate(key, data, __spreadProps(__spreadValues({}, opts), {
revalidate: (_a = opts == null ? void 0 : opts.revalidate) != null ? _a : false
}));
},
decode
}
);
});
}
// src/cache/use-revalidate-tables.ts
import {
revalidateTables
} from "@supabase-cache-helpers/postgrest-core";
import { useSWRConfig as useSWRConfig5 } from "swr";
function useRevalidateTables(tables) {
const { mutate, cache } = useSWRConfig5();
return () => __async(this, null, function* () {
return yield revalidateTables(tables, {
cacheKeys: getMutableKeys(Array.from(cache.keys())),
revalidate: (key) => {
mutate(key);
},
decode
});
});
}
// src/cache/use-upsert-item.ts
import {
upsertItem
} from "@supabase-cache-helpers/postgrest-core";
import { flatten as flatten3 } from "flat";
import { useSWRConfig as useSWRConfig6 } from "swr";
function useUpsertItem(opts) {
const { mutate, cache } = useSWRConfig6();
const getPostgrestFilter = usePostgrestFilterCache();
return (input) => __async(this, null, function* () {
return yield upsertItem(
__spreadValues({
input: flatten3(input)
}, opts),
{
cacheKeys: getMutableKeys(Array.from(cache.keys())),
getPostgrestFilter,
revalidate: (key) => {
mutate(key);
},
mutate: (key, data) => {
var _a;
mutate(key, data, __spreadProps(__spreadValues({}, opts), {
revalidate: (_a = opts == null ? void 0 : opts.revalidate) != null ? _a : false
}));
},
decode
}
);
});
}
// src/mutate/use-delete-many-mutation.ts
import {
buildDeleteFetcher,
getTable
} from "@supabase-cache-helpers/postgrest-core";
import useMutation from "swr/mutation";
// src/mutate/use-random-key.ts
import { useId } from "react";
var PREFIX = "random-mutation-key";
var useRandomKey = () => {
const key = useId();
return [PREFIX, key].join(KEY_SEPARATOR);
};
// src/mutate/use-delete-many-mutation.ts
function useDeleteManyMutation(qb, primaryKeys, query, opts) {
const key = useRandomKey();
const queriesForTable = useQueriesForTableLoader(getTable(qb));
const deleteItem2 = useDeleteItem(__spreadProps(__spreadValues({}, opts), {
primaryKeys,
table: getTable(qb),
schema: qb.schema
}));
return useMutation(
key,
(_0, _1) => __async(this, [_0, _1], function* (_, { arg }) {
const result = yield buildDeleteFetcher(
qb,
primaryKeys,
__spreadValues({
query: query != null ? query : void 0,
queriesForTable,
disabled: opts == null ? void 0 : opts.disableAutoQuery
}, opts)
)(arg);
if (result) {
for (const r of result) {
deleteItem2(r.normalizedData);
}
}
if (!result || result.every((r) => !r.userQueryData)) return null;
return result.map((r) => r.userQueryData);
}),
opts
);
}
// src/mutate/use-delete-mutation.ts
import {
buildDeleteFetcher as buildDeleteFetcher2,
getTable as getTable2
} from "@supabase-cache-helpers/postgrest-core";
import useMutation2 from "swr/mutation";
function useDeleteMutation(qb, primaryKeys, query, opts) {
const key = useRandomKey();
const queriesForTable = useQueriesForTableLoader(getTable2(qb));
const deleteItem2 = useDeleteItem(__spreadProps(__spreadValues({}, opts), {
primaryKeys,
table: getTable2(qb),
schema: qb.schema
}));
return useMutation2(
key,
(_0, _1) => __async(this, [_0, _1], function* (_, { arg }) {
const r = yield buildDeleteFetcher2(
qb,
primaryKeys,
__spreadValues({
query: query != null ? query : void 0,
queriesForTable,
disabled: opts == null ? void 0 : opts.disableAutoQuery
}, opts)
)([arg]);
if (!r || r.length === 0) return null;
const result = r[0];
if (result) {
deleteItem2(result.normalizedData);
}
return result.userQueryData;
}),
opts
);
}
// src/mutate/use-insert-mutation.ts
import {
buildInsertFetcher,
getTable as getTable3
} from "@supabase-cache-helpers/postgrest-core";
import useMutation3 from "swr/mutation";
// src/mutate/get-user-response.ts
function truthy(value) {
return !!value;
}
var getUserResponse = (d) => {
if (!d) return d;
return d.map((r) => r.userQueryData).filter(truthy);
};
// src/mutate/use-insert-mutation.ts
function useInsertMutation(qb, primaryKeys, query, opts) {
const key = useRandomKey();
const queriesForTable = useQueriesForTableLoader(getTable3(qb));
const upsertItem2 = useUpsertItem(__spreadProps(__spreadValues({}, opts), {
primaryKeys,
table: getTable3(qb),
schema: qb.schema
}));
return useMutation3(
key,
(_0, _1) => __async(this, [_0, _1], function* (_, { arg }) {
const result = yield buildInsertFetcher(
qb,
__spreadValues({
query: query != null ? query : void 0,
queriesForTable,
disabled: opts == null ? void 0 : opts.disableAutoQuery
}, opts)
)(arg);
if (result) {
Promise.all(
(result != null ? result : []).map(
(d) => __async(this, null, function* () {
return yield upsertItem2(d.normalizedData);
})
)
);
}
return getUserResponse(result);
}),
opts
);
}
// src/mutate/use-update-mutation.ts
import {
buildUpdateFetcher,
getTable as getTable4
} from "@supabase-cache-helpers/postgrest-core";
import useSWRMutation from "swr/mutation";
function useUpdateMutation(qb, primaryKeys, query, opts) {
const key = useRandomKey();
const queriesForTable = useQueriesForTableLoader(getTable4(qb));
const upsertItem2 = useUpsertItem(__spreadProps(__spreadValues({}, opts), {
primaryKeys,
table: getTable4(qb),
schema: qb.schema
}));
return useSWRMutation(
key,
(_0, _1) => __async(this, [_0, _1], function* (_, { arg }) {
var _a;
const result = yield buildUpdateFetcher(
qb,
primaryKeys,
__spreadValues({
query: query != null ? query : void 0,
queriesForTable,
disabled: opts == null ? void 0 : opts.disableAutoQuery
}, opts)
)(arg);
if (result == null ? void 0 : result.normalizedData) {
upsertItem2(result == null ? void 0 : result.normalizedData);
}
return (_a = result == null ? void 0 : result.userQueryData) != null ? _a : null;
}),
opts
);
}
// src/mutate/use-upsert-mutation.ts
import {
buildUpsertFetcher,
getTable as getTable5
} from "@supabase-cache-helpers/postgrest-core";
import useMutation4 from "swr/mutation";
function useUpsertMutation(qb, primaryKeys, query, opts) {
const key = useRandomKey();
const queriesForTable = useQueriesForTableLoader(getTable5(qb));
const upsertItem2 = useUpsertItem(__spreadProps(__spreadValues({}, opts), {
primaryKeys,
table: getTable5(qb),
schema: qb.schema
}));
return useMutation4(
key,
(_0, _1) => __async(this, [_0, _1], function* (_, { arg }) {
const result = yield buildUpsertFetcher(
qb,
__spreadValues({
query: query != null ? query : void 0,
queriesForTable,
disabled: opts == null ? void 0 : opts.disableAutoQuery
}, opts)
)(arg);
if (result) {
Promise.all(
result.map(
(d) => __async(this, null, function* () {
return yield upsertItem2(d.normalizedData);
})
)
);
}
return getUserResponse(result);
}),
opts
);
}
// src/query/prefetch.ts
import {
PostgrestParser as PostgrestParser2,
isPostgrestBuilder as isPostgrestBuilder2,
offsetPaginationFetcher,
offsetPaginationHasMoreFetcher
} from "@supabase-cache-helpers/postgrest-core";
function fetchQueryFallbackData(query) {
return __async(this, null, function* () {
if (!isPostgrestBuilder2(query)) {
throw new Error("Query is not a PostgrestBuilder");
}
return [
encode(new PostgrestParser2(query), false),
yield query.throwOnError()
];
});
}
function fetchOffsetPaginationHasMoreFallbackData(query, pageSize) {
return __async(this, null, function* () {
return [
encode(new PostgrestParser2(query.range(0, pageSize)), true),
[
yield offsetPaginationHasMoreFetcher(query, {
offset: 0,
limit: pageSize,
pageSize
})
]
];
});
}
var fetchOffsetPaginationFallbackData = (query, pageSize) => __async(void 0, null, function* () {
return [
encode(new PostgrestParser2(query.range(0, pageSize)), true),
[
yield offsetPaginationFetcher(query, {
offset: 0,
limit: pageSize
})
]
];
});
// src/query/use-cursor-infinite-scroll-query.ts
import {
createCursorPaginationFetcher,
decodeObject,
isPlainObject as isPlainObject2
} from "@supabase-cache-helpers/postgrest-core";
import { useCallback, useMemo } from "react";
import useSWRInfinite from "swr/infinite";
function useCursorInfiniteScrollQuery(queryFactory, config) {
var _a;
const _b = useSWRInfinite(
createCursorKeyGetter(queryFactory, config),
createCursorPaginationFetcher(
queryFactory,
{
decode: (key) => {
if (!queryFactory) {
throw new Error("No query provided");
}
const decodedKey = decode(key);
if (!decodedKey) {
throw new Error("Not a SWRPostgrest key");
}
if (config.rpcArgs) {
if (decodedKey.bodyKey && decodedKey.bodyKey !== "null") {
const body = decodeObject(decodedKey.bodyKey);
const orderBy = body[config.rpcArgs.orderBy];
const uqOrderBy = config.rpcArgs.uqOrderBy ? body[config.rpcArgs.uqOrderBy] : void 0;
return {
orderBy: typeof orderBy === "string" ? orderBy : void 0,
uqOrderBy: typeof uqOrderBy === "string" ? uqOrderBy : void 0
};
} else {
const sp = new URLSearchParams(decodedKey.queryKey);
const orderByValue = sp.get(config.rpcArgs.orderBy);
const uqOrderByValue = config.rpcArgs.uqOrderBy ? sp.get(config.rpcArgs.uqOrderBy) : void 0;
return {
orderBy: orderByValue || void 0,
uqOrderBy: uqOrderByValue || void 0
};
}
}
const query = queryFactory();
const { orderBy: mainOrderBy } = parseOrderBy(
query["url"].searchParams,
{ orderByPath: config.orderBy, uqOrderByPath: config.uqOrderBy }
);
const searchParams = new URLSearchParams(decodedKey.queryKey);
if (config.uqOrderBy) {
const possibleFilters = searchParams.getAll("or");
const filter = possibleFilters.find(
(f) => f.includes(`${config.orderBy}.`) && f.includes(`${config.uqOrderBy}.`)
);
if (!filter) {
return {};
}
const bracketsPart = filter.split("and").pop().match(/\((.*)\)\)/)[1].replace(/\s+/g, "");
const filterParts = bracketsPart.split(",");
const cursorValue = filterParts[0].split(".").pop();
const uqCursorValue = filterParts[1].split(".").pop();
return {
orderBy: cursorValue,
uqOrderBy: uqCursorValue
};
} else {
const filters = searchParams.getAll(config.orderBy);
const filter = filters.find(
(f) => f.startsWith(
`${config.orderBy}.${mainOrderBy.ascending ? "gt" : "lt"}`
)
);
if (!filter) {
return {};
}
const cursorValue = filter.split(".").pop();
return {
orderBy: cursorValue
};
}
},
orderBy: config.orderBy,
uqOrderBy: config.uqOrderBy,
rpcArgs: config.rpcArgs
}
),
__spreadProps(__spreadValues({}, config), {
use: [
...(_a = config == null ? void 0 : config.use) != null ? _a : [],
infiniteMiddleware
]
})
), { data, setSize, size, isValidating } = _b, rest = __objRest(_b, ["data", "setSize", "size", "isValidating"]);
const { flatData, hasLoadMore } = useMemo(() => {
if (!queryFactory) {
return { flatData: void 0, hasLoadMore: false };
}
const query = queryFactory();
const flatData2 = (data != null ? data : []).flat();
let pageSize;
if (config.rpcArgs) {
if (query["method"] === "GET") {
pageSize = query["url"].searchParams.get(config.rpcArgs.limit);
} else {
pageSize = isPlainObject2(query["body"]) ? query["body"][config.rpcArgs.limit] : null;
}
} else {
pageSize = query ? query["url"].searchParams.get("limit") : null;
}
if (!pageSize) {
return { flatData: void 0, hasLoadMore: false };
}
let hasLoadMore2 = !data || (pageSize ? data[data.length - 1].length === Number(pageSize) : true);
return {
flatData: flatData2,
hasLoadMore: hasLoadMore2
};
}, [data, config]);
const loadMoreFn = useCallback(() => setSize(size + 1), [size, setSize]);
return __spreadValues({
data: flatData,
size,
setSize,
loadMore: hasLoadMore && !isValidating ? loadMoreFn : null,
isValidating
}, rest);
}
// src/query/use-offset-infinite-query.ts
import {
createOffsetPaginationFetcher,
decodeObject as decodeObject2
} from "@supabase-cache-helpers/postgrest-core";
import useSWRInfinite2 from "swr/infinite";
function useOffsetInfiniteQuery(queryFactory, config) {
var _a, _b, _c;
return useSWRInfinite2(
createOffsetKeyGetter(queryFactory, {
pageSize: (_a = config == null ? void 0 : config.pageSize) != null ? _a : 20,
rpcArgs: config == null ? void 0 : config.rpcArgs
}),
createOffsetPaginationFetcher(queryFactory, {
decode: (key) => {
const decodedKey = decode(key);
if (!decodedKey) {
throw new Error("Not a SWRPostgrest key");
}
if (config == null ? void 0 : config.rpcArgs) {
if (decodedKey.bodyKey && decodedKey.bodyKey !== "null") {
const body = decodeObject2(decodedKey.bodyKey);
const limit = body[config.rpcArgs.limit];
const offset = body[config.rpcArgs.offset];
return {
limit: typeof limit === "number" ? limit : void 0,
offset: typeof offset === "number" ? offset : void 0
};
} else {
const sp = new URLSearchParams(decodedKey.queryKey);
const limitValue = sp.get(config.rpcArgs.limit);
const offsetValue = sp.get(config.rpcArgs.offset);
return {
limit: limitValue ? parseInt(limitValue, 10) : void 0,
offset: offsetValue ? parseInt(offsetValue, 10) : void 0
};
}
}
return {
limit: decodedKey.limit,
offset: decodedKey.offset
};
},
pageSize: (_b = config == null ? void 0 : config.pageSize) != null ? _b : 20,
rpcArgs: config == null ? void 0 : config.rpcArgs
}),
__spreadProps(__spreadValues({}, config), {
use: [
...(_c = config == null ? void 0 : config.use) != null ? _c : [],
infiniteMiddleware
]
})
);
}
// src/query/use-offset-infinite-scroll-query.ts
import {
createOffsetPaginationHasMoreFetcher,
decodeObject as decodeObject3
} from "@supabase-cache-helpers/postgrest-core";
import { useCallback as useCallback2 } from "react";
import useSWRInfinite3 from "swr/infinite";
function useOffsetInfiniteScrollQuery(queryFactory, config) {
var _a, _b, _c;
const _d = useSWRInfinite3(
createOffsetKeyGetter(queryFactory, {
pageSize: (_a = config == null ? void 0 : config.pageSize) != null ? _a : 20,
rpcArgs: config == null ? void 0 : config.rpcArgs
}),
createOffsetPaginationHasMoreFetcher(queryFactory, {
decode: (key) => {
const decodedKey = decode(key);
if (!decodedKey) {
throw new Error("Not a SWRPostgrest key");
}
if (config == null ? void 0 : config.rpcArgs) {
if (decodedKey.bodyKey && decodedKey.bodyKey !== "null") {
const body = decodeObject3(decodedKey.bodyKey);
const limit = body[config.rpcArgs.limit];
const offset = body[config.rpcArgs.offset];
return {
limit: typeof limit === "number" ? limit : void 0,
offset: typeof offset === "number" ? offset : void 0
};
} else {
const sp = new URLSearchParams(decodedKey.queryKey);
const limitValue = sp.get(config.rpcArgs.limit);
const offsetValue = sp.get(config.rpcArgs.offset);
return {
limit: limitValue ? parseInt(limitValue, 10) : void 0,
offset: offsetValue ? parseInt(offsetValue, 10) : void 0
};
}
}
return {
limit: decodedKey.limit,
offset: decodedKey.offset
};
},
pageSize: (_b = config == null ? void 0 : config.pageSize) != null ? _b : 20,
rpcArgs: config == null ? void 0 : config.rpcArgs
}),
__spreadProps(__spreadValues({}, config), {
use: [
...(_c = config == null ? void 0 : config.use) != null ? _c : [],
infiniteMiddleware
]
})
), { data, setSize, size, isValidating } = _d, rest = __objRest(_d, ["data", "setSize", "size", "isValidating"]);
const hasMore = Array.isArray(data) && data.length > 0 && data[data.length - 1].hasMore;
const loadMoreFn = useCallback2(() => setSize(size + 1), [size, setSize]);
return __spreadValues({
data: (Array.isArray(data) ? data : []).flatMap((p) => p.data),
size,
setSize,
loadMore: hasMore ? loadMoreFn : null,
isValidating
}, rest);
}
// src/query/use-infinite-offset-pagination-query.ts
import {
createOffsetPaginationHasMoreFetcher as createOffsetPaginationHasMoreFetcher2,
decodeObject as decodeObject4
} from "@supabase-cache-helpers/postgrest-core";
import { useCallback as useCallback3, useState } from "react";
import useSWRInfinite4 from "swr/infinite";
function useInfiniteOffsetPaginationQuery(queryFactory, config) {
var _a, _b, _c, _e;
const _d = useSWRInfinite4(
createOffsetKeyGetter(queryFactory, {
pageSize: (_a = config == null ? void 0 : config.pageSize) != null ? _a : 20,
rpcArgs: config == null ? void 0 : config.rpcArgs
}),
createOffsetPaginationHasMoreFetcher2(queryFactory, {
decode: (key) => {
const decodedKey = decode(key);
if (!decodedKey) {
throw new Error("Not a SWRPostgrest key");
}
if (config == null ? void 0 : config.rpcArgs) {
if (decodedKey.bodyKey && decodedKey.bodyKey !== "null") {
const body = decodeObject4(decodedKey.bodyKey);
const limit = body[config.rpcArgs.limit];
const offset = body[config.rpcArgs.offset];
return {
limit: typeof limit === "number" ? limit : void 0,
offset: typeof offset === "number" ? offset : void 0
};
} else {
const sp = new URLSearchParams(decodedKey.queryKey);
const limitValue = sp.get(config.rpcArgs.limit);
const offsetValue = sp.get(config.rpcArgs.offset);
return {
limit: limitValue ? parseInt(limitValue, 10) : void 0,
offset: offsetValue ? parseInt(offsetValue, 10) : void 0
};
}
}
return {
limit: decodedKey.limit,
offset: decodedKey.offset
};
},
pageSize: (_b = config == null ? void 0 : config.pageSize) != null ? _b : 20,
rpcArgs: config == null ? void 0 : config.rpcArgs
}),
__spreadProps(__spreadValues({}, config), {
use: [
...(_c = config == null ? void 0 : config.use) != null ? _c : [],
infiniteMiddleware
]
})
), { data, setSize, size, isValidating } = _d, rest = __objRest(_d, ["data", "setSize", "size", "isValidating"]);
const [currentPageIndex, setCurrentPageIndex] = useState(0);
const parsedData = (data != null ? data : []).map((p) => p.data);
const hasMore = Array.isArray(data) && data.length > 0 && data[data.length - 1].hasMore;
const setPage = useCallback3(
(idx) => {
if (idx > size - 1) {
setSize(idx + 1);
}
setCurrentPageIndex(idx);
},
[size, setSize, setCurrentPageIndex]
);
const nextPageFn = useCallback3(() => {
if (currentPageIndex === size - 1) {
setSize((size2) => size2 + 1);
}
setCurrentPageIndex((page) => page + 1);
}, [currentPageIndex, size, setSize, setCurrentPageIndex]);
const previousPageFn = useCallback3(
() => setCurrentPageIndex((current) => current - 1),
[setCurrentPageIndex]
);
return __spreadValues({
pages: parsedData,
currentPage: parsedData ? (_e = parsedData[currentPageIndex]) != null ? _e : [] : [],
pageIndex: currentPageIndex,
setPage,
nextPage: !isValidating && (hasMore || currentPageIndex < size - 1) ? nextPageFn : null,
previousPage: !isValidating && currentPageIndex > 0 ? previousPageFn : null,
isValidating
}, rest);
}
// src/query/use-query.ts
import {
PostgrestParser as PostgrestParser3,
isPostgrestBuilder as isPostgrestBuilder3
} from "@supabase-cache-helpers/postgrest-core";
import useSWR from "swr";
function useQuery(query, config) {
var _a, _c;
const _b = useSWR(
query,
(q) => __async(this, null, function* () {
if (isPostgrestBuilder3(q)) {
q = q.throwOnError();
}
return yield q;
}),
__spreadProps(__spreadValues({}, config), {
use: [
...(_a = config == null ? void 0 : config.use) != null ? _a : [],
(useSWRNext) => {
return (key, fetcher, config2) => {
if (!fetcher) throw new Error("No fetcher provided");
if (key !== null && !isPostgrestBuilder3(key)) {
throw new Error("Key is not a PostgrestBuilder");
}
return useSWRNext(
key ? encode(new PostgrestParser3(key), false) : null,
() => fetcher(key),
config2
);
};
}
]
})
), { data } = _b, rest = __objRest(_b, ["data"]);
return __spreadValues({ data: data == null ? void 0 : data.data, count: (_c = data == null ? void 0 : data.count) != null ? _c : null }, rest);
}
// src/subscribe/use-subscription-query.ts
import {
buildNormalizedQuery,
normalizeResponse
} from "@supabase-cache-helpers/postgrest-core";
import {
REALTIME_LISTEN_TYPES,
REALTIME_POSTGRES_CHANGES_LISTEN_EVENT
} from "@supabase/supabase-js";
import { useEffect, useState as useState2 } from "react";
function useSubscriptionQuery(client, channelName, filter, primaryKeys, query, opts) {
const [status, setStatus] = useState2({ status: null, error: null });
const [channel, setChannel] = useState2();
const queriesForTable = useQueriesForTableLoader(filter.table);
const deleteItem2 = useDeleteItem(__spreadProps(__spreadValues({}, opts), {
primaryKeys,
table: filter.table,
schema: filter.schema
}));
const upsertItem2 = useUpsertItem(__spreadProps(__spreadValues({}, opts), {
primaryKeys,
table: filter.table,
schema: filter.schema
}));
useEffect(() => {
if (!client) return;
const c = client.channel(channelName).on(
REALTIME_LISTEN_TYPES.POSTGRES_CHANGES,
filter,
(payload) => __async(this, null, function* () {
var _a;
let data = (_a = payload.new) != null ? _a : payload.old;
const selectQuery = buildNormalizedQuery({ queriesForTable, query });
if (payload.eventType !== REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE && selectQuery) {
const qb = client.from(payload.table).select(selectQuery.selectQuery);
for (const pk of primaryKeys) {
qb.eq(pk.toString(), data[pk]);
}
const res = yield qb.single();
if (res.data) {
data = normalizeResponse(selectQuery.groupedPaths, res.data);
}
}
if (payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT || payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE) {
yield upsertItem2(data);
} else if (payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE) {
yield deleteItem2(payload.old);
}
if (opts == null ? void 0 : opts.callback) {
opts.callback(__spreadProps(__spreadValues({}, payload), {
data
}));
}
})
).subscribe(
(status2, error) => setStatus({ status: status2, error: error || null })
);
setChannel(c);
return () => {
if (c) c.unsubscribe();
};
}, []);
return __spreadValues({ channel }, status);
}
// src/subscribe/use-subscription.ts
import {
REALTIME_LISTEN_TYPES as REALTIME_LISTEN_TYPES2,
REALTIME_POSTGRES_CHANGES_LISTEN_EVENT as REALTIME_POSTGRES_CHANGES_LISTEN_EVENT2
} from "@supabase/supabase-js";
import { useEffect as useEffect2, useState as useState3 } from "react";
function useSubscription(client, channelName, filter, primaryKeys, opts) {
const [status, setStatus] = useState3({ status: null, error: null });
const deleteItem2 = useDeleteItem(__spreadProps(__spreadValues({}, opts), {
primaryKeys,
table: filter.table,
schema: filter.schema
}));
const upsertItem2 = useUpsertItem(__spreadProps(__spreadValues({}, opts), {
primaryKeys,
table: filter.table,
schema: filter.schema
}));
useEffect2(() => {
if (!client) return;
const c = client.channel(channelName).on(
REALTIME_LISTEN_TYPES2.POSTGRES_CHANGES,
filter,
(payload) => __async(this, null, function* () {
if (payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT2.INSERT || payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT2.UPDATE) {
yield upsertItem2(payload.new);
} else if (payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT2.DELETE) {
yield deleteItem2(payload.old);
}
if (opts == null ? void 0 : opts.callback) {
opts.callback(__spreadValues({}, payload));
}
})
).subscribe(
(status2, error) => setStatus({ status: status2, error: error || null })
);
return () => {
if (c) c.unsubscribe();
};
}, []);
return status;
}
export {
INFINITE_KEY_PREFIX,
INFINITE_PREFIX,
KEY_PREFIX,
KEY_SEPARATOR,
POSTGREST_FILTER_KEY_PREFIX,
createCursorKeyGetter,
createOffsetKeyGetter,
decode,
encode,
fetchOffsetPaginationFallbackData,
fetchOffsetPaginationHasMoreFallbackData,
fetchQueryFallbackData,
infiniteMiddleware,
useCursorInfiniteScrollQuery,
useDeleteItem,
useDeleteManyMutation,
useDeleteMutation,
useInfiniteOffsetPaginationQuery,
useInsertMutation,
useMutateItem,
useOffsetInfiniteQuery,
useOffsetInfiniteScrollQuery,
usePostgrestFilterCache,
useQueriesForTableLoader,
useQuery,
useRevalidateTables,
useSubscription,
useSubscriptionQuery,
useUpdateMutation,
useUpsertItem,
useUpsertMutation
};
//# sourceMappingURL=index.js.map