grist-widget-sdk 0.3.26 → 0.4.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/CHANGELOG.md +53 -0
- package/README.md +1 -1
- package/dist/app.cjs +1139 -4336
- package/dist/app.cjs.map +1 -1
- package/dist/app.d.cts +1 -3
- package/dist/app.d.ts +1 -3
- package/dist/app.js +9 -517
- package/dist/app.js.map +1 -1
- package/dist/chunk-4ZGVKGDF.js +204 -0
- package/dist/chunk-4ZGVKGDF.js.map +1 -0
- package/dist/{chunk-YQNMIL33.js → chunk-B5ZZNLVS.js} +528 -181
- package/dist/chunk-B5ZZNLVS.js.map +1 -0
- package/dist/chunk-O7NY46QY.js +1830 -0
- package/dist/chunk-O7NY46QY.js.map +1 -0
- package/dist/chunk-P6VTEKWO.js +618 -0
- package/dist/chunk-P6VTEKWO.js.map +1 -0
- package/dist/emulator/testing.cjs +2084 -391
- package/dist/emulator/testing.cjs.map +1 -1
- package/dist/emulator/testing.d.cts +55 -7
- package/dist/emulator/testing.d.ts +55 -7
- package/dist/emulator/testing.js +144 -19
- package/dist/emulator/testing.js.map +1 -1
- package/dist/emulator.cjs +59 -249
- package/dist/emulator.cjs.map +1 -1
- package/dist/emulator.d.cts +3 -5
- package/dist/emulator.d.ts +3 -5
- package/dist/emulator.js +5 -11
- package/dist/index.cjs +1373 -4859
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +81 -260
- package/dist/index.d.ts +81 -260
- package/dist/index.js +8 -161
- package/dist/{inline-C7DkvuET.d.cts → templates-CGmRIQBV.d.cts} +89 -35
- package/dist/{inline-DpcT8tV9.d.ts → templates-Cq94qOcf.d.ts} +89 -35
- package/dist/{types-D3JxUCfL.d.cts → types-DBStn0Dk.d.cts} +2 -26
- package/dist/{types-D3JxUCfL.d.ts → types-DBStn0Dk.d.ts} +2 -26
- package/dist/use-grist-BK0eke9K.d.cts +358 -0
- package/dist/use-grist-C5DMZ3wU.d.ts +358 -0
- package/package.json +8 -37
- package/dist/advanced.cjs +0 -2799
- package/dist/advanced.cjs.map +0 -1
- package/dist/advanced.d.cts +0 -822
- package/dist/advanced.d.ts +0 -822
- package/dist/advanced.js +0 -875
- package/dist/advanced.js.map +0 -1
- package/dist/chunk-22U7WAY3.js +0 -463
- package/dist/chunk-22U7WAY3.js.map +0 -1
- package/dist/chunk-64SVRWW7.js +0 -758
- package/dist/chunk-64SVRWW7.js.map +0 -1
- package/dist/chunk-ELGVOHFD.js +0 -32
- package/dist/chunk-ELGVOHFD.js.map +0 -1
- package/dist/chunk-EPEBKXVN.js +0 -470
- package/dist/chunk-EPEBKXVN.js.map +0 -1
- package/dist/chunk-GTTD5HPO.js +0 -36
- package/dist/chunk-GTTD5HPO.js.map +0 -1
- package/dist/chunk-JASMM2YC.js +0 -243
- package/dist/chunk-JASMM2YC.js.map +0 -1
- package/dist/chunk-N3X46JW2.js +0 -37
- package/dist/chunk-N3X46JW2.js.map +0 -1
- package/dist/chunk-PDGEZ24B.js +0 -2366
- package/dist/chunk-PDGEZ24B.js.map +0 -1
- package/dist/chunk-PM3B4WYV.js +0 -12
- package/dist/chunk-PM3B4WYV.js.map +0 -1
- package/dist/chunk-REV5AUXD.js +0 -25
- package/dist/chunk-REV5AUXD.js.map +0 -1
- package/dist/chunk-TZB3OZA6.js +0 -1630
- package/dist/chunk-TZB3OZA6.js.map +0 -1
- package/dist/chunk-YQNMIL33.js.map +0 -1
- package/dist/create-grist-emulator-BCqp1BF9.d.ts +0 -81
- package/dist/create-grist-emulator-DBM8OSIR.d.cts +0 -81
- package/dist/emulator/devtools.cjs +0 -1404
- package/dist/emulator/devtools.cjs.map +0 -1
- package/dist/emulator/devtools.d.cts +0 -48
- package/dist/emulator/devtools.d.ts +0 -48
- package/dist/emulator/devtools.js +0 -508
- package/dist/emulator/devtools.js.map +0 -1
- package/dist/emulator/transports.cjs +0 -1132
- package/dist/emulator/transports.cjs.map +0 -1
- package/dist/emulator/transports.d.cts +0 -38
- package/dist/emulator/transports.d.ts +0 -38
- package/dist/emulator/transports.js +0 -12
- package/dist/emulator/transports.js.map +0 -1
- package/dist/templates-8k2LKoO-.d.cts +0 -24
- package/dist/templates-DIwi_mvI.d.ts +0 -24
- package/dist/use-grist-reads-DUMvJgV7.d.ts +0 -480
- package/dist/use-grist-reads-DpjVuI0H.d.cts +0 -480
- package/dist/use-grist-types-DdOLEJXN.d.cts +0 -499
- package/dist/use-grist-types-kwxoFeub.d.ts +0 -499
- package/dist/use-grist-widget-options-from-context-CGOlQ5Vc.d.cts +0 -43
- package/dist/use-grist-widget-options-from-context-CGOlQ5Vc.d.ts +0 -43
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sdk/helpers/grist-value-codec.ts","../src/sdk/helpers/grist-widget-options.ts","../src/sdk/helpers/grist-safe-parse.ts","../src/sdk/helpers/grist-user-actions.ts"],"sourcesContent":["/**\n * Encoding helpers for Grist cell values.\n *\n * Grist sends some types as marshalled tuples or numeric epochs. This file\n * exposes pure decode/encode functions so widget code never has to spelunk\n * Grist's wire format.\n *\n * References: Grist `grist/RowRecord` and `grist/DocActions` typings.\n */\n\nimport type { GristReplicaColumn } from \"../types\"\n\n/** `[\"E\", \"ErrorClass\", \"message\", traceback?]` — Grist error sentinel. */\nexport type GristEncodedError = [\"E\", string, string?, string?]\n/** `[\"L\", ...items]` — list (used for ChoiceList, RefList, Attachments). */\nexport type GristEncodedList = [\"L\", ...unknown[]]\n/** `[\"D\", epochSeconds, \"tz/Name\"]` — DateTime with timezone. */\nexport type GristEncodedDateTime = [\"D\", number, string]\n/** `[\"d\", epochSeconds]` — Date (no time). */\nexport type GristEncodedDate = [\"d\", number]\n/** `[\"R\", tableId, rowId]` — explicit reference. */\nexport type GristEncodedRef = [\"R\", string, number]\n/** `[\"r\", rowId]` — bare reference (when table is contextual). */\nexport type GristEncodedBareRef = [\"r\", number]\n/** `[\"P\", encoded]` — pending marker. */\nexport type GristEncodedPending = [\"P\"]\n\nexport type GristDecodedValue =\n | null\n | string\n | number\n | boolean\n | Date\n | GristDecodedValue[]\n | { __error: true; type: string; message?: string; traceback?: string }\n | { __ref: true; tableId?: string; rowId: number }\n\nconst MARSHALLED_TAGS = new Set([\"E\", \"L\", \"D\", \"d\", \"R\", \"r\", \"P\"])\n\nfunction isMarshalledTuple(value: unknown): value is unknown[] {\n return (\n Array.isArray(value) &&\n typeof value[0] === \"string\" &&\n value[0].length <= 2 &&\n MARSHALLED_TAGS.has(value[0])\n )\n}\n\n/**\n * Normalises a Grist `fetchTable` cell that points at a row in another table.\n * Most payloads use a bare numeric row id, but `Ref:*` values may appear as\n * `[\"R\", tableId, rowId]` or `[\"r\", rowId]` (same shape as {@link decodeGristValue}).\n */\nexport function coerceGristDocApiRefRowId(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value\n if (!Array.isArray(value) || value.length < 2) return undefined\n const tag = value[0]\n if (tag === \"R\" && typeof value[2] === \"number\" && Number.isFinite(value[2])) return value[2]\n if (tag === \"r\" && typeof value[1] === \"number\" && Number.isFinite(value[1])) return value[1]\n return undefined\n}\n\nfunction looksLikeAttachmentColumn(column?: GristReplicaColumn): boolean {\n return column?.type === \"Attachments\"\n}\n\nfunction looksLikeChoiceListColumn(column?: GristReplicaColumn): boolean {\n return column?.type === \"ChoiceList\"\n}\n\nfunction looksLikeRefListColumn(column?: GristReplicaColumn): boolean {\n return typeof column?.type === \"string\" && column.type.startsWith(\"RefList:\")\n}\n\nfunction looksLikeRefColumn(column?: GristReplicaColumn): boolean {\n return typeof column?.type === \"string\" && column.type.startsWith(\"Ref:\")\n}\n\nfunction looksLikeDateColumn(column?: GristReplicaColumn): boolean {\n return column?.type === \"Date\"\n}\n\nfunction looksLikeDateTimeColumn(column?: GristReplicaColumn): boolean {\n return typeof column?.type === \"string\" && column.type.startsWith(\"DateTime\")\n}\n\n/**\n * Decodes a Grist cell value into an idiomatic JS value.\n *\n * Pass the column's metadata (from `useGristSchema` or `_grist_Tables_column`)\n * for type-aware decoding (e.g. `Date` columns return `Date` even when stored as a number).\n */\nexport function decodeGristValue(value: unknown, column?: GristReplicaColumn): GristDecodedValue {\n if (value === null || value === undefined) return null\n\n if (isMarshalledTuple(value)) {\n const tag = value[0] as string\n switch (tag) {\n case \"E\":\n return {\n __error: true,\n type: typeof value[1] === \"string\" ? value[1] : \"Error\",\n message: typeof value[2] === \"string\" ? value[2] : undefined,\n traceback: typeof value[3] === \"string\" ? value[3] : undefined,\n }\n case \"L\":\n return value.slice(1).map((v) => decodeGristValue(v, undefined)) as GristDecodedValue[]\n case \"D\":\n if (typeof value[1] === \"number\") return new Date(value[1] * 1000)\n return null\n case \"d\":\n if (typeof value[1] === \"number\") return new Date(value[1] * 1000)\n return null\n case \"R\":\n return {\n __ref: true,\n tableId: typeof value[1] === \"string\" ? value[1] : undefined,\n rowId: typeof value[2] === \"number\" ? value[2] : 0,\n }\n case \"r\":\n return { __ref: true, rowId: typeof value[1] === \"number\" ? value[1] : 0 }\n case \"P\":\n return null\n default:\n return null\n }\n }\n\n if (looksLikeDateColumn(column) || looksLikeDateTimeColumn(column)) {\n if (typeof value === \"number\" && Number.isFinite(value)) return new Date(value * 1000)\n }\n\n if (looksLikeRefColumn(column) && typeof value === \"number\") {\n return { __ref: true, rowId: value }\n }\n\n if ((looksLikeRefListColumn(column) || looksLikeChoiceListColumn(column) || looksLikeAttachmentColumn(column)) && Array.isArray(value)) {\n return value.map((v) => decodeGristValue(v, undefined)) as GristDecodedValue[]\n }\n\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") return value\n if (Array.isArray(value)) return value.map((v) => decodeGristValue(v, undefined)) as GristDecodedValue[]\n return null\n}\n\n/** Convenience: true when the cell is a Grist error sentinel. */\nexport function isGristCellError(value: unknown): value is GristEncodedError {\n return Array.isArray(value) && value[0] === \"E\"\n}\n\n/**\n * Encodes a JS value into Grist's expected wire form for a given column type.\n *\n * Use before passing values to `applyUserActions` or `TableOperations.update`\n * for `Date`, `DateTime`, `Ref`, `RefList`, and `ChoiceList` columns.\n */\nexport function encodeGristValue(value: unknown, column?: GristReplicaColumn): unknown {\n if (value === null || value === undefined) return null\n\n if (looksLikeDateColumn(column) || looksLikeDateTimeColumn(column)) {\n if (value instanceof Date) return Math.floor(value.getTime() / 1000)\n if (typeof value === \"string\") {\n const parsed = Date.parse(value)\n if (!Number.isNaN(parsed)) return Math.floor(parsed / 1000)\n }\n if (typeof value === \"number\") return Math.floor(value)\n }\n\n if (looksLikeRefColumn(column)) {\n if (typeof value === \"number\") return value\n if (value && typeof value === \"object\" && \"rowId\" in value) {\n return (value as { rowId: number }).rowId\n }\n }\n\n if (looksLikeRefListColumn(column) || looksLikeChoiceListColumn(column) || looksLikeAttachmentColumn(column)) {\n if (Array.isArray(value)) {\n const items = value.map((v) => {\n if (v && typeof v === \"object\" && \"rowId\" in v) return (v as { rowId: number }).rowId\n return v\n })\n return [\"L\", ...items]\n }\n }\n\n return value\n}\n","/**\n * Grist stores column widget configuration in `_grist_Tables_column.widgetOptions`\n * as a JSON string. Choice fields use `choices: string[]` plus optional\n * `choiceOptions: Record<string, Style>` (e.g. `fillColor`, `textColor`).\n *\n * @see https://github.com/gristlabs/grist-core/blob/main/app/client/widgets/ChoiceEditor.js\n */\n\n/** One selectable choice for UI (value stored in the cell is `value`). */\nexport type GristChoiceListEntry = {\n value: string\n label: string\n fillColor?: string\n textColor?: string\n}\n\n/**\n * Parse a cell value from `_grist_Tables_column.widgetOptions` into a plain object.\n */\nexport function parseGristWidgetOptionsCell(raw: unknown): Record<string, unknown> | undefined {\n if (raw == null || raw === \"\") return undefined\n if (typeof raw === \"string\") {\n try {\n const parsed: unknown = JSON.parse(raw)\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>\n }\n } catch {\n return undefined\n }\n return undefined\n }\n if (typeof raw === \"object\" && !Array.isArray(raw)) {\n return raw as Record<string, unknown>\n }\n return undefined\n}\n\nfunction readStyleColor(style: Record<string, unknown>, key: string): string | undefined {\n const v = style[key]\n return typeof v === \"string\" ? v : undefined\n}\n\n/**\n * Normalizes Grist Choice / ChoiceList widgetOptions into a flat list for dropdowns.\n * `choices` entries are string labels (the stored cell value). Per-choice styling\n * lives in `choiceOptions[label]`.\n */\nexport function normalizeGristChoiceListEntries(\n widgetOptions: Record<string, unknown> | undefined\n): GristChoiceListEntry[] {\n if (!widgetOptions) return []\n const rawChoices = widgetOptions.choices\n if (!Array.isArray(rawChoices)) return []\n\n const choiceOptionsRaw = widgetOptions.choiceOptions\n const choiceOptions: Record<string, Record<string, unknown>> =\n choiceOptionsRaw &&\n typeof choiceOptionsRaw === \"object\" &&\n !Array.isArray(choiceOptionsRaw)\n ? (choiceOptionsRaw as Record<string, Record<string, unknown>>)\n : {}\n\n const out: GristChoiceListEntry[] = []\n for (const c of rawChoices) {\n const value = typeof c === \"string\" ? c : c != null ? String(c) : \"\"\n if (!value) continue\n const style = choiceOptions[value] ?? {}\n out.push({\n value,\n label: value,\n fillColor: readStyleColor(style, \"fillColor\"),\n textColor: readStyleColor(style, \"textColor\"),\n })\n }\n return out\n}\n","import { z, type ZodType } from \"zod\"\n\nimport type { GristReplicaColumn, GristRowRecord } from \"../types\"\nimport type { GristColumnarTable } from \"./grist-table-data\"\nimport { normalizeGristChoiceListEntries, type GristChoiceListEntry } from \"./grist-widget-options\"\nimport { decodeGristValue, type GristDecodedValue } from \"./grist-value-codec\"\n\nexport type GristSafeParseIssueCode =\n | \"grist_error\"\n | \"invalid_format\"\n | \"type_mismatch\"\n | \"helper_mismatch\"\n | \"zod_error\"\n\nexport type GristSafeParseIssue = {\n code: GristSafeParseIssueCode\n message: string\n}\n\nexport type GristSafeRefValue = {\n rowId: number\n display?: string | null\n}\n\nexport type GristSafeRefListValue = {\n rowIds: number[]\n displays?: string[]\n}\n\nexport const gristSafeRefValueSchema = z.object({\n rowId: z.number(),\n display: z.string().nullable().optional(),\n})\n\nexport const gristSafeRefListValueSchema = z.object({\n rowIds: z.array(z.number()),\n displays: z.array(z.string()).optional(),\n})\n\nexport const gristCellValueSchema = z.union([\n z.null(),\n z.string(),\n z.number(),\n z.boolean(),\n z.date(),\n z.array(z.unknown()),\n gristSafeRefValueSchema,\n gristSafeRefListValueSchema,\n])\n\nexport type GristCellValue = z.infer<typeof gristCellValueSchema>\n\nexport type GristSafeParseCellResult<TValue = unknown> = {\n ok: boolean\n typedValue: TValue | null\n displayValue: unknown\n raw: unknown\n issues: GristSafeParseIssue[]\n}\n\ntype RefMode = \"id\" | \"detailed\"\n\nexport type SafeParseGristValuesOptions<TValue = unknown> = {\n values: readonly unknown[]\n column?: GristReplicaColumn\n helperValues?: readonly unknown[]\n schema?: ZodType<TValue>\n fallbackUntypedToString?: boolean\n refMode?: RefMode\n}\n\nexport type SafeParseGristTableDataOptions = {\n columns?: Record<string, GristReplicaColumn>\n displayHelpersByRef?: Record<string, string>\n order?: \"none\" | \"id\" | \"grist\"\n fallbackUntypedToString?: boolean\n refMode?: RefMode\n}\n\nexport type GristSafeTableCellIssue = GristSafeParseIssue & {\n rowIndex: number\n colId: string\n}\n\nexport type GristSafeChoiceTokenMeta = {\n value: string\n label: string\n fillColor?: string\n textColor?: string\n valid: boolean\n}\n\nexport type GristSafeTableCellMeta = {\n rowIndex: number\n colId: string\n ok: boolean\n issues: GristSafeParseIssue[]\n choiceTokens?: GristSafeChoiceTokenMeta[]\n}\n\nexport type SafeParseGristTableDataResult<TRow extends Record<string, unknown> = Record<string, unknown>> = {\n rows: GristRowRecord<TRow>[]\n cellIssues: GristSafeTableCellIssue[]\n cellMeta: GristSafeTableCellMeta[]\n cellMetaByKey: Record<string, GristSafeTableCellMeta>\n cellResultsByColumn: Record<string, GristSafeParseCellResult[]>\n}\n\n/** Maps `Ref:*` / `RefList:*` column ids to their paired `gristHelper_*` column id (same rules as safe-parse). */\nexport function inferDisplayHelpersByRef(\n columns: Record<string, GristReplicaColumn>\n): Record<string, string> {\n const out: Record<string, string> = {}\n const helperColumns = Object.entries(columns).filter(([colId]) =>\n colId.startsWith(\"gristHelper_\")\n )\n const usedHelpers = new Set<string>()\n const colRefToColId = new Map<number, string>()\n for (const [colId, col] of Object.entries(columns)) {\n if (typeof col?.colRef === \"number\" && Number.isFinite(col.colRef)) {\n colRefToColId.set(col.colRef, colId)\n }\n }\n for (const [colId, col] of Object.entries(columns)) {\n const type = col?.type\n if (typeof type !== \"string\" || (!type.startsWith(\"Ref:\") && !type.startsWith(\"RefList:\"))) {\n continue\n }\n if (typeof col.displayColRef === \"number\" && Number.isFinite(col.displayColRef)) {\n const helperColId = colRefToColId.get(col.displayColRef)\n if (helperColId) {\n out[colId] = helperColId\n usedHelpers.add(helperColId)\n continue\n }\n }\n const match = helperColumns.find(([, helper]) => {\n const formula = helper?.formula\n return typeof formula === \"string\" && (formula.includes(`$${colId}.`) || formula.includes(`$${colId}`))\n })\n if (match) {\n out[colId] = match[0]\n usedHelpers.add(match[0])\n }\n }\n\n // Secondary fallback for schemas where helper formulas are unavailable:\n // pair unresolved Ref/RefList columns with nearest following gristHelper_*.\n const unresolvedRefs = Object.entries(columns)\n .filter(([colId, col]) => {\n const type = col?.type\n return (\n !out[colId] &&\n typeof type === \"string\" &&\n (type.startsWith(\"Ref:\") || type.startsWith(\"RefList:\"))\n )\n })\n .sort((a, b) => (a[1]?.parentPos ?? Number.MAX_SAFE_INTEGER) - (b[1]?.parentPos ?? Number.MAX_SAFE_INTEGER))\n const helperByPos = helperColumns\n .filter(([helperId]) => !usedHelpers.has(helperId))\n .sort((a, b) => (a[1]?.parentPos ?? Number.MAX_SAFE_INTEGER) - (b[1]?.parentPos ?? Number.MAX_SAFE_INTEGER))\n for (const [refId, refCol] of unresolvedRefs) {\n const refPos = refCol?.parentPos ?? Number.MAX_SAFE_INTEGER\n const candidate = helperByPos.find(([, helperCol]) => {\n const helperPos = helperCol?.parentPos ?? Number.MAX_SAFE_INTEGER\n return helperPos > refPos\n })\n if (!candidate) continue\n out[refId] = candidate[0]\n usedHelpers.add(candidate[0])\n }\n // If multiple unresolved refs remain, greedily map by order.\n for (const [refId] of unresolvedRefs) {\n if (out[refId]) continue\n const candidate = helperByPos.find(([helperId]) => !usedHelpers.has(helperId))\n if (!candidate) continue\n out[refId] = candidate[0]\n usedHelpers.add(candidate[0])\n }\n return out\n}\n\nfunction computeRowCount(data: Record<string, unknown[]>): number {\n const idCol = data.id\n if (Array.isArray(idCol)) return idCol.length\n for (const key of Object.keys(data)) {\n const col = data[key]\n if (Array.isArray(col)) return col.length\n }\n return 0\n}\n\nfunction manualSortKey(row: Record<string, unknown>): number | null {\n const v = row.manualSort\n if (typeof v === \"number\" && !Number.isNaN(v)) return v\n if (typeof v === \"string\" && v.trim() !== \"\") {\n const n = Number(v)\n if (!Number.isNaN(n)) return n\n }\n return null\n}\n\nfunction sortRowsByGristOrder<T = Record<string, unknown>>(\n rows: readonly GristRowRecord<T>[]\n): GristRowRecord<T>[] {\n const hasManual = rows.some((r) => manualSortKey(r as Record<string, unknown>) !== null)\n if (!hasManual) {\n return [...rows].sort((a, b) => {\n const ida = typeof a.id === \"number\" ? a.id : 0\n const idb = typeof b.id === \"number\" ? b.id : 0\n return ida - idb\n })\n }\n return [...rows].sort((a, b) => {\n const ma = manualSortKey(a as Record<string, unknown>)\n const mb = manualSortKey(b as Record<string, unknown>)\n if (ma !== null && mb !== null && ma !== mb) return ma - mb\n if (ma !== null && mb === null) return -1\n if (ma === null && mb !== null) return 1\n const ida = typeof a.id === \"number\" ? a.id : 0\n const idb = typeof b.id === \"number\" ? b.id : 0\n return ida - idb\n })\n}\n\nfunction columnKind(column?: GristReplicaColumn):\n | \"text\"\n | \"numeric\"\n | \"int\"\n | \"bool\"\n | \"date\"\n | \"datetime\"\n | \"choice\"\n | \"choiceList\"\n | \"ref\"\n | \"refList\"\n | \"attachments\"\n | \"any\"\n | \"unknown\" {\n const type = column?.type\n if (!type) return \"unknown\"\n if (type === \"Text\") return \"text\"\n if (type === \"Numeric\") return \"numeric\"\n if (type === \"Int\") return \"int\"\n if (type === \"Bool\") return \"bool\"\n if (type === \"Date\") return \"date\"\n if (type === \"DateTime\" || type.startsWith(\"DateTime:\")) return \"datetime\"\n if (type === \"Choice\") return \"choice\"\n if (type === \"ChoiceList\") return \"choiceList\"\n if (type.startsWith(\"Ref:\")) return \"ref\"\n if (type.startsWith(\"RefList:\")) return \"refList\"\n if (type === \"Attachments\") return \"attachments\"\n if (type === \"Any\") return \"any\"\n return \"unknown\"\n}\n\nfunction primitiveToString(value: unknown): string | null {\n if (value === null || value === undefined) return null\n if (typeof value === \"string\") return value\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value)\n }\n return null\n}\n\nfunction normalizeRefDisplay(value: unknown): { value?: string | null; issue?: GristSafeParseIssue } {\n if (value === null || value === undefined) return { value: null }\n if (typeof value === \"string\") return { value }\n if (typeof value === \"number\" || typeof value === \"boolean\") return { value: String(value) }\n return {\n issue: {\n code: \"helper_mismatch\",\n message: \"Ref display helper value should be a scalar value.\",\n },\n }\n}\n\nfunction normalizeRefListDisplays(value: unknown): { values?: string[]; issue?: GristSafeParseIssue } {\n if (value === null || value === undefined) return { values: [] }\n if (typeof value === \"string\") {\n const s = value.trim()\n if (s === \"\") return { values: [] }\n if (s.startsWith(\"[\")) {\n try {\n const parsed = JSON.parse(s)\n if (Array.isArray(parsed)) {\n return normalizeRefListDisplays(parsed)\n }\n } catch {\n // Keep existing error below for non-array/non-JSON helper strings.\n }\n }\n }\n if (!Array.isArray(value)) {\n return {\n issue: {\n code: \"helper_mismatch\",\n message: \"RefList display helper value should be an array.\",\n },\n }\n }\n // Grist list wire format may leak through as [\"L\", ...items].\n // Treat a leading \"L\" marker as metadata, not a display label.\n const items =\n value.length > 0 && value[0] === \"L\"\n ? value.slice(1)\n : value\n const out: string[] = []\n for (const item of items) {\n const s = primitiveToString(item)\n if (s === null) {\n return {\n issue: {\n code: \"helper_mismatch\",\n message: \"RefList helper items should be scalar values.\",\n },\n }\n }\n out.push(s)\n }\n return { values: out }\n}\n\nfunction normalizeRefValue(\n decoded: GristDecodedValue,\n helperValue: unknown,\n refMode: RefMode\n): { value: number | GristSafeRefValue | null; issues: GristSafeParseIssue[] } {\n const issues: GristSafeParseIssue[] = []\n if (decoded === null) return { value: null, issues }\n\n const rowId =\n typeof decoded === \"number\" && Number.isFinite(decoded)\n ? decoded\n : decoded && typeof decoded === \"object\" && \"__ref\" in decoded\n ? (decoded as { rowId: number }).rowId\n : null\n\n // Grist empty refs can surface as 0; treat as empty cell.\n if (rowId === 0) return { value: null, issues }\n if (rowId === null || !Number.isFinite(rowId)) {\n issues.push({\n code: \"type_mismatch\",\n message: \"Expected a Ref row id.\",\n })\n return { value: null, issues }\n }\n\n if (refMode === \"id\") return { value: rowId, issues }\n\n const helper = normalizeRefDisplay(helperValue)\n if (helper.issue) issues.push(helper.issue)\n return {\n value: { rowId, display: helper.value },\n issues,\n }\n}\n\nfunction normalizeRefListValue(\n decoded: GristDecodedValue,\n helperValue: unknown,\n refMode: RefMode\n): { value: number[] | GristSafeRefListValue | null; issues: GristSafeParseIssue[] } {\n const issues: GristSafeParseIssue[] = []\n if (decoded === null) return { value: null, issues }\n if (!Array.isArray(decoded)) {\n issues.push({\n code: \"type_mismatch\",\n message: \"Expected an array for RefList.\",\n })\n return { value: null, issues }\n }\n\n const rowIds: number[] = []\n for (const item of decoded) {\n if (typeof item === \"number\" && Number.isFinite(item) && item !== 0) {\n rowIds.push(item)\n continue\n }\n if (item && typeof item === \"object\" && \"__ref\" in item) {\n const rowId = (item as { rowId: number }).rowId\n if (typeof rowId === \"number\" && Number.isFinite(rowId) && rowId !== 0) {\n rowIds.push(rowId)\n continue\n }\n }\n issues.push({\n code: \"type_mismatch\",\n message: \"RefList items should be row ids.\",\n })\n return { value: null, issues }\n }\n\n if (refMode === \"id\") return { value: rowIds, issues }\n\n const helper = normalizeRefListDisplays(helperValue)\n if (helper.issue) {\n issues.push(helper.issue)\n } else if (helper.values && helper.values.length > 0 && helper.values.length !== rowIds.length) {\n issues.push({\n code: \"helper_mismatch\",\n message: \"RefList helper labels count does not match row ids count.\",\n })\n }\n return {\n value: { rowIds, displays: helper.values },\n issues,\n }\n}\n\nfunction normalizeByColumnKind(\n decoded: GristDecodedValue,\n kind: ReturnType<typeof columnKind>,\n helperValue: unknown,\n fallbackUntypedToString: boolean,\n refMode: RefMode\n): { value: unknown; issues: GristSafeParseIssue[] } {\n const issues: GristSafeParseIssue[] = []\n if (decoded && typeof decoded === \"object\" && \"__error\" in decoded) {\n issues.push({\n code: \"grist_error\",\n message: (decoded as { message?: string }).message ?? \"Grist returned a cell error.\",\n })\n return { value: null, issues }\n }\n\n switch (kind) {\n case \"ref\":\n return normalizeRefValue(decoded, helperValue, refMode)\n case \"refList\":\n return normalizeRefListValue(decoded, helperValue, refMode)\n case \"date\":\n case \"datetime\":\n if (decoded === null || decoded instanceof Date) return { value: decoded, issues }\n issues.push({ code: \"type_mismatch\", message: \"Expected a Date value.\" })\n return { value: null, issues }\n case \"bool\":\n if (decoded === null || typeof decoded === \"boolean\") return { value: decoded, issues }\n issues.push({ code: \"type_mismatch\", message: \"Expected a boolean value.\" })\n return { value: null, issues }\n case \"numeric\":\n if (decoded === null || (typeof decoded === \"number\" && Number.isFinite(decoded))) {\n return { value: decoded, issues }\n }\n issues.push({ code: \"type_mismatch\", message: \"Expected a numeric value.\" })\n return {\n value:\n typeof decoded === \"string\" ||\n typeof decoded === \"number\" ||\n typeof decoded === \"boolean\"\n ? decoded\n : null,\n issues,\n }\n case \"int\":\n if (decoded === null || (typeof decoded === \"number\" && Number.isInteger(decoded))) {\n return { value: decoded, issues }\n }\n issues.push({ code: \"type_mismatch\", message: \"Expected an integer value.\" })\n return {\n value:\n typeof decoded === \"string\" ||\n typeof decoded === \"number\" ||\n typeof decoded === \"boolean\"\n ? decoded\n : null,\n issues,\n }\n case \"choice\":\n case \"text\":\n if (decoded === null || typeof decoded === \"string\") return { value: decoded, issues }\n issues.push({ code: \"type_mismatch\", message: \"Expected a string value.\" })\n return { value: null, issues }\n case \"choiceList\":\n case \"attachments\":\n if (decoded === null || Array.isArray(decoded)) return { value: decoded, issues }\n issues.push({ code: \"type_mismatch\", message: \"Expected a list value.\" })\n return { value: null, issues }\n case \"any\":\n case \"unknown\":\n // Heuristic fallback: when schema typing is missing but a helper column is\n // attached, infer Ref/RefList from the decoded shape.\n if (helperValue !== undefined) {\n if (typeof decoded === \"number\" || (decoded && typeof decoded === \"object\" && \"__ref\" in decoded)) {\n return normalizeRefValue(decoded, helperValue, refMode)\n }\n if (Array.isArray(decoded)) {\n return normalizeRefListValue(decoded, helperValue, refMode)\n }\n }\n if (!fallbackUntypedToString) return { value: decoded, issues }\n if (decoded === null) return { value: null, issues }\n if (typeof decoded === \"string\") return { value: decoded, issues }\n if (\n typeof decoded === \"number\" ||\n typeof decoded === \"boolean\" ||\n decoded instanceof Date\n ) {\n return {\n value: decoded instanceof Date ? decoded.toISOString() : String(decoded),\n issues,\n }\n }\n if (Array.isArray(decoded)) {\n try {\n return { value: JSON.stringify(decoded), issues }\n } catch {\n issues.push({\n code: \"invalid_format\",\n message: \"Unable to stringify list value.\",\n })\n return { value: null, issues }\n }\n }\n issues.push({\n code: \"type_mismatch\",\n message: \"Untyped value could not be represented as a string.\",\n })\n return { value: null, issues }\n }\n}\n\nfunction buildChoiceTokens(\n col: GristReplicaColumn | undefined,\n value: unknown\n): GristSafeChoiceTokenMeta[] | undefined {\n const type = col?.type\n if (type !== \"Choice\" && type !== \"ChoiceList\") return undefined\n const entries = normalizeGristChoiceListEntries(col?.widgetOptions)\n const byValue = new Map<string, GristChoiceListEntry>(entries.map((entry) => [entry.value, entry]))\n\n if (type === \"Choice\") {\n if (value == null || typeof value !== \"string\" || value.trim() === \"\") return []\n const meta = byValue.get(value)\n if (!meta) return [{ value, label: value, valid: false }]\n return [\n {\n value,\n label: meta.label,\n fillColor: meta.fillColor,\n textColor: meta.textColor,\n valid: true,\n },\n ]\n }\n\n if (!Array.isArray(value)) return []\n const out: GristSafeChoiceTokenMeta[] = []\n for (const item of value) {\n const v = typeof item === \"string\" ? item : String(item)\n const meta = byValue.get(v)\n if (!meta) {\n out.push({ value: v, label: v, valid: false })\n continue\n }\n out.push({\n value: v,\n label: meta.label,\n fillColor: meta.fillColor,\n textColor: meta.textColor,\n valid: true,\n })\n }\n return out\n}\n\nexport function safeParseGristValues<TValue = unknown>(\n options: SafeParseGristValuesOptions<TValue>\n): GristSafeParseCellResult<TValue>[] {\n const fallbackUntypedToString = options.fallbackUntypedToString ?? true\n const refMode = options.refMode ?? \"id\"\n const kind = columnKind(options.column)\n return options.values.map((raw, index) => {\n const decoded = decodeGristValue(raw, options.column)\n const helperValue = options.helperValues?.[index]\n const normalized = normalizeByColumnKind(\n decoded,\n kind,\n helperValue,\n fallbackUntypedToString,\n refMode\n )\n const issues = [...normalized.issues]\n\n if (options.schema) {\n const result = options.schema.safeParse(normalized.value)\n if (!result.success) {\n issues.push({\n code: \"zod_error\",\n message: result.error.issues.map((issue) => issue.message).join(\"; \"),\n })\n }\n }\n\n return {\n ok: issues.length === 0,\n typedValue: normalized.value as TValue | null,\n displayValue: normalized.value,\n raw,\n issues,\n }\n })\n}\n\nexport function safeParseGristTableData<TRow extends Record<string, unknown> = Record<string, unknown>>(\n data: GristColumnarTable,\n options?: SafeParseGristTableDataOptions\n): SafeParseGristTableDataResult<TRow> {\n const columns = options?.columns ?? {}\n const inferredDisplayHelpersByRef = inferDisplayHelpersByRef(columns)\n const displayHelpersByRef: Record<string, string> = {\n ...inferredDisplayHelpersByRef,\n ...(options?.displayHelpersByRef ?? {}),\n }\n // Fallback convention: if `owner` exists and `gristHelper_owner` is fetched,\n // use it as display helper even when formula metadata is unavailable.\n for (const [colId, col] of Object.entries(columns)) {\n const type = col?.type\n if (typeof type !== \"string\" || (!type.startsWith(\"Ref:\") && !type.startsWith(\"RefList:\"))) {\n continue\n }\n if (displayHelpersByRef[colId]) continue\n const byName = `gristHelper_${colId}`\n if (Array.isArray(data[byName])) {\n displayHelpersByRef[colId] = byName\n }\n }\n const fallbackUntypedToString = options?.fallbackUntypedToString ?? true\n const refMode = options?.refMode ?? \"id\"\n const colIds = Object.keys(data)\n const parsedByColumn: Record<string, GristSafeParseCellResult[]> = {}\n\n for (const colId of colIds) {\n const rawValues = Array.isArray(data[colId]) ? data[colId] : []\n const helperColId = displayHelpersByRef[colId]\n const helperValues = helperColId && Array.isArray(data[helperColId]) ? data[helperColId] : undefined\n parsedByColumn[colId] =\n colId === \"id\"\n ? rawValues.map((raw) => ({\n ok: typeof raw === \"number\" && Number.isFinite(raw),\n typedValue: typeof raw === \"number\" && Number.isFinite(raw) ? raw : null,\n displayValue: raw,\n raw,\n issues:\n typeof raw === \"number\" && Number.isFinite(raw)\n ? []\n : [{ code: \"type_mismatch\", message: \"Row id should be numeric.\" }],\n }))\n : safeParseGristValues({\n values: rawValues,\n column: columns[colId],\n helperValues,\n fallbackUntypedToString,\n refMode,\n })\n }\n\n const rowCount = computeRowCount(data)\n const rows: GristRowRecord<TRow>[] = []\n const cellIssues: GristSafeTableCellIssue[] = []\n const cellMeta: GristSafeTableCellMeta[] = []\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n const row: Record<string, unknown> = {}\n for (const colId of colIds) {\n const parsed = parsedByColumn[colId]?.[rowIndex]\n row[colId] = parsed?.typedValue ?? null\n const choiceTokens = buildChoiceTokens(columns[colId], parsed?.displayValue)\n if (parsed) {\n if (parsed.issues.length > 0 || (choiceTokens && choiceTokens.length > 0)) {\n cellMeta.push({\n rowIndex,\n colId,\n ok: parsed.ok,\n issues: parsed.issues,\n choiceTokens,\n })\n }\n }\n if (!parsed || parsed.issues.length === 0) continue\n for (const issue of parsed.issues) {\n cellIssues.push({ ...issue, rowIndex, colId })\n }\n }\n rows.push(row as GristRowRecord<TRow>)\n }\n\n const cellMetaByKey: Record<string, GristSafeTableCellMeta> = {}\n for (const meta of cellMeta) {\n const rowId = rows[meta.rowIndex]?.id\n if (typeof rowId !== \"number\") continue\n cellMetaByKey[`${rowId}:${meta.colId}`] = meta\n }\n\n const order = options?.order ?? \"grist\"\n if (order === \"none\") {\n return { rows, cellIssues, cellMeta, cellMetaByKey, cellResultsByColumn: parsedByColumn }\n }\n if (order === \"id\") {\n return {\n rows: [...rows].sort((a, b) => {\n const ida = typeof a.id === \"number\" ? a.id : 0\n const idb = typeof b.id === \"number\" ? b.id : 0\n return ida - idb\n }),\n cellIssues,\n cellMeta,\n cellMetaByKey,\n cellResultsByColumn: parsedByColumn,\n }\n }\n return {\n rows: sortRowsByGristOrder(rows),\n cellIssues,\n cellMeta,\n cellMetaByKey,\n cellResultsByColumn: parsedByColumn,\n }\n}\n","/**\n * Grist `docApi.applyUserActions` payloads are arrays of user-action tuples.\n * @see https://support.getgrist.com/code/interfaces/grist_plugin_api.GristDocAPI/#applyuseractions\n */\n\nexport type GristUserActionTuple = unknown[]\n\n/** `[\"UpdateRecord\", tableId, rowId, { col: value, ... }]` */\nexport function gristUpdateRecordAction(\n tableId: string,\n rowId: number,\n patch: Record<string, unknown>\n): GristUserActionTuple {\n return [\"UpdateRecord\", tableId, rowId, patch]\n}\n\n/** `[\"AddRecord\", tableId, null, { col: value, ... }]` */\nexport function gristAddRecordAction(tableId: string, values: Record<string, unknown>): GristUserActionTuple {\n return [\"AddRecord\", tableId, null, values]\n}\n\n/** `[\"RemoveRecord\", tableId, rowId]` */\nexport function gristRemoveRecordAction(tableId: string, rowId: number): GristUserActionTuple {\n return [\"RemoveRecord\", tableId, rowId]\n}\n\n/** `[\"BulkUpdateRecord\", tableId, rowIds, { col: value[], ... }]` — column arrays must align with `rowIds`. */\nexport function gristBulkUpdateRecordAction(\n tableId: string,\n rowIds: number[],\n columnarPatch: Record<string, unknown[]>\n): GristUserActionTuple {\n return [\"BulkUpdateRecord\", tableId, rowIds, columnarPatch]\n}\n\n/**\n * `[\"BulkAddRecord\", tableId, rowIds | nullArray, { col: value[], ... }]`.\n * Pass `null` (or omit) for `rowIds` to let Grist allocate ids; in user-action\n * format Grist expects an array of nulls of the same length as the value arrays.\n */\nexport function gristBulkAddRecordAction(\n tableId: string,\n values: Record<string, unknown[]>,\n rowIds?: Array<number | null>\n): GristUserActionTuple {\n const length = inferBulkLength(values)\n const ids = rowIds ?? new Array<number | null>(length).fill(null)\n return [\"BulkAddRecord\", tableId, ids, values]\n}\n\n/** `[\"BulkRemoveRecord\", tableId, rowIds]` */\nexport function gristBulkRemoveRecordAction(tableId: string, rowIds: number[]): GristUserActionTuple {\n return [\"BulkRemoveRecord\", tableId, rowIds]\n}\n\n/** `[\"AddColumn\", tableId, colId, colInfo]` — `colInfo` shape depends on Grist version / column type. */\nexport function gristAddColumnAction(tableId: string, colId: string, colInfo: Record<string, unknown>): GristUserActionTuple {\n return [\"AddColumn\", tableId, colId, colInfo]\n}\n\n/** `[\"AddVisibleColumn\", tableId, colId, colInfo]` — like `AddColumn` but also adds the column to the current view section. */\nexport function gristAddVisibleColumnAction(tableId: string, colId: string, colInfo: Record<string, unknown>): GristUserActionTuple {\n return [\"AddVisibleColumn\", tableId, colId, colInfo]\n}\n\n/** `[\"RenameColumn\", tableId, colId, newColId]` */\nexport function gristRenameColumnAction(tableId: string, colId: string, newColId: string): GristUserActionTuple {\n return [\"RenameColumn\", tableId, colId, newColId]\n}\n\n/** `[\"ModifyColumn\", tableId, colId, colInfo]` */\nexport function gristModifyColumnAction(tableId: string, colId: string, colInfo: Record<string, unknown>): GristUserActionTuple {\n return [\"ModifyColumn\", tableId, colId, colInfo]\n}\n\n/** `[\"RemoveColumn\", tableId, colId]` */\nexport function gristRemoveColumnAction(tableId: string, colId: string): GristUserActionTuple {\n return [\"RemoveColumn\", tableId, colId]\n}\n\n/** `[\"AddTable\", tableId, tableInfo]` */\nexport function gristAddTableAction(tableId: string, tableInfo: Record<string, unknown>): GristUserActionTuple {\n return [\"AddTable\", tableId, tableInfo]\n}\n\n/** `[\"RenameTable\", tableId, newTableId]` */\nexport function gristRenameTableAction(tableId: string, newTableId: string): GristUserActionTuple {\n return [\"RenameTable\", tableId, newTableId]\n}\n\n/** `[\"RemoveTable\", tableId]` */\nexport function gristRemoveTableAction(tableId: string): GristUserActionTuple {\n return [\"RemoveTable\", tableId]\n}\n\n/** `[\"DuplicateTable\", tableId, newTableId, options?]` */\nexport function gristDuplicateTableAction(\n tableId: string,\n newTableId: string,\n options?: Record<string, unknown>\n): GristUserActionTuple {\n return options ? [\"DuplicateTable\", tableId, newTableId, options] : [\"DuplicateTable\", tableId, newTableId]\n}\n\n/** `[\"ReplaceTableData\", tableId, rowIds, columnarData]` */\nexport function gristReplaceTableDataAction(\n tableId: string,\n rowIds: Array<number | null>,\n columnarData: Record<string, unknown[]>\n): GristUserActionTuple {\n return [\"ReplaceTableData\", tableId, rowIds, columnarData]\n}\n\n/** `[\"SetDocumentInfo\", info]` */\nexport function gristSetDocumentInfoAction(info: Record<string, unknown>): GristUserActionTuple {\n return [\"SetDocumentInfo\", info]\n}\n\nfunction inferBulkLength(values: Record<string, unknown[]>): number {\n for (const arr of Object.values(values)) if (Array.isArray(arr)) return arr.length\n return 0\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-ELGVOHFD.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
// src/emulator/core/columnar.ts
|
|
2
|
-
function rowsToColumnar(table, rows, options = {}) {
|
|
3
|
-
const cols = Object.keys(table.columns);
|
|
4
|
-
const out = { id: rows.map((r) => r.id) };
|
|
5
|
-
for (const col of cols) {
|
|
6
|
-
out[col] = rows.map((r) => encodeForWire(r[col], table.columns[col]?.type, options.keepEncoded));
|
|
7
|
-
}
|
|
8
|
-
return out;
|
|
9
|
-
}
|
|
10
|
-
function rowToRecord(table, row, options = {}) {
|
|
11
|
-
const out = { id: row.id };
|
|
12
|
-
for (const col of Object.keys(table.columns)) {
|
|
13
|
-
out[col] = encodeForWire(row[col], table.columns[col]?.type, options.keepEncoded);
|
|
14
|
-
}
|
|
15
|
-
return out;
|
|
16
|
-
}
|
|
17
|
-
function encodeForWire(value, type, keepEncoded) {
|
|
18
|
-
if (value instanceof Date) {
|
|
19
|
-
const epoch = Math.floor(value.getTime() / 1e3);
|
|
20
|
-
if (keepEncoded) {
|
|
21
|
-
return type && type.startsWith("DateTime") ? ["D", epoch, "UTC"] : ["d", epoch];
|
|
22
|
-
}
|
|
23
|
-
return epoch;
|
|
24
|
-
}
|
|
25
|
-
return value;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export {
|
|
29
|
-
rowsToColumnar,
|
|
30
|
-
rowToRecord
|
|
31
|
-
};
|
|
32
|
-
//# sourceMappingURL=chunk-ELGVOHFD.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/emulator/core/columnar.ts"],"sourcesContent":["/**\n * Helpers to project an {@link EmulatorTable}'s row-array storage into Grist's\n * columnar wire format expected by `fetchTable` / `fetchSelectedTable`:\n *\n * { id: number[], colA: unknown[], colB: unknown[], ... }\n *\n * When `keepEncoded` is `false` (Grist's default for these APIs), values are\n * passed through as-is — JS-native primitives (string / number / boolean /\n * Date / arrays) are valid Grist plugin values. When `keepEncoded` is `true`,\n * Date columns are emitted in tuple form (`[\"d\", epoch]`) so callers can\n * round-trip them.\n */\n\nimport type { GristRowRecord } from \"../../sdk/types\"\nimport type { EmulatorTable } from \"./types\"\n\nexport type ColumnarTable = Record<string, unknown[]>\n\nexport type ToColumnarOptions = {\n keepEncoded?: boolean\n}\n\nexport function rowsToColumnar(\n table: EmulatorTable,\n rows: readonly GristRowRecord[],\n options: ToColumnarOptions = {}\n): ColumnarTable {\n const cols = Object.keys(table.columns)\n const out: ColumnarTable = { id: rows.map((r) => r.id) }\n for (const col of cols) {\n out[col] = rows.map((r) => encodeForWire(r[col], table.columns[col]?.type, options.keepEncoded))\n }\n return out\n}\n\nexport function rowToRecord(\n table: EmulatorTable,\n row: GristRowRecord,\n options: ToColumnarOptions = {}\n): Record<string, unknown> {\n const out: Record<string, unknown> = { id: row.id }\n for (const col of Object.keys(table.columns)) {\n out[col] = encodeForWire(row[col], table.columns[col]?.type, options.keepEncoded)\n }\n return out\n}\n\nfunction encodeForWire(value: unknown, type: string | undefined, keepEncoded: boolean | undefined): unknown {\n if (value instanceof Date) {\n const epoch = Math.floor(value.getTime() / 1000)\n if (keepEncoded) {\n return type && type.startsWith(\"DateTime\") ? [\"D\", epoch, \"UTC\"] : [\"d\", epoch]\n }\n return epoch\n }\n return value\n}\n"],"mappings":";AAsBO,SAAS,eACd,OACA,MACA,UAA6B,CAAC,GACf;AACf,QAAM,OAAO,OAAO,KAAK,MAAM,OAAO;AACtC,QAAM,MAAqB,EAAE,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE;AACvD,aAAW,OAAO,MAAM;AACtB,QAAI,GAAG,IAAI,KAAK,IAAI,CAAC,MAAM,cAAc,EAAE,GAAG,GAAG,MAAM,QAAQ,GAAG,GAAG,MAAM,QAAQ,WAAW,CAAC;AAAA,EACjG;AACA,SAAO;AACT;AAEO,SAAS,YACd,OACA,KACA,UAA6B,CAAC,GACL;AACzB,QAAM,MAA+B,EAAE,IAAI,IAAI,GAAG;AAClD,aAAW,OAAO,OAAO,KAAK,MAAM,OAAO,GAAG;AAC5C,QAAI,GAAG,IAAI,cAAc,IAAI,GAAG,GAAG,MAAM,QAAQ,GAAG,GAAG,MAAM,QAAQ,WAAW;AAAA,EAClF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAgB,MAA0B,aAA2C;AAC1G,MAAI,iBAAiB,MAAM;AACzB,UAAM,QAAQ,KAAK,MAAM,MAAM,QAAQ,IAAI,GAAI;AAC/C,QAAI,aAAa;AACf,aAAO,QAAQ,KAAK,WAAW,UAAU,IAAI,CAAC,KAAK,OAAO,KAAK,IAAI,CAAC,KAAK,KAAK;AAAA,IAChF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;","names":[]}
|
package/dist/chunk-EPEBKXVN.js
DELETED
|
@@ -1,470 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
acquireEmbeddedHandshakeManager,
|
|
3
|
-
deriveCapabilities,
|
|
4
|
-
deriveErrorMessage,
|
|
5
|
-
deriveStatus,
|
|
6
|
-
ensureGristReady,
|
|
7
|
-
initialGristSnapshot,
|
|
8
|
-
releaseEmbeddedHandshakeManager,
|
|
9
|
-
resetGristReadySingleton
|
|
10
|
-
} from "./chunk-TZB3OZA6.js";
|
|
11
|
-
|
|
12
|
-
// src/sdk/helpers/grist-fetch-with-auth.ts
|
|
13
|
-
var TOKEN_TTL_MS = 45e3;
|
|
14
|
-
var cache = /* @__PURE__ */ new Map();
|
|
15
|
-
var inFlight = /* @__PURE__ */ new Map();
|
|
16
|
-
function cacheKey(readOnly) {
|
|
17
|
-
return readOnly ? "ro" : "rw";
|
|
18
|
-
}
|
|
19
|
-
async function getGristAccessToken(docApi, options) {
|
|
20
|
-
if (!docApi.getAccessToken) {
|
|
21
|
-
throw new Error("getAccessToken is not available on docApi (need higher access level)");
|
|
22
|
-
}
|
|
23
|
-
const readOnly = options?.readOnly ?? false;
|
|
24
|
-
const key = cacheKey(readOnly);
|
|
25
|
-
const now = Date.now();
|
|
26
|
-
const hit = cache.get(key);
|
|
27
|
-
if (hit && now - hit.fetchedAt < TOKEN_TTL_MS) {
|
|
28
|
-
return hit.token;
|
|
29
|
-
}
|
|
30
|
-
const pending = inFlight.get(key);
|
|
31
|
-
if (pending) return pending;
|
|
32
|
-
const next = docApi.getAccessToken({ readOnly }).then((token) => {
|
|
33
|
-
cache.set(key, { token, fetchedAt: Date.now() });
|
|
34
|
-
inFlight.delete(key);
|
|
35
|
-
return token;
|
|
36
|
-
});
|
|
37
|
-
inFlight.set(key, next);
|
|
38
|
-
return next;
|
|
39
|
-
}
|
|
40
|
-
function clearGristAccessTokenCache() {
|
|
41
|
-
cache.clear();
|
|
42
|
-
inFlight.clear();
|
|
43
|
-
}
|
|
44
|
-
async function fetchWithGristAuth(docApi, path, init) {
|
|
45
|
-
const readOnly = init?.readOnly ?? false;
|
|
46
|
-
let token;
|
|
47
|
-
try {
|
|
48
|
-
token = await getGristAccessToken(docApi, { readOnly });
|
|
49
|
-
} catch (err) {
|
|
50
|
-
clearGristAccessTokenCache();
|
|
51
|
-
throw err;
|
|
52
|
-
}
|
|
53
|
-
const isAbsolute = /^https?:\/\//i.test(path);
|
|
54
|
-
const cleanPath = isAbsolute ? path : path.startsWith("/") ? path : `/${path}`;
|
|
55
|
-
const url = isAbsolute ? new URL(path) : new URL(`${token.baseUrl.replace(/\/$/, "")}${cleanPath}`);
|
|
56
|
-
if (!url.searchParams.has("auth")) url.searchParams.set("auth", token.token);
|
|
57
|
-
const headers = new Headers(init?.headers ?? {});
|
|
58
|
-
headers.delete("Authorization");
|
|
59
|
-
const response = await fetch(url.toString(), { ...init, headers });
|
|
60
|
-
if (response.status === 401) {
|
|
61
|
-
clearGristAccessTokenCache();
|
|
62
|
-
const retryToken = await getGristAccessToken(docApi, { readOnly });
|
|
63
|
-
url.searchParams.set("auth", retryToken.token);
|
|
64
|
-
return fetch(url.toString(), { ...init, headers });
|
|
65
|
-
}
|
|
66
|
-
return response;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// src/sdk/internal/hooks/use-grist-core.ts
|
|
70
|
-
import { useCallback, useMemo, useSyncExternalStore } from "react";
|
|
71
|
-
|
|
72
|
-
// src/sdk/internal/handshake-manager-context.ts
|
|
73
|
-
import { createContext, useContext, useEffect, useRef } from "react";
|
|
74
|
-
|
|
75
|
-
// src/sdk/internal/build-manager-options.ts
|
|
76
|
-
function buildManagerOptionsFromGristOptions(options) {
|
|
77
|
-
const opts = {
|
|
78
|
-
requiredAccess: options?.requiredAccess ?? "read table",
|
|
79
|
-
columns: options?.columns ?? [],
|
|
80
|
-
allowSelectBy: options?.allowSelectBy,
|
|
81
|
-
hasCustomOptions: options?.hasCustomOptions,
|
|
82
|
-
onEditOptions: options?.onEditOptions,
|
|
83
|
-
negotiate: {
|
|
84
|
-
readyImpl: (payload) => ensureGristReady(payload)
|
|
85
|
-
},
|
|
86
|
-
onBeforeReload: () => resetGristReadySingleton()
|
|
87
|
-
};
|
|
88
|
-
if (options?.availabilityMaxAttempts !== void 0 || options?.availabilityIntervalMs !== void 0) {
|
|
89
|
-
const interval = options?.availabilityIntervalMs ?? 1e3;
|
|
90
|
-
const max = options?.availabilityMaxAttempts ?? 10;
|
|
91
|
-
opts.detect = {
|
|
92
|
-
pollSequenceMs: Array.from({ length: max }, () => interval),
|
|
93
|
-
budgetMs: interval * max
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
return opts;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// src/sdk/internal/handshake-manager-context.ts
|
|
100
|
-
var GristHandshakeManagerContext = createContext(null);
|
|
101
|
-
function useGristManagerOptional() {
|
|
102
|
-
return useContext(GristHandshakeManagerContext);
|
|
103
|
-
}
|
|
104
|
-
function useGristManager(options) {
|
|
105
|
-
const fromProvider = useContext(GristHandshakeManagerContext);
|
|
106
|
-
const optionsRef = useRef(options);
|
|
107
|
-
optionsRef.current = options;
|
|
108
|
-
const embeddedRef = useRef(null);
|
|
109
|
-
const ownsEmbeddedRef = useRef(false);
|
|
110
|
-
if (fromProvider) {
|
|
111
|
-
return fromProvider;
|
|
112
|
-
}
|
|
113
|
-
if (embeddedRef.current === null) {
|
|
114
|
-
embeddedRef.current = acquireEmbeddedHandshakeManager(
|
|
115
|
-
buildManagerOptionsFromGristOptions(optionsRef.current)
|
|
116
|
-
);
|
|
117
|
-
ownsEmbeddedRef.current = true;
|
|
118
|
-
}
|
|
119
|
-
useEffect(() => {
|
|
120
|
-
if (!ownsEmbeddedRef.current) return;
|
|
121
|
-
return () => {
|
|
122
|
-
releaseEmbeddedHandshakeManager();
|
|
123
|
-
embeddedRef.current = null;
|
|
124
|
-
ownsEmbeddedRef.current = false;
|
|
125
|
-
};
|
|
126
|
-
}, []);
|
|
127
|
-
return embeddedRef.current;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// src/sdk/internal/hooks/use-grist-core.ts
|
|
131
|
-
function computeAvailabilityFromSnapshot(snapshot) {
|
|
132
|
-
const { phase } = snapshot.lifecycle;
|
|
133
|
-
if (phase === "idle" || phase === "detecting") return null;
|
|
134
|
-
if (phase === "terminated") {
|
|
135
|
-
const reason = snapshot.lifecycle.reason.kind;
|
|
136
|
-
if (reason === "not_embedded" || reason === "script_timeout") return false;
|
|
137
|
-
return true;
|
|
138
|
-
}
|
|
139
|
-
return true;
|
|
140
|
-
}
|
|
141
|
-
function useGristCore(options) {
|
|
142
|
-
const manager = useGristManager(options);
|
|
143
|
-
return useGristCoreFromManager(manager);
|
|
144
|
-
}
|
|
145
|
-
function useGristCoreFromManager(manager) {
|
|
146
|
-
const snapshot = useSyncExternalStore(
|
|
147
|
-
manager.subscribe,
|
|
148
|
-
manager.getSnapshot,
|
|
149
|
-
initialGristSnapshot
|
|
150
|
-
);
|
|
151
|
-
const status = deriveStatus(snapshot);
|
|
152
|
-
const error = deriveErrorMessage(snapshot);
|
|
153
|
-
const docApi = snapshot.lifecycle.phase === "online" && typeof grist !== "undefined" ? grist.docApi ?? null : null;
|
|
154
|
-
const isAvailable = computeAvailabilityFromSnapshot(snapshot);
|
|
155
|
-
const reload = useCallback(async () => {
|
|
156
|
-
manager.reload();
|
|
157
|
-
}, [manager]);
|
|
158
|
-
const capabilities = useMemo(() => deriveCapabilities(snapshot), [snapshot]);
|
|
159
|
-
return useMemo(
|
|
160
|
-
() => ({
|
|
161
|
-
status,
|
|
162
|
-
isAvailable,
|
|
163
|
-
isReady: status === "ready",
|
|
164
|
-
error,
|
|
165
|
-
docApi,
|
|
166
|
-
capabilities,
|
|
167
|
-
reload
|
|
168
|
-
}),
|
|
169
|
-
[status, isAvailable, error, docApi, capabilities, reload]
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// src/sdk/low-level-hooks/use-grist-ready.ts
|
|
174
|
-
function useGristReady(options) {
|
|
175
|
-
const { isAvailable, docApi, error, reload } = useGristCore(options);
|
|
176
|
-
return { isAvailable, docApi, error, reload };
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// src/sdk/mid-level-hooks/use-grist-widget-options-from-context.ts
|
|
180
|
-
import { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMemo3, useRef as useRef2, useState } from "react";
|
|
181
|
-
|
|
182
|
-
// src/sdk/internal/contexts.tsx
|
|
183
|
-
import { createContext as createContext2, useContext as useContext2, useMemo as useMemo2 } from "react";
|
|
184
|
-
|
|
185
|
-
// src/sdk/internal/merge-grist-result.ts
|
|
186
|
-
function mergeGristResultFromSlices(slices) {
|
|
187
|
-
const { core, selection, currentTable, writes, reads, widgetOptionsApi, linking, attachmentsRest, theme, sectionApi, suppressAlerts, allowSelectBy } = slices;
|
|
188
|
-
return {
|
|
189
|
-
status: core.status,
|
|
190
|
-
isAvailable: core.isAvailable,
|
|
191
|
-
isReady: core.isReady,
|
|
192
|
-
error: core.error,
|
|
193
|
-
capabilities: core.capabilities,
|
|
194
|
-
record: selection.record,
|
|
195
|
-
records: selection.records,
|
|
196
|
-
mappedRecord: selection.mappedRecord,
|
|
197
|
-
mappings: selection.mappings,
|
|
198
|
-
recordsMappings: selection.recordsMappings,
|
|
199
|
-
columnMappingStatus: selection.columnMappingStatus,
|
|
200
|
-
mode: selection.mode,
|
|
201
|
-
resolveMappedColumnId: selection.resolveMappedColumnId,
|
|
202
|
-
mapBack: selection.mapBack,
|
|
203
|
-
mapBackSkipped: selection.mapBackSkipped,
|
|
204
|
-
isNewRecord: selection.isNewRecord,
|
|
205
|
-
newRecordMappings: selection.newRecordMappings,
|
|
206
|
-
currentTableId: currentTable.currentTableId,
|
|
207
|
-
currentTableLoading: currentTable.currentTableLoading,
|
|
208
|
-
refreshCurrentTable: currentTable.refreshCurrentTable,
|
|
209
|
-
table: writes.table,
|
|
210
|
-
getTable: writes.getTable,
|
|
211
|
-
actionStatus: writes.actionStatus,
|
|
212
|
-
actionError: writes.actionError,
|
|
213
|
-
applyActions: writes.applyActions,
|
|
214
|
-
reload: core.reload,
|
|
215
|
-
fetchTable: reads.fetchTable,
|
|
216
|
-
fetchTableRows: reads.fetchTableRows,
|
|
217
|
-
fetchRow: reads.fetchRow,
|
|
218
|
-
listTables: reads.listTables,
|
|
219
|
-
listColumns: reads.listColumns,
|
|
220
|
-
getDocName: reads.getDocName,
|
|
221
|
-
buildReplicaDocumentFromDocApi: reads.buildReplicaDocumentFromDocApi,
|
|
222
|
-
getAttachmentUrl: attachmentsRest.getAttachmentUrl,
|
|
223
|
-
fetchAttachmentBase64: attachmentsRest.fetchAttachmentBase64,
|
|
224
|
-
fetchAttachmentBlob: attachmentsRest.fetchAttachmentBlob,
|
|
225
|
-
widgetOptions: selection.widgetOptions,
|
|
226
|
-
widgetInteraction: selection.widgetInteraction,
|
|
227
|
-
getWidgetOptions: widgetOptionsApi.getWidgetOptions,
|
|
228
|
-
getWidgetOption: widgetOptionsApi.getWidgetOption,
|
|
229
|
-
setWidgetOption: widgetOptionsApi.setWidgetOption,
|
|
230
|
-
setWidgetOptions: widgetOptionsApi.setWidgetOptions,
|
|
231
|
-
patchWidgetOptions: widgetOptionsApi.patchWidgetOptions,
|
|
232
|
-
clearWidgetOptions: widgetOptionsApi.clearWidgetOptions,
|
|
233
|
-
fetchSelectedTable: reads.fetchSelectedTable,
|
|
234
|
-
fetchSelectedRecord: reads.fetchSelectedRecord,
|
|
235
|
-
readError: reads.readError ?? attachmentsRest.readError,
|
|
236
|
-
setCursorPosition: linking.setCursorPosition,
|
|
237
|
-
setLinkedRowSelection: linking.setLinkedRowSelection,
|
|
238
|
-
getAccessToken: attachmentsRest.getAccessToken,
|
|
239
|
-
fetchWithAuth: attachmentsRest.fetchWithAuth,
|
|
240
|
-
uploadAttachment: attachmentsRest.uploadAttachment,
|
|
241
|
-
theme: theme.theme,
|
|
242
|
-
configure: sectionApi.configure,
|
|
243
|
-
refreshMappings: sectionApi.refreshMappings,
|
|
244
|
-
suppressAlerts,
|
|
245
|
-
allowSelectBy
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// src/sdk/internal/contexts.tsx
|
|
250
|
-
var GristCoreContext = createContext2(null);
|
|
251
|
-
var GristSelectionContext = createContext2(null);
|
|
252
|
-
var GristCurrentTableContext = createContext2(null);
|
|
253
|
-
var GristWritesContext = createContext2(null);
|
|
254
|
-
var GristReadsContext = createContext2(null);
|
|
255
|
-
var GristWidgetOptionsApiContext = createContext2(null);
|
|
256
|
-
var GristLinkingContext = createContext2(null);
|
|
257
|
-
var GristAttachmentsRestContext = createContext2(null);
|
|
258
|
-
var GristThemeContext = createContext2(null);
|
|
259
|
-
var GristSectionApiContext = createContext2(null);
|
|
260
|
-
function useRequiredContext(ctx, name) {
|
|
261
|
-
const value = useContext2(ctx);
|
|
262
|
-
if (!value) {
|
|
263
|
-
throw new Error(`${name} must be used inside <GristWidgetProvider>`);
|
|
264
|
-
}
|
|
265
|
-
return value;
|
|
266
|
-
}
|
|
267
|
-
function useGristCoreContext() {
|
|
268
|
-
return useRequiredContext(GristCoreContext, "useGristCoreContext()");
|
|
269
|
-
}
|
|
270
|
-
function useGristSelectionContext() {
|
|
271
|
-
return useRequiredContext(GristSelectionContext, "useGristSelectionContext()");
|
|
272
|
-
}
|
|
273
|
-
function useGristCurrentTableContext() {
|
|
274
|
-
return useRequiredContext(GristCurrentTableContext, "useGristCurrentTableContext()");
|
|
275
|
-
}
|
|
276
|
-
function useGristWritesContext() {
|
|
277
|
-
return useRequiredContext(GristWritesContext, "useGristWritesContext()");
|
|
278
|
-
}
|
|
279
|
-
function useGristReadsContext() {
|
|
280
|
-
return useRequiredContext(GristReadsContext, "useGristReadsContext()");
|
|
281
|
-
}
|
|
282
|
-
function useGristWidgetOptionsApiContext() {
|
|
283
|
-
return useRequiredContext(GristWidgetOptionsApiContext, "useGristWidgetOptionsApiContext()");
|
|
284
|
-
}
|
|
285
|
-
function useGristLinkingContext() {
|
|
286
|
-
return useRequiredContext(GristLinkingContext, "useGristLinkingContext()");
|
|
287
|
-
}
|
|
288
|
-
function useGristAttachmentsRestContext() {
|
|
289
|
-
return useRequiredContext(GristAttachmentsRestContext, "useGristAttachmentsRestContext()");
|
|
290
|
-
}
|
|
291
|
-
function useGristThemeContext() {
|
|
292
|
-
return useRequiredContext(GristThemeContext, "useGristThemeContext()");
|
|
293
|
-
}
|
|
294
|
-
function useGristSectionApiContext() {
|
|
295
|
-
return useRequiredContext(GristSectionApiContext, "useGristSectionApiContext()");
|
|
296
|
-
}
|
|
297
|
-
function useGristFromProvider() {
|
|
298
|
-
const core = useGristCoreContext();
|
|
299
|
-
const selection = useGristSelectionContext();
|
|
300
|
-
const currentTable = useGristCurrentTableContext();
|
|
301
|
-
const writes = useGristWritesContext();
|
|
302
|
-
const reads = useGristReadsContext();
|
|
303
|
-
const widgetOptionsApi = useGristWidgetOptionsApiContext();
|
|
304
|
-
const linking = useGristLinkingContext();
|
|
305
|
-
const attachmentsRest = useGristAttachmentsRestContext();
|
|
306
|
-
const theme = useGristThemeContext();
|
|
307
|
-
const sectionApi = useGristSectionApiContext();
|
|
308
|
-
return useMemo2(
|
|
309
|
-
() => mergeGristResultFromSlices({
|
|
310
|
-
core,
|
|
311
|
-
selection,
|
|
312
|
-
currentTable,
|
|
313
|
-
writes,
|
|
314
|
-
reads,
|
|
315
|
-
widgetOptionsApi,
|
|
316
|
-
linking,
|
|
317
|
-
attachmentsRest,
|
|
318
|
-
theme,
|
|
319
|
-
sectionApi
|
|
320
|
-
}),
|
|
321
|
-
[
|
|
322
|
-
core,
|
|
323
|
-
selection,
|
|
324
|
-
currentTable,
|
|
325
|
-
writes,
|
|
326
|
-
reads,
|
|
327
|
-
widgetOptionsApi,
|
|
328
|
-
linking,
|
|
329
|
-
attachmentsRest,
|
|
330
|
-
theme,
|
|
331
|
-
sectionApi
|
|
332
|
-
]
|
|
333
|
-
);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
// src/sdk/mid-level-hooks/use-grist-widget-options-from-context.ts
|
|
337
|
-
function mergeWithDefaults(defaults, stored, namespace) {
|
|
338
|
-
if (stored === null || stored === void 0) return { ...defaults };
|
|
339
|
-
const source = namespace ? stored[namespace] : stored;
|
|
340
|
-
if (!source || typeof source !== "object") return { ...defaults };
|
|
341
|
-
return { ...defaults, ...source };
|
|
342
|
-
}
|
|
343
|
-
function useGristWidgetOptionsFromContext(config) {
|
|
344
|
-
const debounceMs = config.debounceMs ?? 250;
|
|
345
|
-
const selection = useGristSelectionContext();
|
|
346
|
-
const optionsApi = useGristWidgetOptionsApiContext();
|
|
347
|
-
const defaultsRef = useRef2(config.defaults);
|
|
348
|
-
useEffect2(() => {
|
|
349
|
-
defaultsRef.current = config.defaults;
|
|
350
|
-
}, [config.defaults]);
|
|
351
|
-
const rawOptions = selection.widgetOptions;
|
|
352
|
-
const hasReceived = rawOptions !== null;
|
|
353
|
-
const merged = useMemo3(
|
|
354
|
-
() => mergeWithDefaults(defaultsRef.current, rawOptions, config.namespace),
|
|
355
|
-
[rawOptions, config.namespace]
|
|
356
|
-
);
|
|
357
|
-
const [localOverride, setLocalOverride] = useState(null);
|
|
358
|
-
const options = localOverride ?? merged;
|
|
359
|
-
useEffect2(() => {
|
|
360
|
-
setLocalOverride(null);
|
|
361
|
-
}, [rawOptions]);
|
|
362
|
-
const debounceRef = useRef2(null);
|
|
363
|
-
const flushWrite = useCallback2(
|
|
364
|
-
async (value) => {
|
|
365
|
-
if (config.namespace) {
|
|
366
|
-
await optionsApi.setWidgetOption(config.namespace, value);
|
|
367
|
-
} else {
|
|
368
|
-
await optionsApi.setWidgetOptions({ ...value });
|
|
369
|
-
}
|
|
370
|
-
},
|
|
371
|
-
[config.namespace, optionsApi]
|
|
372
|
-
);
|
|
373
|
-
const scheduleWrite = useCallback2(
|
|
374
|
-
(value) => {
|
|
375
|
-
if (debounceRef.current) window.clearTimeout(debounceRef.current);
|
|
376
|
-
debounceRef.current = window.setTimeout(() => {
|
|
377
|
-
debounceRef.current = null;
|
|
378
|
-
void flushWrite(value);
|
|
379
|
-
}, debounceMs);
|
|
380
|
-
},
|
|
381
|
-
[debounceMs, flushWrite]
|
|
382
|
-
);
|
|
383
|
-
useEffect2(() => {
|
|
384
|
-
return () => {
|
|
385
|
-
if (debounceRef.current) window.clearTimeout(debounceRef.current);
|
|
386
|
-
};
|
|
387
|
-
}, []);
|
|
388
|
-
const setOptions = useCallback2(
|
|
389
|
-
(next) => {
|
|
390
|
-
setLocalOverride(next);
|
|
391
|
-
scheduleWrite(next);
|
|
392
|
-
},
|
|
393
|
-
[scheduleWrite]
|
|
394
|
-
);
|
|
395
|
-
const patchOptions = useCallback2(
|
|
396
|
-
(patch) => {
|
|
397
|
-
setLocalOverride((prev) => {
|
|
398
|
-
const base = prev ?? merged;
|
|
399
|
-
const next = { ...base, ...patch };
|
|
400
|
-
scheduleWrite(next);
|
|
401
|
-
return next;
|
|
402
|
-
});
|
|
403
|
-
},
|
|
404
|
-
[merged, scheduleWrite]
|
|
405
|
-
);
|
|
406
|
-
const reset = useCallback2(async () => {
|
|
407
|
-
if (debounceRef.current) {
|
|
408
|
-
window.clearTimeout(debounceRef.current);
|
|
409
|
-
debounceRef.current = null;
|
|
410
|
-
}
|
|
411
|
-
const next = { ...defaultsRef.current };
|
|
412
|
-
setLocalOverride(null);
|
|
413
|
-
await flushWrite(next);
|
|
414
|
-
}, [flushWrite]);
|
|
415
|
-
return useMemo3(
|
|
416
|
-
() => ({
|
|
417
|
-
options,
|
|
418
|
-
loading: !hasReceived,
|
|
419
|
-
setOptions,
|
|
420
|
-
patchOptions,
|
|
421
|
-
reset
|
|
422
|
-
}),
|
|
423
|
-
[options, hasReceived, setOptions, patchOptions, reset]
|
|
424
|
-
);
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
// src/sdk/internal/hooks/use-rpc-heartbeat-coalesce.ts
|
|
428
|
-
import { useCallback as useCallback3 } from "react";
|
|
429
|
-
function useRpcHeartbeatCoalesce() {
|
|
430
|
-
const manager = useGristManagerOptional();
|
|
431
|
-
return useCallback3(
|
|
432
|
-
async (fn) => {
|
|
433
|
-
const result = await fn();
|
|
434
|
-
manager?.recordRpcSuccess();
|
|
435
|
-
return result;
|
|
436
|
-
},
|
|
437
|
-
[manager]
|
|
438
|
-
);
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
export {
|
|
442
|
-
getGristAccessToken,
|
|
443
|
-
fetchWithGristAuth,
|
|
444
|
-
buildManagerOptionsFromGristOptions,
|
|
445
|
-
GristHandshakeManagerContext,
|
|
446
|
-
useGristManagerOptional,
|
|
447
|
-
useGristManager,
|
|
448
|
-
mergeGristResultFromSlices,
|
|
449
|
-
GristCoreContext,
|
|
450
|
-
GristSelectionContext,
|
|
451
|
-
GristCurrentTableContext,
|
|
452
|
-
GristWritesContext,
|
|
453
|
-
GristReadsContext,
|
|
454
|
-
GristWidgetOptionsApiContext,
|
|
455
|
-
GristLinkingContext,
|
|
456
|
-
GristAttachmentsRestContext,
|
|
457
|
-
GristThemeContext,
|
|
458
|
-
GristSectionApiContext,
|
|
459
|
-
useGristCoreContext,
|
|
460
|
-
useGristSelectionContext,
|
|
461
|
-
useGristCurrentTableContext,
|
|
462
|
-
useGristWritesContext,
|
|
463
|
-
useGristThemeContext,
|
|
464
|
-
useGristFromProvider,
|
|
465
|
-
useGristCore,
|
|
466
|
-
useRpcHeartbeatCoalesce,
|
|
467
|
-
useGristReady,
|
|
468
|
-
useGristWidgetOptionsFromContext
|
|
469
|
-
};
|
|
470
|
-
//# sourceMappingURL=chunk-EPEBKXVN.js.map
|