@marktiderman/genesis-core 1.5.1 → 1.6.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 +112 -0
- package/dist/chunk-ADD2RIGA.js +108 -0
- package/dist/chunk-ADD2RIGA.js.map +1 -0
- package/dist/{chunk-3JSFTLDV.js → chunk-CKGGE6WA.js} +4 -4
- package/dist/{chunk-3JSFTLDV.js.map → chunk-CKGGE6WA.js.map} +1 -1
- package/dist/{chunk-6Q477CHB.js → chunk-KV6KH3L2.js} +6 -3
- package/dist/chunk-KV6KH3L2.js.map +1 -0
- package/dist/chunk-KXVHDK3Q.js +71 -0
- package/dist/chunk-KXVHDK3Q.js.map +1 -0
- package/dist/{chunk-F3BE7NGM.js → chunk-OBUBP4BY.js} +83 -47
- package/dist/chunk-OBUBP4BY.js.map +1 -0
- package/dist/chunk-V3GDAELU.js +3 -0
- package/dist/{chunk-HT43MPKW.js.map → chunk-V3GDAELU.js.map} +1 -1
- package/dist/{chunk-E5VYFAQO.js → chunk-Y475Z7BM.js} +202 -11
- package/dist/chunk-Y475Z7BM.js.map +1 -0
- package/dist/{chunk-ZK5C3OOT.js → chunk-ZKMAU6NN.js} +12 -3
- package/dist/chunk-ZKMAU6NN.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -2
- package/dist/hooks/index.js +7 -5
- package/dist/hooks/mutation-mode.d.ts +2 -2
- package/dist/hooks/mutation-mode.js +1 -1
- package/dist/hooks/related-keys.d.ts +2 -2
- package/dist/hooks/use-capabilities.d.ts +1 -1
- package/dist/hooks/use-infinite-resource.d.ts +50 -0
- package/dist/hooks/use-infinite-resource.js +6 -0
- package/dist/hooks/use-infinite-resource.js.map +1 -0
- package/dist/hooks/use-live.d.ts +27 -0
- package/dist/hooks/use-live.js +5 -0
- package/dist/hooks/use-live.js.map +1 -0
- package/dist/hooks/use-one.d.ts +9 -2
- package/dist/hooks/use-one.js +2 -1
- package/dist/hooks/use-resource-form.d.ts +2 -2
- package/dist/hooks/use-resource-form.js +4 -3
- package/dist/hooks/use-resource.d.ts +14 -2
- package/dist/hooks/use-resource.js +3 -2
- package/dist/index.d.ts +6 -4
- package/dist/index.js +9 -7
- package/dist/provider/index.d.ts +54 -6
- package/dist/provider/index.js +1 -1
- package/dist/{read-outcome-kgNhfuST.d.ts → read-outcome-C_9HbXvb.d.ts} +1 -1
- package/dist/schema/index.d.ts +4 -4
- package/dist/{types-5cuflvha.d.ts → types-C7FJtFXV.d.ts} +12 -0
- package/dist/{types-DDOmG9hj.d.ts → types-CS9UpxQS.d.ts} +62 -4
- package/package.json +1 -1
- package/dist/chunk-6Q477CHB.js.map +0 -1
- package/dist/chunk-E5VYFAQO.js.map +0 -1
- package/dist/chunk-F3BE7NGM.js.map +0 -1
- package/dist/chunk-HT43MPKW.js +0 -3
- package/dist/chunk-ZK5C3OOT.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider/postgrest-errors.ts","../src/provider/supabase-provider.ts"],"names":["run","from"],"mappings":"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","file":"chunk-E5VYFAQO.js","sourcesContent":["// ---------------------------------------------------------------------------\n// Postgres / PostgREST error codes → Genesis write outcomes\n// ---------------------------------------------------------------------------\n\nimport {\n DataWriteError,\n isDataWriteError,\n type WriteOutcome,\n} from \"../schema/write-outcome\";\nimport type { ReadOutcome } from \"../schema/read-outcome\";\nimport { titleCase } from \"../utils\";\n\n/**\n * Maps a store error code to the read outcome it means: the write mapping,\n * with `22***` and PostgREST request errors (`PGRST1**` other than PGRST116,\n * `42703` unknown column, `42P01` unknown table) read as `invalid`.\n */\nexport function readOutcomeFromCode(code: string | null | undefined): ReadOutcome {\n if (!code) return \"error\";\n if (code === \"42703\" || code === \"42P01\" || (/^PGRST1\\d\\d$/.test(code) && code !== \"PGRST116\")) {\n return \"invalid\";\n }\n const write = writeOutcomeFromCode(code);\n return write === \"forbidden\" || write === \"gone\" || write === \"unauthenticated\" || write === \"invalid\"\n ? write\n : \"error\";\n}\n\n/**\n * Maps a Postgres SQLSTATE or PostgREST error code to the write outcome it\n * means. Anything not listed is `error`: a code is only read as a refusal or\n * a bad value when it says so.\n *\n * - `42501` (insufficient privilege, including \"new row violates row-level\n * security policy\") → `forbidden`\n * - `22***` (data exception: bad type, out of range) and `23***` (integrity\n * constraint: `23505` unique, `23503` foreign key, `23502` not null,\n * `23514` check) → `invalid`\n * - `PGRST301`–`PGRST303` (JWT missing, expired or rejected), `28000`,\n * `28P01` → `unauthenticated`\n * - `PGRST116` (one row was asked for and none came back) → `gone`\n */\nexport function writeOutcomeFromCode(code: string | null | undefined): WriteOutcome {\n if (!code) return \"error\";\n if (code === \"42501\") return \"forbidden\";\n if (code === \"PGRST116\") return \"gone\";\n if (code === \"PGRST301\" || code === \"PGRST302\" || code === \"PGRST303\") return \"unauthenticated\";\n if (code === \"28000\" || code === \"28P01\") return \"unauthenticated\";\n if (/^2[23][0-9A-Z]{3}$/.test(code)) return \"invalid\";\n return \"error\";\n}\n\n/** A column name as Postgres reports it unquoted; anything else is not mapped. */\nconst COLUMN = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/**\n * One index expression as Postgres prints it: a plain column, or one column\n * wrapped in a function, optionally cast (`lower(email::text)`,\n * `lower((email)::text)`). Anything else is not mapped.\n */\nconst WRAPPED_COLUMN = /^[A-Za-z_][A-Za-z0-9_]*\\(\\(?([A-Za-z_][A-Za-z0-9_]*)\\)?(?:::[A-Za-z_][A-Za-z0-9_ ]*)?\\)$/;\n\nfunction columnOf(expression: string): string | undefined {\n if (COLUMN.test(expression)) return expression;\n return WRAPPED_COLUMN.exec(expression)?.[1];\n}\n\n/**\n * The columns of a `Key (a, b)=(...)` detail line, or none when any is not a\n * plain column (or one column in a simple expression index). The key list is\n * read with its parentheses balanced, so an expression index such as\n * `Key (lower(email::text))=(…)` is recognised.\n */\nfunction keyColumns(details: string, tail: RegExp): string[] {\n if (!details.startsWith(\"Key (\") || !tail.test(details)) return [];\n let depth = 1;\n let end = -1;\n for (let i = \"Key (\".length; i < details.length; i++) {\n const ch = details[i];\n if (ch === \"(\") depth++;\n else if (ch === \")\" && --depth === 0) {\n end = i;\n break;\n }\n }\n if (end < 0 || details.slice(end + 1, end + 3) !== \"=(\") return [];\n const parts: string[] = [];\n let level = 0;\n let current = \"\";\n for (const ch of details.slice(\"Key (\".length, end)) {\n if (ch === \"(\") level++;\n else if (ch === \")\") level--;\n if (ch === \",\" && level === 0) {\n parts.push(current.trim());\n current = \"\";\n } else {\n current += ch;\n }\n }\n parts.push(current.trim());\n const columns = parts.map(columnOf);\n return columns.length > 0 && columns.every((c): c is string => !!c) ? columns : [];\n}\n\nfunction listLabels(columns: string[]): string {\n const labels = columns.map((c) => titleCase(c));\n if (labels.length === 1) return labels[0]!;\n return `${labels.slice(0, -1).join(\", \")} and ${labels[labels.length - 1]}`;\n}\n\n/** Field errors read from a store error, with the safe sentence that sums them up. */\nexport interface PostgrestFieldErrors {\n /** Column name → safe message for that input. */\n fields: Record<string, string>;\n /** One safe sentence for the whole error, to replace the store's raw text. */\n message: string;\n}\n\n/**\n * Reads which columns a Postgres constraint error is about, from PostgREST's\n * `message` / `details`, and gives safe messages for them. Only plain column\n * names are taken from the store's text; the values it echoes are never\n * used. A unique violation whose columns cannot be read (a complex\n * expression index, no details), or an insert/update foreign-key violation\n * whose key is an expression, gets the safe sentence with no `fields`, so the\n * store's raw text (constraint name, echoed value) never reaches the user.\n * Returns `undefined` for anything else.\n *\n * - `23505` unique violation, `Key (email)=(…) already exists.` → each\n * column: \"This value is already in use.\" (several columns: \"This\n * combination is already in use.\")\n * - `23502` not-null, `null value in column \"title\" …` → \"This field is\n * required.\"\n * - `23503` foreign key on insert/update, `Key (owner_id)=(…) is not present\n * in table …` → \"The selected item doesn't exist.\"\n */\nexport function fieldErrorsFromPostgrest(error: {\n code?: unknown;\n message?: unknown;\n details?: unknown;\n}): PostgrestFieldErrors | undefined {\n const code = typeof error.code === \"string\" ? error.code : undefined;\n const details = typeof error.details === \"string\" ? error.details.trim() : \"\";\n const message = typeof error.message === \"string\" ? error.message : \"\";\n if (code === \"23505\") {\n const columns = keyColumns(details, /\\) already exists\\.?$/);\n // Not mappable to a column: still never show the store's raw text (it\n // names the constraint and echoes the value).\n if (columns.length === 0) return { fields: {}, message: \"This value is already in use.\" };\n const each = columns.length === 1 ? \"This value is already in use.\" : \"This combination is already in use.\";\n return {\n fields: Object.fromEntries(columns.map((c) => [c, each])),\n message:\n columns.length === 1\n ? `${listLabels(columns)} is already in use.`\n : `This combination of ${listLabels(columns)} is already in use.`,\n };\n }\n if (code === \"23502\") {\n const column = /^null value in column \"([A-Za-z_][A-Za-z0-9_]*)\"(?: |$)/.exec(message)?.[1];\n if (!column || !COLUMN.test(column)) return undefined;\n return {\n fields: { [column]: \"This field is required.\" },\n message: `${titleCase(column)} is required.`,\n };\n }\n if (code === \"23503\") {\n const tail = /\\) is not present in table \"[^\"]*\"\\.?$/;\n if (!tail.test(details)) return undefined;\n const columns = keyColumns(details, tail);\n if (columns.length === 0) return { fields: {}, message: \"The selected item doesn't exist.\" };\n return {\n fields: Object.fromEntries(columns.map((c) => [c, \"The selected item doesn't exist.\"])),\n message: `${listLabels(columns)}: the selected item doesn't exist.`,\n };\n }\n return undefined;\n}\n\n/**\n * Turns anything a write threw, or the `{ message, code }` error a Supabase\n * client returned, into a `DataWriteError`. A `DataWriteError` passes through\n * unchanged; anything else keeps its message and `code`, and is kept as the\n * `cause`.\n *\n * When the error names the columns it is about (`fieldErrorsFromPostgrest`:\n * unique, not-null and foreign-key violations), the result carries `fields`\n * and its message is replaced with a safe sentence; the raw text stays on\n * the `cause`.\n */\nexport function toDataWriteError(error: unknown): DataWriteError {\n if (isDataWriteError(error)) return error;\n const shape = (typeof error === \"object\" && error !== null ? error : {}) as {\n message?: unknown;\n code?: unknown;\n details?: unknown;\n };\n const code = typeof shape.code === \"string\" ? shape.code : undefined;\n const mapped = fieldErrorsFromPostgrest(shape);\n if (mapped) {\n return new DataWriteError(writeOutcomeFromCode(code), mapped.message, {\n code,\n fields: Object.keys(mapped.fields).length > 0 ? mapped.fields : undefined,\n cause: error,\n });\n }\n const message =\n typeof shape.message === \"string\" && shape.message\n ? shape.message\n : error instanceof Error\n ? error.message\n : String(error);\n return new DataWriteError(writeOutcomeFromCode(code), message, { code, cause: error });\n}\n","import type {\n BaseRecord,\n DataProvider,\n FilterParam,\n Identifier,\n InvalidationKey,\n WriteEvent,\n} from \"./types\";\nimport { DataWriteError } from \"../schema/write-outcome\";\nimport { DataReadError, readFailureMessage } from \"../schema/read-outcome\";\nimport type { FilterOperator, ProviderCapabilities } from \"../schema/types\";\nimport { readOutcomeFromCode, toDataWriteError } from \"./postgrest-errors\";\n\n// ---------------------------------------------------------------------------\n// Minimal Supabase client shape — no hard dependency on @supabase/supabase-js\n// ---------------------------------------------------------------------------\n\n/** A chainable query builder returned by `client.from(table)`. */\ninterface SupabaseQueryBuilder {\n select(\n columns?: string,\n options?: { count?: \"exact\" | \"planned\" | \"estimated\" },\n ): SupabaseQueryBuilder;\n insert(data: Record<string, unknown> | Record<string, unknown>[]): SupabaseQueryBuilder;\n update(data: Record<string, unknown>): SupabaseQueryBuilder;\n delete(): SupabaseQueryBuilder;\n eq(column: string, value: unknown): SupabaseQueryBuilder;\n neq(column: string, value: unknown): SupabaseQueryBuilder;\n gt(column: string, value: unknown): SupabaseQueryBuilder;\n lt(column: string, value: unknown): SupabaseQueryBuilder;\n gte(column: string, value: unknown): SupabaseQueryBuilder;\n lte(column: string, value: unknown): SupabaseQueryBuilder;\n ilike(column: string, value: string): SupabaseQueryBuilder;\n in(column: string, values: unknown[]): SupabaseQueryBuilder;\n is(column: string, value: null): SupabaseQueryBuilder;\n not(column: string, operator: string, value: unknown): SupabaseQueryBuilder;\n or(filters: string): SupabaseQueryBuilder;\n order(column: string, options?: { ascending?: boolean }): SupabaseQueryBuilder;\n range(from: number, to: number): SupabaseQueryBuilder;\n single(): SupabaseQueryBuilder;\n then: Promise<{ data: unknown; error: unknown; count?: number | null }>[\"then\"];\n}\n\n/**\n * Minimal Supabase client interface — the public shape this package has\n * always exposed for a caller that wants to type its own client or a\n * wrapper around one. Unchanged: `from()` still returns `SupabaseQueryBuilder`\n * so existing consumers that annotate a variable with this type and chain\n * off it keep type-checking exactly as before.\n */\nexport interface SupabaseClient {\n from(table: string): SupabaseQueryBuilder;\n}\n\n/**\n * What `createSupabaseProvider` actually requires from its `client` argument\n * — deliberately looser than the public `SupabaseClient` above, and used\n * ONLY for that one parameter. A real `@supabase/supabase-js` client's\n * `from()` returns a generic, table-typed `PostgrestQueryBuilder` whose chain\n * methods don't structurally match `SupabaseQueryBuilder`, which used to\n * force callers to pass their client through `as never`. Since `unknown` is\n * a supertype of everything, any real client's `from(table: string)`\n * satisfies THIS shape without a cast; `createSupabaseProvider` narrows to\n * `SupabaseQueryBuilder` internally, once, right after each `from()` call.\n * Loosening only the input here — rather than `SupabaseClient` itself —\n * means a caller relying on `SupabaseClient`'s stricter return type for\n * their own chaining is unaffected.\n */\nexport interface SupabaseClientInput {\n from(table: string): unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\n/** What a write hook is told about the write it is part of. */\nexport interface SupabaseWriteContext {\n resource: string;\n action: \"create\" | \"update\";\n /** The row's id, for an update. */\n id?: Identifier;\n}\n\n/** Per-resource rules for `createSupabaseProvider`. Every field is optional. */\nexport interface SupabaseResourceConfig {\n /** Singular noun for failure messages, e.g. \"project\". Defaults to \"record\". */\n noun?: string;\n /** Plural for list messages, when it isn't `noun` + \"s\" (\"categories\"). */\n nounPlural?: string;\n /**\n * The columns a search covers. `[]` means the resource can't be searched,\n * and `capabilities(resource).search` reports false so a UI hides the box.\n * Set, they replace the caller's `search.fields`; omitted, those are used\n * as given.\n */\n searchFields?: readonly string[];\n /**\n * The column a sorted list orders by last, so rows with equal sort values\n * keep one order from page to page (none repeats, none is skipped).\n * Default `\"id\"`; `false` for a table or view without one. With the\n * default, a view that turns out to have no `id` column is read as before\n * (without the key order) and a development warning suggests setting this.\n */\n orderKey?: string | false;\n /**\n * `\"bin\"` for a table whose delete trigger moves the row to a recycle bin\n * instead of removing it (see `SupabaseProviderOptions.binTables`).\n * `\"hard\"` forces a plain delete even when `binTables` lists the table.\n */\n deleteMode?: \"hard\" | \"bin\";\n /**\n * Turns submitted values into the row to write: trim, drop read-only keys,\n * validate. Runs before every create and update, including the `create`\n * and `update` overrides. Throw (ideally `DataWriteError(\"invalid\", ...)`)\n * to refuse the write; nothing is sent.\n */\n prepare?: (\n values: Record<string, unknown>,\n context: SupabaseWriteContext,\n ) => Record<string, unknown> | Promise<Record<string, unknown>>;\n /**\n * Creates the row some other way than an insert, e.g. a security-definer\n * RPC. Return the new row, or its id and the provider reads the row back\n * (if the read-back fails, the create is still reported as saved, with\n * just the id, so the user does not retry and make a second one). Throw to\n * fail; a Supabase `{ message, code }` error is mapped like any other.\n */\n create?: (row: Record<string, unknown>) => Promise<BaseRecord | Identifier>;\n /**\n * Updates the row some other way than an update, e.g. an RPC. Return the\n * updated row, or its id (or `true`) and the provider reads it back.\n * Returning nothing (`undefined`/`null`/`false`) means no row changed: the provider then reads the\n * row to say why (`forbidden` or `gone`), exactly as for a plain update,\n * so a function that silently skips a row never reports a save.\n */\n update?: (\n id: Identifier,\n row: Record<string, unknown>,\n ) => Promise<BaseRecord | Identifier | boolean | null | undefined | void>;\n /** Maps a stored row to edit-form values; see `DataProvider.toFormValues`. */\n toFormValues?: (record: Record<string, unknown>) => Record<string, unknown>;\n /**\n * Other cache keys a committed write to this resource makes stale, e.g.\n * `[[\"staff\"], [\"me\"]]`. Served through `DataProvider.invalidates`, which\n * `useResource` and `useResourceForm` invalidate after their writes.\n */\n invalidates?: InvalidationKey[] | ((event: WriteEvent) => InvalidationKey[]);\n}\n\n/** Options for `createSupabaseProvider`. All optional; none changes reads. */\nexport interface SupabaseProviderOptions {\n /**\n * Recycle-bin tables: their delete trigger turns a delete into a \"binned\"\n * mark and the binned row drops out of the caller's view (RLS or a view\n * filter). The database reports such a delete as zero rows, so for these\n * the provider checks the row is visible, deletes it, and reads it back:\n * gone from view is success, still visible is `forbidden`. A row that was\n * not visible beforehand is `gone`.\n */\n binTables?: readonly string[] | ((resource: string) => boolean);\n /** Per-resource rules, keyed by resource (table) name. */\n resources?: Record<string, SupabaseResourceConfig>;\n /**\n * Called after every committed create, update and delete, e.g. to\n * invalidate caches the Genesis hooks don't know about. Awaited, but a\n * failure is logged and never turns a committed write into a failed one.\n */\n onWrite?: (event: WriteEvent) => void | Promise<void>;\n /**\n * The most rows one list page may ask for (PostgREST's `max-rows` caps\n * reads anyway; default 1000). A larger request is refused with an\n * `invalid` `DataReadError` (its `cause` says why) rather than cut short,\n * so page boundaries never disagree with the caller's `perPage`.\n * `capabilities().maxPerPage` reports it.\n */\n maxPerPage?: number;\n /**\n * Called with every failed read, before it is thrown. The thrown\n * `DataReadError` carries a plain message for users; the store's own\n * error (its raw text and code) is its `cause`, for logging here.\n */\n onReadError?: (\n error: DataReadError,\n context: { resource: string; operation: \"getList\" | \"getOne\" | \"getMany\" },\n ) => void | Promise<void>;\n}\n\n/** A PostgREST \"undefined column\" error (42703) naming `column`. */\n/**\n * A PostgreSQL \"undefined column\" error (42703) for `table`'s own `column`:\n * `column \"id\" does not exist` or `column <table>.id does not exist`. Not a\n * related table's column (`author.id`) or any other message mentioning it.\n */\nfunction isMissingColumn(error: unknown, table: string, column: string): boolean {\n if (!error || typeof error !== \"object\") return false;\n const { code, message } = error as { code?: unknown; message?: unknown };\n if (code !== \"42703\" || typeof message !== \"string\") return false;\n const match = /^column (?:\"?([^.\"\\s]+)\"?\\.)?\"?([^.\"\\s]+)\"? does not exist$/.exec(message.trim());\n if (!match || match[2] !== column) return false;\n const ownTable = table.split(\".\").pop()?.replace(/\"/g, \"\");\n return match[1] === undefined || match[1] === ownTable;\n}\n\nconst SERVED_OPERATORS: readonly FilterOperator[] = [\n \"eq\", \"neq\", \"gt\", \"lt\", \"gte\", \"lte\", \"contains\", \"in\", \"between\", \"is_null\", \"is_not_null\",\n];\n\nfunction escapeIlike(value: string): string {\n return value.replace(/[%_\\\\]/g, (char) => `\\\\${char}`);\n}\n\nfunction isIdentifier(value: unknown): value is Identifier {\n return typeof value === \"string\" || typeof value === \"number\";\n}\n\n/**\n * The Supabase data provider. Reads and writes go through the client you\n * pass, under that client's session and RLS.\n *\n * Writes never report a save that did not happen:\n * - `update` and `deleteOne` ask for the affected rows. Zero rows is a\n * `DataWriteError`: the row is read back, and still visible means\n * `forbidden` (RLS or a trigger refused the change), no longer visible\n * means `gone`.\n * - Database errors on writes are thrown as `DataWriteError` with the\n * outcome their code means (`writeOutcomeFromCode`) and the code kept on\n * `error.code`.\n * - Recycle-bin tables (`binTables`) succeed when the row leaves the\n * caller's view.\n *\n * Reads are unchanged: errors are thrown as an `Error` carrying `code`.\n */\nexport function createSupabaseProvider(\n client: SupabaseClientInput,\n options: SupabaseProviderOptions = {},\n): DataProvider {\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n function applyFilters(\n query: SupabaseQueryBuilder,\n filters: FilterParam[] | undefined,\n ): SupabaseQueryBuilder {\n if (!filters) return query;\n for (const f of filters) {\n switch (f.operator) {\n case \"eq\":\n query = query.eq(f.field, f.value);\n break;\n case \"neq\":\n query = query.neq(f.field, f.value);\n break;\n case \"gt\":\n query = query.gt(f.field, f.value);\n break;\n case \"lt\":\n query = query.lt(f.field, f.value);\n break;\n case \"gte\":\n query = query.gte(f.field, f.value);\n break;\n case \"lte\":\n query = query.lte(f.field, f.value);\n break;\n case \"contains\":\n query = query.ilike(f.field, `%${escapeIlike(String(f.value))}%`);\n break;\n case \"in\":\n query = query.in(f.field, f.value);\n break;\n case \"is_null\":\n query = query.is(f.field, null);\n break;\n case \"is_not_null\":\n query = query.not(f.field, \"is\", null);\n break;\n case \"between\": {\n const [lo, hi] = f.value;\n query = query.gte(f.field, lo).lte(f.field, hi);\n break;\n }\n default:\n throw new Error(`[SupabaseProvider] Unknown filter operator \"${(f as FilterParam).operator}\"`);\n break;\n }\n }\n return query;\n }\n\n const maxPerPage = options.maxPerPage ?? 1000;\n // Resources found to have no \"id\" column for the default orderKey.\n const keylessResources = new Set<string>();\n\n /** Tell `onReadError` (sync or async; its failure is swallowed), then throw. */\n async function reportReadError(\n error: DataReadError,\n resource: string,\n operation: \"getList\" | \"getOne\" | \"getMany\",\n ): Promise<never> {\n try {\n await Promise.resolve(options.onReadError?.(error, { resource, operation }));\n } catch {\n // A logging hook never changes what the caller is told.\n }\n throw error;\n }\n\n /** A failed read, as a `DataReadError` with a message users can be shown. */\n async function throwIfReadError(\n result: { error: unknown },\n resource: string,\n operation: \"getList\" | \"getOne\" | \"getMany\",\n ): Promise<void> {\n if (!result.error) return;\n const raw = result.error as { message?: string; code?: string };\n const code = typeof raw.code === \"string\" ? raw.code : undefined;\n const outcome = readOutcomeFromCode(code);\n const error = new DataReadError(\n outcome,\n readFailureMessage(outcome, nounFor(resource), operation === \"getOne\", configFor(resource).nounPlural),\n { code, cause: result.error },\n );\n await reportReadError(error, resource, operation);\n }\n\n // ---------------------------------------------------------------------------\n // Write helpers\n // ---------------------------------------------------------------------------\n\n const from = (resource: string) => client.from(resource) as SupabaseQueryBuilder;\n const configFor = (resource: string): SupabaseResourceConfig =>\n options.resources?.[resource] ?? {};\n const nounFor = (resource: string) => configFor(resource).noun ?? \"record\";\n\n function isBinTable(resource: string): boolean {\n const mode = configFor(resource).deleteMode;\n if (mode) return mode === \"bin\";\n const bin = options.binTables;\n if (!bin) return false;\n return typeof bin === \"function\" ? bin(resource) : bin.includes(resource);\n }\n\n /** Awaits a write-path query: its rows, or a `DataWriteError`. */\n async function run(query: SupabaseQueryBuilder): Promise<unknown[]> {\n let result: { data: unknown; error: unknown };\n try {\n result = (await query) as { data: unknown; error: unknown };\n } catch (error) {\n throw toDataWriteError(error);\n }\n if (result.error) throw toDataWriteError(result.error);\n if (Array.isArray(result.data)) return result.data;\n return result.data == null ? [] : [result.data];\n }\n\n async function isVisible(resource: string, id: Identifier): Promise<boolean> {\n return (await run(from(resource).select(\"id\").eq(\"id\", id))).length > 0;\n }\n\n async function readBack(resource: string, id: Identifier): Promise<BaseRecord | undefined> {\n return (await run(from(resource).select(\"*\").eq(\"id\", id)))[0] as BaseRecord | undefined;\n }\n\n function goneError(resource: string): DataWriteError {\n return new DataWriteError(\n \"gone\",\n `This ${nounFor(resource)} no longer exists, or you can no longer see it.`,\n );\n }\n\n /**\n * A write matched no rows: read the row back to say why. Still visible\n * means the change was refused; not visible means it is gone (deleted, or\n * hidden from this user — the two can't be told apart under RLS).\n */\n async function noRowsError(\n resource: string,\n id: Identifier,\n verb: \"change\" | \"delete\",\n ): Promise<DataWriteError> {\n let visible: boolean;\n try {\n visible = await isVisible(resource, id);\n } catch (error) {\n const cause = toDataWriteError(error);\n return new DataWriteError(\n cause.outcome === \"unauthenticated\" ? \"unauthenticated\" : \"error\",\n `This ${nounFor(resource)} was not ${verb === \"change\" ? \"changed\" : \"deleted\"}, and reading it back failed (${cause.message}).`,\n { code: cause.code, cause: error },\n );\n }\n if (visible) {\n return new DataWriteError(\"forbidden\", `You can't ${verb} this ${nounFor(resource)}.`);\n }\n return goneError(resource);\n }\n\n async function prepare(\n resource: string,\n values: Record<string, unknown>,\n context: SupabaseWriteContext,\n ): Promise<Record<string, unknown>> {\n const rule = configFor(resource).prepare;\n if (!rule) return values;\n try {\n return await rule({ ...values }, context);\n } catch (error) {\n throw toDataWriteError(error);\n }\n }\n\n /** After a committed write. Never turns it into a failure. */\n async function committed(event: WriteEvent): Promise<void> {\n if (!options.onWrite) return;\n try {\n await options.onWrite(event);\n } catch (error) {\n console.error(`[SupabaseProvider] onWrite failed for \"${event.resource}\":`, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // DataProvider implementation\n // ---------------------------------------------------------------------------\n\n const provider: DataProvider = {\n async getList(resource, params) {\n // Refused, not cut short: a shorter page than the caller asked for\n // would shift every later page's boundary and skip or repeat rows.\n if (params.pagination && params.pagination.perPage > maxPerPage) {\n const { perPage } = params.pagination;\n await reportReadError(\n new DataReadError(\n \"invalid\",\n readFailureMessage(\"invalid\", nounFor(resource), false, configFor(resource).nounPlural),\n {\n cause: new Error(\n `[SupabaseProvider] \"${resource}\" asked for ${perPage} rows per page; the most is ${maxPerPage} (maxPerPage). Ask for at most ${maxPerPage} and page through the rest.`,\n ),\n },\n ),\n resource,\n \"getList\",\n );\n }\n\n const configuredKey = configFor(resource).orderKey;\n const run = (key: string | false) => {\n let query = (client.from(resource) as SupabaseQueryBuilder).select(\n params.select ?? \"*\",\n { count: \"exact\" },\n );\n\n query = applyFilters(query, params.filters);\n\n // Search — convert to OR of ilike. A resource's configured\n // `searchFields` win over the caller's.\n const searchFields = configFor(resource).searchFields ?? params.search?.fields ?? [];\n if (params.search && params.search.query && searchFields.length > 0) {\n const escaped = escapeIlike(params.search.query);\n const safeFieldPattern = /^[a-zA-Z_][a-zA-Z0-9_.]*$/;\n const clauses = searchFields\n .filter((f) => safeFieldPattern.test(f))\n .map((f) => `${f}.ilike.%${escaped}%`)\n .join(\",\");\n if (clauses) {\n query = query.or(clauses);\n }\n }\n\n // Sort, then the key column, so equal sort values keep one order\n // across pages (otherwise a row can repeat on page 2 or be skipped).\n // An unsorted page is ordered by the key alone: without an ORDER BY\n // the database may return pages in any order.\n if (params.sort) {\n query = query.order(params.sort.field, {\n ascending: params.sort.order === \"asc\",\n });\n if (key && key !== params.sort.field) query = query.order(key, { ascending: true });\n } else if (params.pagination && key) {\n query = query.order(key, { ascending: true });\n }\n\n if (params.pagination) {\n const { page, perPage } = params.pagination;\n const from = (page - 1) * perPage;\n const to = from + perPage - 1;\n query = query.range(from, to);\n }\n\n return query as unknown as Promise<{\n data: unknown[];\n error: unknown;\n count?: number | null;\n }>;\n };\n\n // The default key (\"id\") is a guess: a view without that column reads\n // as before, without the key order, and is not ordered by it again.\n const guessKey = configuredKey === undefined && !keylessResources.has(resource);\n let result = await run(configuredKey ?? (keylessResources.has(resource) ? false : \"id\"));\n if (guessKey && isMissingColumn(result.error, resource, \"id\")) {\n keylessResources.add(resource);\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[SupabaseProvider] \"${resource}\" has no \"id\" column, so its pages have no stable order. Set resources.${resource}.orderKey to a unique column (or false to silence this).`,\n );\n }\n result = await run(false);\n }\n await throwIfReadError(result, resource, \"getList\");\n\n return { data: result.data ?? [], total: result.count ?? 0 } as never;\n },\n\n async getOne(resource, params) {\n const result = (await (client.from(resource) as SupabaseQueryBuilder)\n .select(params.select ?? \"*\")\n .eq(\"id\", params.id)\n .single()) as { data: unknown; error: unknown };\n await throwIfReadError(result, resource, \"getOne\");\n return { data: result.data } as never;\n },\n\n async getMany(resource, params) {\n if (params.ids.length === 0) return { data: [] } as never;\n const result = (await (client.from(resource) as SupabaseQueryBuilder)\n .select(\"*\")\n .in(\"id\", params.ids)) as { data: unknown[]; error: unknown };\n await throwIfReadError(result, resource, \"getMany\");\n return { data: result.data ?? [] } as never;\n },\n\n async capabilities(resource?: string): Promise<ProviderCapabilities> {\n return {\n search: resource ? configFor(resource).searchFields?.length !== 0 : true,\n sort: true,\n filterOperators: SERVED_OPERATORS,\n bulkWrites: false,\n versionedWrites: false,\n compositeKeys: false,\n multiSort: false,\n create: true,\n delete: true,\n maxPerPage,\n softDelete: resource ? isBinTable(resource) : false,\n };\n },\n\n async create(resource, params) {\n const row = await prepare(resource, params.data as Record<string, unknown>, {\n resource,\n action: \"create\",\n });\n const override = configFor(resource).create;\n let record: BaseRecord;\n if (override) {\n let returned: BaseRecord | Identifier;\n try {\n returned = await override(row);\n } catch (error) {\n throw toDataWriteError(error);\n }\n if (isIdentifier(returned)) {\n // The row exists from here on. A failed read-back must not report\n // the create as failed: the user would retry and make a second one.\n record = (await readBack(resource, returned).catch(() => undefined)) ?? { id: returned };\n } else if (returned && typeof returned === \"object\" && isIdentifier(returned.id)) {\n record = returned;\n } else {\n throw new DataWriteError(\n \"error\",\n `[SupabaseProvider] The create rule for \"${resource}\" returned neither the new row nor its id.`,\n );\n }\n } else {\n const rows = await run(from(resource).insert(row).select(\"*\").single());\n record = rows[0] as BaseRecord;\n }\n await committed({ resource, kind: \"create\", id: record.id, record });\n return { data: record } as never;\n },\n\n async update(resource, params) {\n const { id } = params;\n const row = await prepare(resource, params.data as Record<string, unknown>, {\n resource,\n action: \"update\",\n id,\n });\n const override = configFor(resource).update;\n let record: BaseRecord;\n if (override) {\n let returned: BaseRecord | Identifier | boolean | null | undefined | void;\n try {\n returned = await override(id, row);\n } catch (error) {\n throw toDataWriteError(error);\n }\n const result: unknown = returned;\n if (result == null || result === false) throw await noRowsError(resource, id, \"change\");\n if (isIdentifier(result) || result === true) {\n // The change committed; a failed read-back still reports it saved.\n const readId = result === true ? id : result;\n record = (await readBack(resource, readId).catch(() => undefined)) ?? { ...row, id: readId };\n } else if (typeof result === \"object\") {\n record = { id, ...(result as Record<string, unknown>) } as BaseRecord;\n } else {\n throw new DataWriteError(\n \"error\",\n `[SupabaseProvider] The update rule for \"${resource}\" returned neither the row, its id, nor nothing.`,\n );\n }\n } else {\n const rows = await run(from(resource).update(row).eq(\"id\", id).select(\"*\"));\n if (rows.length === 0) throw await noRowsError(resource, id, \"change\");\n record = rows[0] as BaseRecord;\n }\n await committed({ resource, kind: \"update\", id, record });\n return { data: record } as never;\n },\n\n async deleteOne(resource, params) {\n const { id } = params;\n let deletedId: Identifier = id;\n if (isBinTable(resource)) {\n // A binned delete reports zero rows whether or not it worked, so the\n // answer comes from visibility before and after.\n if (!(await isVisible(resource, id))) throw goneError(resource);\n await run(from(resource).delete().eq(\"id\", id));\n let stillVisible: boolean;\n try {\n stillVisible = await isVisible(resource, id);\n } catch (error) {\n const cause = toDataWriteError(error);\n throw new DataWriteError(\n \"error\",\n `The ${nounFor(resource)} may not have been deleted: checking it failed (${cause.message}).`,\n { code: cause.code, cause: error },\n );\n }\n if (stillVisible) {\n throw new DataWriteError(\"forbidden\", `You can't delete this ${nounFor(resource)}.`);\n }\n } else {\n const rows = await run(from(resource).delete().eq(\"id\", id).select(\"id\"));\n if (rows.length === 0) throw await noRowsError(resource, id, \"delete\");\n const returnedId = (rows[0] as { id?: unknown }).id;\n if (isIdentifier(returnedId)) deletedId = returnedId;\n }\n await committed({ resource, kind: \"delete\", id: deletedId });\n return { data: { id: deletedId } };\n },\n\n toFormValues(resource, record) {\n const map = configFor(resource).toFormValues;\n return map ? map(record) : record;\n },\n\n invalidates(event) {\n const keys = configFor(event.resource).invalidates;\n if (!keys) return [];\n return typeof keys === \"function\" ? keys(event) : keys;\n },\n };\n\n return provider;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/mutation-mode.ts"],"names":[],"mappings":"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","file":"chunk-F3BE7NGM.js","sourcesContent":["// ---------------------------------------------------------------------------\n// Mutation modes — when a write reaches the cache, and when the provider.\n//\n// - `pessimistic` (default): wait for the provider, then refetch. Today's\n// behaviour.\n// - `optimistic`: patch the TanStack Query cache at once, send the write, and\n// put the cache back (and report the error) if it fails.\n// - `undoable`: patch the cache at once and offer an undo (`onUndoable`);\n// the write is sent after a delay unless undone. A provider that serves\n// `undo` (capabilities `undo: true`) gets the write at once instead, and\n// the undo asks the provider to reverse it.\n//\n// Core has no UI: the undo toast is the caller's (`onUndoable`). genesis-ui's\n// ResourceForm and ResourcePage show a sonner toast.\n//\n// Pending writes belong to the QueryClient, not to the hook that started\n// them: a form that closes on success can still be undone from its toast.\n// ---------------------------------------------------------------------------\n\nimport type { QueryClient, QueryKey } from \"@tanstack/react-query\";\nimport type { BaseRecord, DataProvider, Identifier, ListResult } from \"../provider/types\";\nimport type { AuditEntry, ProviderCapabilities } from \"../schema/types\";\nimport { capabilitiesQueryKey } from \"./use-capabilities\";\n\nexport type MutationMode = \"pessimistic\" | \"optimistic\" | \"undoable\";\n\n/** How long an `undoable` write waits for an undo before it is sent. */\nexport const DEFAULT_UNDO_DELAY_MS = 5000;\n\n/** An undoable write, as handed to `onUndoable` so a UI can offer the undo. */\nexport interface UndoableWrite {\n resource: string;\n kind: \"create\" | \"update\" | \"delete\";\n /** The record's id; absent for a create (it has none until it is sent). */\n id?: Identifier;\n /**\n * - `delay`: the write has not been sent. `undo()` discards it; `commit()`\n * sends it now instead of waiting.\n * - `provider`: the write was sent at once, because the provider serves\n * `undo`. `undo()` asks the provider to reverse it; `commit()` does\n * nothing.\n */\n strategy: \"delay\" | \"provider\";\n /** How long the undo is offered, in ms (the toast's duration). */\n delayMs: number;\n /**\n * Take the write back. Resolves true when it was undone (or will never be\n * sent), false when it could not be: already sent under `delay` (the\n * window closed, it was committed, a later write on the same record sent\n * it first, or the page unloaded), already undone, or the provider's undo\n * failed (reported through `onError`). Works after the hook that made the\n * write has unmounted. Safe to call more than once.\n */\n undo: () => Promise<boolean>;\n /** Send a `delay` write now. */\n commit: () => void;\n}\n\nexport interface MutationModeOptions {\n /** Default `\"pessimistic\"`. */\n mutationMode?: MutationMode;\n /** How long an `undoable` write waits, in ms. Default 5000. */\n undoDelayMs?: number;\n /** Called with every `undoable` write, to show an undo control. */\n onUndoable?: (write: UndoableWrite) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Small helpers\n// ---------------------------------------------------------------------------\n\nfunction sameId(a: unknown, b: unknown): boolean {\n return a != null && b != null && String(a) === String(b);\n}\n\nfunction isListResult(value: unknown): value is ListResult<BaseRecord> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Array.isArray((value as { data?: unknown }).data)\n );\n}\n\nfunction isDetailKeyFor(key: QueryKey, resource: string, id: Identifier): boolean {\n return key[0] === resource && key[1] === \"detail\" && sameId(key[2], id);\n}\n\n/** Structural equality for row values (JSON-like data, Dates). */\nexport function sameValue(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a)) {\n const other = b as unknown[];\n return a.length === other.length && a.every((item, i) => sameValue(item, other[i]));\n }\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every(\n (k) => Object.prototype.hasOwnProperty.call(b, k) &&\n sameValue((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\n );\n}\n\nfunction asError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\n/** The record as the cache has it now, from a detail entry or any list. */\nexport function cachedRecord(\n queryClient: QueryClient,\n resource: string,\n id: Identifier,\n): BaseRecord | undefined {\n for (const [key, value] of queryClient.getQueriesData<unknown>({ queryKey: [resource, \"detail\"] })) {\n if (isDetailKeyFor(key, resource, id) && value && typeof value === \"object\") return value as BaseRecord;\n }\n for (const [, value] of queryClient.getQueriesData<unknown>({ queryKey: [resource, \"list\"] })) {\n if (!isListResult(value)) continue;\n const found = value.data.find((row) => sameId(row.id, id));\n if (found) return found;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// The registry — one per QueryClient\n//\n// Holds every optimistic/undoable write not yet settled, and the cache\n// patches they made. Patches are re-applied to any `[resource, \"list\" |\n// \"detail\", …]` data that arrives while they are pending (a refetch, a new\n// page, filter or search), so a deleted row stays gone and an edit stays\n// shown until the write settles. Because of that, refetching is always safe\n// and nothing waits for pending writes before invalidating.\n// ---------------------------------------------------------------------------\n\n/** One record's change, kept applied to the cache while its write is pending. */\ninterface Patch {\n resource: string;\n id: Identifier;\n kind: \"update\" | \"delete\";\n /** An update's values; the same object its write sends, so a rebase changes both. */\n data?: Record<string, unknown>;\n /** Per cache entry (query hash): the row just before this patch, and its list index. */\n before: Map<string, { row: BaseRecord; index: number }>;\n}\n\n/** One optimistic or undoable write that has not settled. */\ninterface Tracked {\n seq: number;\n queryClient: QueryClient;\n provider: DataProvider;\n resource: string;\n kind: \"create\" | \"update\" | \"delete\";\n /** `resource` + id: writes on the same record are sent in order. */\n rowKey?: string;\n patch?: Patch;\n /** Row-shaped values it will send (update); undefined when not row-shaped. */\n data?: Record<string, unknown>;\n /** The cached row just before this write's patch. */\n baseline?: BaseRecord;\n /**\n * - waiting: an undoable write in its delay\n * - queued: to be sent, behind earlier writes on the same record\n * - sending / done\n */\n state: \"waiting\" | \"queued\" | \"sending\" | \"done\";\n /** Sent with `keepalive` (because the page was unloading). */\n keepalive: boolean;\n /** Set when it was dropped because an earlier write it built on was taken back. */\n dropped: boolean;\n /** Send now: a waiting write skips its delay; `unloading` also skips the row queue. */\n flush: (unloading?: boolean) => void;\n /** Drop a waiting or queued write (see `dropped`). */\n drop: () => void;\n}\n\ninterface Registry {\n pending: Map<string, number>;\n patches: Patch[];\n writes: Tracked[];\n rowTails: Map<string, Promise<void>>;\n /** Cache data this module wrote, so the cache listener does not re-patch it. */\n produced: WeakSet<object>;\n /** True while this module is writing to the cache. */\n writing: boolean;\n unsubscribe?: () => void;\n}\n\nconst registries = new WeakMap<QueryClient, Registry>();\nlet nextSeq = 0;\n\nfunction registryFor(queryClient: QueryClient): Registry {\n let reg = registries.get(queryClient);\n if (!reg) {\n reg = {\n pending: new Map(),\n patches: [],\n writes: [],\n rowTails: new Map(),\n produced: new WeakSet(),\n writing: false,\n };\n registries.set(queryClient, reg);\n }\n return reg;\n}\n\n/** Optimistic or undoable writes on `resource` not yet settled. */\nexport function pendingWriteCount(queryClient: QueryClient, resource: string): number {\n return registries.get(queryClient)?.pending.get(resource) ?? 0;\n}\n\nfunction beginPending(reg: Registry, resource: string): void {\n reg.pending.set(resource, (reg.pending.get(resource) ?? 0) + 1);\n}\n\nfunction endPending(reg: Registry, resource: string): void {\n const left = Math.max(0, (reg.pending.get(resource) ?? 0) - 1);\n if (left === 0) reg.pending.delete(resource);\n else reg.pending.set(resource, left);\n}\n\n/**\n * Invalidate `[resource]`. Safe while optimistic/undoable writes on it are\n * pending: their patches are re-applied to whatever the refetch brings.\n */\nexport function invalidateResource(queryClient: QueryClient, resource: string): Promise<void> {\n return queryClient.invalidateQueries({ queryKey: [resource] });\n}\n\nfunction setProduced(reg: Registry, queryClient: QueryClient, key: QueryKey, value: unknown): void {\n const wasWriting = reg.writing;\n reg.writing = true;\n try {\n queryClient.setQueryData(key, value);\n } finally {\n reg.writing = wasWriting;\n }\n // Structural sharing may store a different object than `value`.\n const stored: unknown = queryClient.getQueryData(key);\n if (stored && typeof stored === \"object\") reg.produced.add(stored);\n}\n\nfunction applyUpdate(row: BaseRecord, data: Record<string, unknown>): BaseRecord {\n return { ...row, ...data, id: row.id };\n}\n\n/** `row` with `data`'s fields put back to what they were in `before`. */\nfunction revertFields(row: BaseRecord, data: Record<string, unknown>, before: BaseRecord): BaseRecord {\n const out: Record<string, unknown> = { ...row };\n for (const k of Object.keys(data)) {\n if (k === \"id\") continue;\n if (k in before) out[k] = before[k];\n else delete out[k];\n }\n return out as BaseRecord;\n}\n\n/**\n * Applies `patches`, in order, to one cache entry's data, recording each\n * patch's before-row for that entry. Returns the same object when nothing\n * applied.\n */\nfunction applyPatches(key: QueryKey, hash: string, value: unknown, patches: Patch[]): unknown {\n if (key[1] === \"list\" && isListResult(value)) {\n let rows = value.data;\n let total = value.total;\n let changed = false;\n for (const p of patches) {\n const index = rows.findIndex((row) => sameId(row.id, p.id));\n if (index < 0) continue;\n p.before.set(hash, { row: rows[index]!, index });\n if (p.kind === \"update\") {\n rows = rows.slice();\n rows[index] = applyUpdate(rows[index]!, p.data ?? {});\n } else {\n rows = rows.filter((_, i) => i !== index);\n if (typeof total === \"number\") total = Math.max(0, total - 1);\n }\n changed = true;\n }\n if (!changed) return value;\n return typeof total === \"number\" ? { ...value, data: rows, total } : { ...value, data: rows };\n }\n if (key[1] === \"detail\" && value && typeof value === \"object\") {\n let row = value as BaseRecord;\n let changed = false;\n for (const p of patches) {\n if (p.kind !== \"update\" || !sameId(key[2], p.id)) continue;\n p.before.set(hash, { row, index: -1 });\n row = applyUpdate(row, p.data ?? {});\n changed = true;\n }\n return changed ? row : value;\n }\n return value;\n}\n\n/** Re-applies pending patches to data that just landed in the cache. */\nfunction ensureListener(reg: Registry, queryClient: QueryClient): void {\n if (reg.unsubscribe) return;\n reg.unsubscribe = queryClient.getQueryCache().subscribe((event) => {\n if (reg.writing || event.type !== \"updated\" || event.action.type !== \"success\") return;\n const { queryKey: key, queryHash: hash } = event.query;\n const resource = key[0];\n if (typeof resource !== \"string\") return;\n const data: unknown = event.query.state.data;\n if (!data || typeof data !== \"object\" || reg.produced.has(data)) return;\n const patches = reg.patches.filter((p) => p.resource === resource);\n if (patches.length === 0) return;\n const next = applyPatches(key, hash, data, patches);\n if (next !== data) setProduced(reg, queryClient, key, next);\n });\n}\n\nfunction addPatch(reg: Registry, queryClient: QueryClient, patch: Patch): void {\n reg.patches.push(patch);\n ensureListener(reg, queryClient);\n for (const query of queryClient.getQueryCache().findAll({ queryKey: [patch.resource] })) {\n const value: unknown = query.state.data;\n const next = applyPatches(query.queryKey, query.queryHash, value, [patch]);\n if (next !== value) setProduced(reg, queryClient, query.queryKey, next);\n }\n}\n\nfunction dropPatchRecord(reg: Registry, patch: Patch): number {\n const index = reg.patches.indexOf(patch);\n if (index >= 0) reg.patches.splice(index, 1);\n if (reg.patches.length === 0 && reg.unsubscribe) {\n reg.unsubscribe();\n reg.unsubscribe = undefined;\n }\n return index;\n}\n\nfunction firstBefore(patch: Patch): { row: BaseRecord; index: number } | undefined {\n for (const value of patch.before.values()) return value;\n return undefined;\n}\n\n/**\n * Takes a patch back out of the cache, keeping every other pending patch on\n * the same record applied (field by field, not by restoring a whole saved\n * row).\n */\nfunction retractPatch(reg: Registry, queryClient: QueryClient, patch: Patch): void {\n const index = dropPatchRecord(reg, patch);\n if (index < 0) return;\n const onRow = (p: Patch) => p.resource === patch.resource && sameId(p.id, patch.id);\n const remaining = reg.patches.filter(onRow);\n\n // Later patches on the record recorded their before-rows on top of this\n // one: take its values out of them too.\n if (patch.kind === \"update\" && patch.data) {\n for (const later of reg.patches.slice(index).filter(onRow)) {\n for (const [hash, b] of later.before) {\n const src = patch.before.get(hash) ?? firstBefore(patch);\n if (src) later.before.set(hash, { ...b, row: revertFields(b.row, patch.data, src.row) });\n }\n }\n }\n\n const reapply = (row: BaseRecord) =>\n remaining.reduce((r, p) => (p.kind === \"update\" ? applyUpdate(r, p.data ?? {}) : r), row);\n\n for (const query of queryClient.getQueryCache().findAll({ queryKey: [patch.resource] })) {\n const key = query.queryKey;\n const value: unknown = query.state.data;\n const b = patch.before.get(query.queryHash);\n let next: unknown = value;\n if (key[1] === \"list\" && isListResult(value)) {\n const at = value.data.findIndex((row) => sameId(row.id, patch.id));\n if (patch.kind === \"update\") {\n const src = b ?? firstBefore(patch);\n if (at < 0 || !src || !patch.data) continue;\n const rows = value.data.slice();\n rows[at] = reapply(revertFields(rows[at]!, patch.data, src.row));\n next = { ...value, data: rows };\n } else {\n // A delete puts the row back where it was, unless a later delete of\n // the same record still hides it.\n if (at >= 0 || !b || remaining.some((p) => p.kind === \"delete\")) continue;\n const rows = value.data.slice();\n rows.splice(Math.min(b.index, rows.length), 0, reapply(b.row));\n next = {\n ...value,\n data: rows,\n ...(typeof value.total === \"number\" ? { total: value.total + 1 } : {}),\n };\n }\n } else if (\n key[1] === \"detail\" &&\n patch.kind === \"update\" &&\n patch.data &&\n sameId(key[2], patch.id) &&\n value &&\n typeof value === \"object\"\n ) {\n const src = b ?? firstBefore(patch);\n if (!src) continue;\n next = reapply(revertFields(value as BaseRecord, patch.data, src.row));\n }\n if (next !== value) setProduced(reg, queryClient, key, next);\n }\n}\n\n/**\n * A write was taken back (undone, or it failed): retract its patch, and fix\n * the later writes on the same record that have not been sent. A later\n * update that kept this write's values unchanged (its form opened from the\n * patched cache) gets them put back to what they were before; one whose\n * values are not row-shaped cannot be fixed, so it is dropped.\n */\nfunction takeBack(reg: Registry, write: Tracked): void {\n if (write.patch) retractPatch(reg, write.queryClient, write.patch);\n if (!write.rowKey || write.kind !== \"update\" || !write.patch?.data) return;\n const undone = write.patch.data;\n const before = write.baseline ?? firstBefore(write.patch)?.row ?? ({} as BaseRecord);\n const later = reg.writes.filter(\n (w) =>\n w.seq > write.seq &&\n w.rowKey === write.rowKey &&\n w.kind === \"update\" &&\n (w.state === \"waiting\" || w.state === \"queued\"),\n );\n for (const w of later) {\n if (!w.data) {\n w.drop();\n continue;\n }\n const rebased: Record<string, unknown> = {};\n const removed: string[] = [];\n for (const k of Object.keys(undone)) {\n if (k === \"id\" || !(k in w.data)) continue;\n const kept = sameValue(w.data[k], undone[k]) && w.baseline != null && sameValue(w.baseline[k], undone[k]);\n if (!kept) continue;\n if (k in before) rebased[k] = before[k];\n else removed.push(k);\n }\n if (Object.keys(rebased).length === 0 && removed.length === 0) continue;\n // w.data is also w.patch.data: rebase it in place, then show it.\n Object.assign(w.data, rebased);\n for (const k of removed) delete w.data[k];\n if (w.baseline) w.baseline = revertFields(w.baseline, undone, before);\n if (w.patch) refreshFields(reg, w.queryClient, w.patch, [...Object.keys(rebased), ...removed]);\n }\n}\n\n/**\n * After a patch's values changed in place: shows its new values for `keys`\n * in every cached copy of the record, except where a later patch on the\n * record sets the same field.\n */\nfunction refreshFields(reg: Registry, queryClient: QueryClient, patch: Patch, keys: string[]): void {\n const index = reg.patches.indexOf(patch);\n if (index < 0 || !patch.data) return;\n const data = patch.data;\n const overridden = new Set<string>();\n for (const p of reg.patches.slice(index + 1)) {\n if (p.resource === patch.resource && sameId(p.id, patch.id) && p.data) {\n for (const k of Object.keys(p.data)) overridden.add(k);\n }\n }\n const fields = keys.filter((k) => !overridden.has(k));\n if (fields.length === 0) return;\n const fix = (row: BaseRecord, hash: string): BaseRecord => {\n const out: Record<string, unknown> = { ...row };\n const before = (patch.before.get(hash) ?? firstBefore(patch))?.row;\n for (const k of fields) {\n if (k in data) out[k] = data[k];\n else if (before && k in before) out[k] = before[k];\n else delete out[k];\n }\n return out as BaseRecord;\n };\n for (const query of queryClient.getQueryCache().findAll({ queryKey: [patch.resource] })) {\n const key = query.queryKey;\n const value: unknown = query.state.data;\n let next: unknown = value;\n if (key[1] === \"list\" && isListResult(value)) {\n const at = value.data.findIndex((row) => sameId(row.id, patch.id));\n if (at < 0) continue;\n const rows = value.data.slice();\n rows[at] = fix(rows[at]!, query.queryHash);\n next = { ...value, data: rows };\n } else if (key[1] === \"detail\" && sameId(key[2], patch.id) && value && typeof value === \"object\") {\n next = fix(value as BaseRecord, query.queryHash);\n }\n if (next !== value) setProduced(reg, queryClient, key, next);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Page unload\n//\n// Waiting writes are sent when the page goes away (`beforeunload`, and\n// `pagehide` for mobile tab kills and bfcache), with `keepalive: true` in\n// their params so a fetch-based provider can let them outlive the page. The\n// \"Leave site?\" prompt shows only while a write is being sent without that\n// guarantee: its provider does not report `keepaliveWrites`, or it was\n// already on its way without keepalive.\n// ---------------------------------------------------------------------------\n\nconst allWrites = new Set<Tracked>();\n\nfunction servesKeepalive(write: Tracked): boolean {\n const caps = write.queryClient.getQueryData<ProviderCapabilities>(\n capabilitiesQueryKey(write.provider, write.resource),\n );\n return caps?.keepaliveWrites === true;\n}\n\nfunction flushForUnload(): void {\n const writes = [...allWrites].sort((a, b) => a.seq - b.seq);\n for (const write of writes) {\n if (write.state === \"waiting\" || write.state === \"queued\") write.flush(true);\n }\n}\n\nfunction onBeforeUnload(event: BeforeUnloadEvent): void {\n flushForUnload();\n const atRisk = [...allWrites].some((w) => w.state === \"sending\" && !(w.keepalive && servesKeepalive(w)));\n if (!atRisk) return;\n event.preventDefault();\n // Older browsers need returnValue set to show the prompt.\n event.returnValue = \"\";\n}\n\nfunction onPageHide(): void {\n flushForUnload();\n}\n\nfunction track(write: Tracked): void {\n allWrites.add(write);\n if (allWrites.size === 1 && typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", onBeforeUnload);\n window.addEventListener(\"pagehide\", onPageHide);\n }\n}\n\nfunction untrack(write: Tracked): void {\n if (!allWrites.delete(write)) return;\n if (allWrites.size === 0 && typeof window !== \"undefined\") {\n window.removeEventListener(\"beforeunload\", onBeforeUnload);\n window.removeEventListener(\"pagehide\", onPageHide);\n }\n}\n\n// ---------------------------------------------------------------------------\n// The engine\n// ---------------------------------------------------------------------------\n\n/** What `send` is given when the write goes out. */\nexport interface SendContext {\n /**\n * The row-shaped values to send, when `data` was given. They can differ\n * from `data`: an earlier write on the record that this one built on was\n * taken back, and its values were put back. Send these.\n */\n data?: Record<string, unknown>;\n /** The page is unloading: pass `keepalive: true` to the provider. */\n keepalive: boolean;\n}\n\nexport interface ExecuteWriteArgs<R extends BaseRecord | void> {\n queryClient: QueryClient;\n provider: DataProvider;\n resource: string;\n kind: \"create\" | \"update\" | \"delete\";\n id?: Identifier;\n /**\n * The values to merge into the cached row (update). Leave out to patch\n * nothing, e.g. when the values are form-shaped and the row is not.\n */\n data?: Record<string, unknown>;\n mode: MutationMode;\n undoDelayMs?: number;\n onUndoable?: (write: UndoableWrite) => void;\n /** Sends the write. */\n send: (context: SendContext) => Promise<{ record: R; audit?: AuditEntry }>;\n /** After the write committed. Invalidates and calls success callbacks. */\n committed: (record: R) => Promise<void> | void;\n /** A write that failed (or was dropped) after the caller was told it went through. */\n failedLater: (error: Error) => void;\n}\n\nexport type ExecuteWriteResult<R> =\n | { status: \"committed\"; record: R }\n | { status: \"applied\" };\n\nconst CAPABILITIES_QUERY = (provider: DataProvider, resource: string) => ({\n // The same key as useCapabilities, so the answer is shared.\n queryKey: capabilitiesQueryKey(provider, resource),\n queryFn: () => provider.capabilities!(resource),\n staleTime: Infinity,\n // A write may wait on this answer; an app's default retries would hold\n // it for seconds.\n retry: false as const,\n});\n\n/**\n * Whether `provider` serves `undo` for `resource`, from its capabilities\n * (useCapabilities' key, so the answer is shared, and scoped to this\n * provider: a swapped-out provider's capabilities never offer undo).\n * @internal Exported for tests.\n */\nexport async function providerServesUndo(\n queryClient: QueryClient,\n provider: DataProvider,\n resource: string,\n): Promise<boolean> {\n if (!provider.undo || !provider.capabilities) return false;\n try {\n const caps = await queryClient.fetchQuery<ProviderCapabilities>(CAPABILITIES_QUERY(provider, resource));\n return caps?.undo === true;\n } catch {\n return false;\n }\n}\n\n/** A later write that built on one that was taken back. */\nexport const DROPPED_WRITE_MESSAGE =\n \"This change was not saved: it was made on top of an earlier change that was undone or failed. Please make it again.\";\n\n/**\n * Runs one write in the given mode.\n *\n * - `pessimistic`: sends it and waits; a failure rejects.\n * - `optimistic` / `undoable`: resolves `{ status: \"applied\" }` as soon as\n * the cache is patched. A later failure rolls the patch back and goes to\n * `failedLater`, never to the returned promise.\n *\n * Writes on the same record are sent one after another, in the order they\n * were made; sending one first sends the earlier ones still waiting.\n */\nexport async function executeWrite<R extends BaseRecord | void>(\n args: ExecuteWriteArgs<R>,\n): Promise<ExecuteWriteResult<R>> {\n const { queryClient, provider, resource, kind, id, mode, send, committed, failedLater } = args;\n\n if (mode === \"pessimistic\") {\n const { record } = await send({ data: args.data, keepalive: false });\n await committed(record);\n return { status: \"committed\", record };\n }\n\n const viaProviderUndo = mode === \"undoable\" && (await providerServesUndo(queryClient, provider, resource));\n // Warm the capabilities answer, so the unload handler can tell (without\n // waiting) whether this provider keeps writes alive.\n if (provider.capabilities && !queryClient.getQueryData(capabilitiesQueryKey(provider, resource))) {\n void queryClient.prefetchQuery(CAPABILITIES_QUERY(provider, resource));\n }\n\n const reg = registryFor(queryClient);\n const hasRow = kind !== \"create\" && id != null;\n const data = args.data ? { ...args.data } : undefined;\n let patch: Patch | undefined;\n if (hasRow && kind === \"update\" && data) patch = { resource, id: id!, kind: \"update\", data, before: new Map() };\n else if (hasRow && kind === \"delete\") patch = { resource, id: id!, kind: \"delete\", before: new Map() };\n // A create has no cache entry yet: its id and its place in each sorted,\n // filtered list are the server's to say.\n\n const delayMs = Math.max(0, args.undoDelayMs ?? DEFAULT_UNDO_DELAY_MS);\n let timer: ReturnType<typeof setTimeout> | undefined;\n let resolveSent: (result: { record: R; audit?: AuditEntry } | undefined) => void = () => {};\n const sent = new Promise<{ record: R; audit?: AuditEntry } | undefined>((resolve) => {\n resolveSent = resolve;\n });\n\n const write: Tracked = {\n seq: ++nextSeq,\n queryClient,\n provider,\n resource,\n kind,\n rowKey: hasRow ? `${resource}\\u0000${String(id)}` : undefined,\n patch,\n data: kind === \"update\" ? data : undefined,\n baseline: hasRow ? cachedRecord(queryClient, resource, id!) : undefined,\n state: \"queued\",\n keepalive: false,\n dropped: false,\n flush: () => {},\n drop: () => {},\n };\n\n const settle = () => {\n write.state = \"done\";\n clearTimeout(timer);\n const at = reg.writes.indexOf(write);\n if (at >= 0) reg.writes.splice(at, 1);\n untrack(write);\n endPending(reg, resource);\n };\n\n const sendNow = async (keepalive: boolean): Promise<void> => {\n if (write.state !== \"queued\") return;\n write.state = \"sending\";\n write.keepalive = keepalive;\n let result: { record: R; audit?: AuditEntry };\n try {\n result = await send({ data: write.data, keepalive });\n } catch (error) {\n settle();\n takeBack(reg, write);\n void invalidateResource(queryClient, resource);\n failedLater(asError(error));\n resolveSent(undefined);\n return;\n }\n // The server has it now; the refetch `committed` starts replaces the patch.\n if (patch) dropPatchRecord(reg, patch);\n settle();\n try {\n await committed(result.record);\n } catch (error) {\n // The write did commit; only a callback failed.\n console.error(`[genesis] after-write callback failed for \"${resource}\":`, error);\n }\n resolveSent(result);\n };\n\n const enqueue = () => {\n if (!write.rowKey) {\n void sendNow(false);\n return;\n }\n const key = write.rowKey;\n const previous = reg.rowTails.get(key);\n const run = () => sendNow(false);\n const next = previous ? previous.then(run, run) : run();\n reg.rowTails.set(key, next);\n void next.finally(() => {\n if (reg.rowTails.get(key) === next) reg.rowTails.delete(key);\n });\n };\n\n write.flush = (unloading = false) => {\n if (write.state === \"waiting\") {\n clearTimeout(timer);\n // Earlier writes on the record go first, so the server sees them in order.\n if (!unloading) {\n for (const earlier of reg.writes) {\n if (earlier.seq < write.seq && earlier.rowKey === write.rowKey && earlier.rowKey && earlier.state === \"waiting\") {\n earlier.flush();\n }\n }\n }\n write.state = \"queued\";\n if (unloading) void sendNow(true);\n else enqueue();\n } else if (write.state === \"queued\" && unloading) {\n // Behind an earlier write on the record; the page will not wait for it.\n void sendNow(true);\n }\n };\n\n write.drop = () => {\n if (write.state !== \"waiting\" && write.state !== \"queued\") return;\n write.dropped = true;\n settle();\n takeBack(reg, write);\n void invalidateResource(queryClient, resource);\n failedLater(new Error(DROPPED_WRITE_MESSAGE));\n resolveSent(undefined);\n };\n\n beginPending(reg, resource);\n reg.writes.push(write);\n track(write);\n if (patch) addPatch(reg, queryClient, patch);\n\n if (mode === \"optimistic\") {\n enqueue();\n return { status: \"applied\" };\n }\n\n if (viaProviderUndo) {\n enqueue();\n void sent.then((result) => {\n const auditId = result?.audit?.id;\n if (!result || !args.onUndoable) return;\n if (!auditId) {\n console.warn(\n `[genesis] \"${resource}\" serves undo, but its ${kind} returned no audit entry; no undo offered.`,\n );\n return;\n }\n let undone = false;\n args.onUndoable({\n resource,\n kind,\n id: id ?? (result.record as BaseRecord | undefined)?.id,\n strategy: \"provider\",\n delayMs,\n commit: () => {},\n undo: async () => {\n if (undone) return false;\n undone = true;\n let ok = true;\n try {\n await provider.undo!(resource, { auditId });\n } catch (error) {\n ok = false;\n failedLater(asError(error));\n }\n await invalidateResource(queryClient, resource);\n return ok;\n },\n });\n });\n return { status: \"applied\" };\n }\n\n // Delayed: wait, then send unless undone or flushed first.\n write.state = \"waiting\";\n timer = setTimeout(() => write.flush(), delayMs);\n\n args.onUndoable?.({\n resource,\n kind,\n id,\n strategy: \"delay\",\n delayMs,\n commit: () => write.flush(),\n undo: async () => {\n if (write.dropped) return true;\n if (write.state !== \"waiting\") return false;\n settle();\n takeBack(reg, write);\n void invalidateResource(queryClient, resource);\n resolveSent(undefined);\n return true;\n },\n });\n\n return { status: \"applied\" };\n}\n"]}
|
package/dist/chunk-HT43MPKW.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-one.ts"],"names":[],"mappings":";;;AAyBO,SAAS,MAAA,CACd,QAAA,EACA,EAAA,EACA,OAAA,GAAyB,EAAC,EACP;AACnB,EAAA,MAAM,WAAW,eAAA,EAAgB;AAEjC,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,OAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,OAAA,IAAW,CAAC,CAAC,EAAA;AAE/B,EAAA,OAAO,QAAA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASjB,QAAA,EAAU,CAAC,QAAA,EAAU,QAAA,EAAU,IAAI,MAAM,CAAA;AAAA,IACzC,SAAS,YAAY;AACnB,MAAA,IAAI,EAAA,IAAM,IAAA,EAAM,MAAM,IAAI,MAAM,YAAY,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAU,UAAU,EAAE,EAAA,EAAI,QAAQ,CAAA;AAChE,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACV,CAAA;AACH","file":"chunk-ZK5C3OOT.js","sourcesContent":["import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useDataProvider } from \"../provider/context\";\nimport type { BaseRecord, Identifier } from \"../provider/types\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface UseOneOptions {\n /** Supabase select/join syntax, e.g. \"*, author:profiles(name)\". */\n select?: string;\n /** Defaults to `!!id` — won't fetch when id is falsy. */\n enabled?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Fetch a single record by id, powered by TanStack Query.\n *\n * Returns the full `UseQueryResult<T>` with the data unwrapped from the\n * provider's `GetOneResult` wrapper.\n */\nexport function useOne<T extends BaseRecord = BaseRecord>(\n resource: string,\n id: Identifier | undefined | null,\n options: UseOneOptions = {},\n): UseQueryResult<T> {\n const provider = useDataProvider();\n\n const { select, enabled } = options;\n const isEnabled = enabled ?? !!id;\n\n return useQuery<T>({\n // `select` is part of the key because it is part of the REQUEST: two pages\n // asking for the same record with different projections get different\n // rows back, and keying only on the id makes them share one cache entry.\n // Whichever mounted first wins for the whole staleTime window, and the\n // other silently renders a record missing the joined fields it asked for\n // — no error, no refetch, just absent data. `useResource`'s list key has\n // always included `select` (it keys on the whole `params` object); this\n // was the one place it did not.\n queryKey: [resource, \"detail\", id, select],\n queryFn: async () => {\n if (id == null) throw new Error(\"Missing id\");\n const result = await provider.getOne<T>(resource, { id, select });\n return result.data;\n },\n enabled: isEnabled,\n });\n}\n"]}
|