@burdenoff/fluidgrids-fe-sdk 2026.1007.3 → 2026.1007.5

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/dist/index.js CHANGED
@@ -2983,260 +2983,264 @@ function DataTablesPage() {
2983
2983
  },
2984
2984
  [searchInput]
2985
2985
  );
2986
- return /* @__PURE__ */ jsxs("div", { className: "min-h-screen bg-background-primary p-4 sm:p-6", children: [
2987
- /* @__PURE__ */ jsxs("div", { className: "mx-auto flex max-w-[1500px] flex-col gap-5", children: [
2988
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between", children: [
2989
- /* @__PURE__ */ jsxs("div", { children: [
2990
- /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-center gap-2 text-sm text-text-secondary", children: [
2991
- /* @__PURE__ */ jsx(Database, { className: "size-4", "aria-hidden": "true" }),
2992
- tr("fluidgrids.dataTables.workflowData", "Workflow data")
2986
+ return (
2987
+ // `pb-24`: the shell's floating assistant bubble sits bottom-right and would
2988
+ // otherwise cover the pager's Next button when scrolled to the end.
2989
+ /* @__PURE__ */ jsxs("div", { className: "min-h-screen bg-background-primary p-4 pb-24 sm:p-6 sm:pb-24", children: [
2990
+ /* @__PURE__ */ jsxs("div", { className: "mx-auto flex max-w-[1500px] flex-col gap-5", children: [
2991
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between", children: [
2992
+ /* @__PURE__ */ jsxs("div", { children: [
2993
+ /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-center gap-2 text-sm text-text-secondary", children: [
2994
+ /* @__PURE__ */ jsx(Database, { className: "size-4", "aria-hidden": "true" }),
2995
+ tr("fluidgrids.dataTables.workflowData", "Workflow data")
2996
+ ] }),
2997
+ /* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold text-text-primary sm:text-3xl", children: tr("fluidgrids.dataTables.pageTitle", "Data Tables") }),
2998
+ /* @__PURE__ */ jsx(
2999
+ PagePurpose,
3000
+ {
3001
+ icon: /* @__PURE__ */ jsx(Database, { className: "size-4", "aria-hidden": "true" }),
3002
+ children: tr(
3003
+ "fluidgrids.dataTables.pageSubtitle",
3004
+ "Use Data Tables as lightweight persistent storage for workflow state, lookups, and records shared across runs."
3005
+ )
3006
+ }
3007
+ )
2993
3008
  ] }),
2994
- /* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold text-text-primary sm:text-3xl", children: tr("fluidgrids.dataTables.pageTitle", "Data Tables") }),
2995
- /* @__PURE__ */ jsx(
2996
- PagePurpose,
2997
- {
2998
- icon: /* @__PURE__ */ jsx(Database, { className: "size-4", "aria-hidden": "true" }),
2999
- children: tr(
3000
- "fluidgrids.dataTables.pageSubtitle",
3001
- "Use Data Tables as lightweight persistent storage for workflow state, lookups, and records shared across runs."
3002
- )
3003
- }
3004
- )
3009
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
3010
+ /* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: () => navigate("../list"), children: [
3011
+ /* @__PURE__ */ jsx(ArrowLeft, { className: "mr-2 size-4", "aria-hidden": "true" }),
3012
+ tr("fluidgrids.dataTables.backToWorkflows", "Back to Workflows")
3013
+ ] }),
3014
+ /* @__PURE__ */ jsxs(
3015
+ Button,
3016
+ {
3017
+ onClick: () => {
3018
+ setEditingTable(null);
3019
+ setTableDialogOpen(true);
3020
+ },
3021
+ children: [
3022
+ /* @__PURE__ */ jsx(Plus, { className: "mr-2 size-4", "aria-hidden": "true" }),
3023
+ tr("fluidgrids.dataTables.newTable", "New data table")
3024
+ ]
3025
+ }
3026
+ )
3027
+ ] })
3005
3028
  ] }),
3006
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
3007
- /* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: () => navigate("../list"), children: [
3008
- /* @__PURE__ */ jsx(ArrowLeft, { className: "mr-2 size-4", "aria-hidden": "true" }),
3009
- tr("fluidgrids.dataTables.backToWorkflows", "Back to Workflows")
3010
- ] }),
3011
- /* @__PURE__ */ jsxs(
3012
- Button,
3013
- {
3014
- onClick: () => {
3015
- setEditingTable(null);
3016
- setTableDialogOpen(true);
3029
+ /* @__PURE__ */ jsx(
3030
+ NextSteps,
3031
+ {
3032
+ storageKey: "data-tables",
3033
+ title: tr(
3034
+ "fluidgrids.dataTables.nextStepsTitle",
3035
+ "How to use Data Tables"
3036
+ ),
3037
+ steps: [
3038
+ {
3039
+ id: "create",
3040
+ label: tr(
3041
+ "fluidgrids.dataTables.nextStepCreateLabel",
3042
+ "Create a table"
3043
+ ),
3044
+ description: tr(
3045
+ "fluidgrids.dataTables.nextStepCreateDescription",
3046
+ "Define typed columns for the records your workflow needs."
3047
+ ),
3048
+ icon: /* @__PURE__ */ jsx(Plus, { className: "size-4", "aria-hidden": "true" }),
3049
+ onClick: () => {
3050
+ setEditingTable(null);
3051
+ setTableDialogOpen(true);
3052
+ }
3017
3053
  },
3018
- children: [
3019
- /* @__PURE__ */ jsx(Plus, { className: "mr-2 size-4", "aria-hidden": "true" }),
3020
- tr("fluidgrids.dataTables.newTable", "New data table")
3021
- ]
3022
- }
3023
- )
3024
- ] })
3025
- ] }),
3026
- /* @__PURE__ */ jsx(
3027
- NextSteps,
3028
- {
3029
- storageKey: "data-tables",
3030
- title: tr(
3031
- "fluidgrids.dataTables.nextStepsTitle",
3032
- "How to use Data Tables"
3033
- ),
3034
- steps: [
3035
- {
3036
- id: "create",
3037
- label: tr(
3038
- "fluidgrids.dataTables.nextStepCreateLabel",
3039
- "Create a table"
3040
- ),
3041
- description: tr(
3042
- "fluidgrids.dataTables.nextStepCreateDescription",
3043
- "Define typed columns for the records your workflow needs."
3044
- ),
3045
- icon: /* @__PURE__ */ jsx(Plus, { className: "size-4", "aria-hidden": "true" }),
3046
- onClick: () => {
3047
- setEditingTable(null);
3048
- setTableDialogOpen(true);
3049
- }
3050
- },
3051
- {
3052
- id: "connect",
3053
- label: tr(
3054
- "fluidgrids.dataTables.nextStepConnectLabel",
3055
- "Connect it to a workflow"
3056
- ),
3057
- description: tr(
3058
- "fluidgrids.dataTables.nextStepConnectDescription",
3059
- "Add a Data Table node to get, insert, update, upsert, or delete rows."
3060
- ),
3061
- icon: /* @__PURE__ */ jsx(Table2, { className: "size-4", "aria-hidden": "true" }),
3062
- onClick: () => navigate("../list")
3063
- },
3064
- {
3065
- id: "reuse",
3066
- label: tr(
3067
- "fluidgrids.dataTables.nextStepReuseLabel",
3068
- "Reuse data across runs"
3069
- ),
3070
- description: tr(
3071
- "fluidgrids.dataTables.nextStepReuseDescription",
3072
- "Use saved status, cursors, lookups, and deduplication keys on later runs."
3073
- ),
3074
- icon: /* @__PURE__ */ jsx(RefreshCw, { className: "size-4", "aria-hidden": "true" })
3075
- }
3076
- ]
3077
- }
3078
- ),
3079
- /* @__PURE__ */ jsxs("div", { className: "grid gap-5 lg:grid-cols-[minmax(16rem,22rem)_minmax(0,1fr)]", children: [
3080
- /* @__PURE__ */ jsxs(Card, { className: "h-fit border-border-secondary", children: [
3081
- /* @__PURE__ */ jsxs(CardHeader, { className: "gap-3 border-b border-border-secondary p-4", children: [
3082
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
3083
- /* @__PURE__ */ jsx(CardTitle, { className: "text-base", children: tr("fluidgrids.dataTables.tables", "Tables") }),
3084
- /* @__PURE__ */ jsx(Badge, { variant: "outline", children: total })
3085
- ] }),
3086
- /* @__PURE__ */ jsxs("form", { className: "flex gap-2", onSubmit: submitSearch, children: [
3087
- /* @__PURE__ */ jsxs("div", { className: "relative min-w-0 flex-1", children: [
3088
- /* @__PURE__ */ jsx(
3089
- Search,
3090
- {
3091
- className: "pointer-events-none absolute left-2.5 top-2.5 size-4 text-text-secondary",
3092
- "aria-hidden": "true"
3093
- }
3054
+ {
3055
+ id: "connect",
3056
+ label: tr(
3057
+ "fluidgrids.dataTables.nextStepConnectLabel",
3058
+ "Connect it to a workflow"
3094
3059
  ),
3095
- /* @__PURE__ */ jsx(
3096
- Input,
3097
- {
3098
- className: "pl-8",
3099
- value: searchInput,
3100
- onChange: (event) => setSearchInput(event.target.value),
3101
- placeholder: tr(
3102
- "fluidgrids.dataTables.search",
3103
- "Search tables"
3104
- ),
3105
- "aria-label": tr(
3106
- "fluidgrids.dataTables.search",
3107
- "Search tables"
3108
- )
3109
- }
3110
- )
3111
- ] }),
3112
- /* @__PURE__ */ jsx(Button, { type: "submit", variant: "outline", size: "sm", children: tr("fluidgrids.dataTables.searchAction", "Search") })
3113
- ] })
3114
- ] }),
3115
- /* @__PURE__ */ jsxs(CardContent, { className: "p-2", children: [
3116
- loading && /* @__PURE__ */ jsx("p", { className: "p-4 text-sm text-text-secondary", children: tr("fluidgrids.dataTables.loading", "Loading tables\u2026") }),
3117
- !loading && tables.length === 0 && /* @__PURE__ */ jsx(
3118
- IllustratedEmptyState,
3060
+ description: tr(
3061
+ "fluidgrids.dataTables.nextStepConnectDescription",
3062
+ "Add a Data Table node to get, insert, update, upsert, or delete rows."
3063
+ ),
3064
+ icon: /* @__PURE__ */ jsx(Table2, { className: "size-4", "aria-hidden": "true" }),
3065
+ onClick: () => navigate("../list")
3066
+ },
3119
3067
  {
3120
- className: "py-8",
3121
- illustration: "onboarding",
3122
- title: tr(
3123
- "fluidgrids.dataTables.empty",
3124
- "Create your first Data Table"
3068
+ id: "reuse",
3069
+ label: tr(
3070
+ "fluidgrids.dataTables.nextStepReuseLabel",
3071
+ "Reuse data across runs"
3125
3072
  ),
3126
3073
  description: tr(
3127
- "fluidgrids.dataTables.emptyHint",
3128
- "Give your workflows a shared place to store typed records across runs."
3074
+ "fluidgrids.dataTables.nextStepReuseDescription",
3075
+ "Use saved status, cursors, lookups, and deduplication keys on later runs."
3129
3076
  ),
3130
- action: /* @__PURE__ */ jsxs(
3131
- Button,
3132
- {
3133
- size: "sm",
3134
- onClick: () => {
3135
- setEditingTable(null);
3136
- setTableDialogOpen(true);
3137
- },
3138
- children: [
3139
- /* @__PURE__ */ jsx(Plus, { className: "mr-2 size-4", "aria-hidden": "true" }),
3140
- tr(
3141
- "fluidgrids.dataTables.createFirstTable",
3142
- "Create a table"
3143
- )
3144
- ]
3145
- }
3146
- )
3077
+ icon: /* @__PURE__ */ jsx(RefreshCw, { className: "size-4", "aria-hidden": "true" })
3147
3078
  }
3148
- ),
3149
- !loading && tables.map((table) => /* @__PURE__ */ jsxs(
3150
- "button",
3151
- {
3152
- type: "button",
3153
- onClick: () => setSelectedId(table.id),
3154
- className: `mb-1 flex w-full items-start justify-between gap-3 rounded-md px-3 py-3 text-left transition-colors ${selectedId === table.id ? "bg-background-tertiary text-text-primary" : "text-text-secondary hover:bg-background-secondary hover:text-text-primary"}`,
3155
- children: [
3156
- /* @__PURE__ */ jsxs("span", { className: "min-w-0", children: [
3157
- /* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-medium", children: table.name }),
3158
- /* @__PURE__ */ jsxs("span", { className: "mt-1 block text-xs text-text-secondary", children: [
3159
- table.rowCount,
3160
- " ",
3161
- tr("fluidgrids.dataTables.rows", "rows"),
3162
- " \xB7",
3163
- " ",
3164
- table.columns.length,
3165
- " ",
3166
- tr("fluidgrids.dataTables.columns", "columns")
3167
- ] })
3168
- ] }),
3079
+ ]
3080
+ }
3081
+ ),
3082
+ /* @__PURE__ */ jsxs("div", { className: "grid gap-5 xl:grid-cols-[minmax(16rem,22rem)_minmax(0,1fr)]", children: [
3083
+ /* @__PURE__ */ jsxs(Card, { className: "h-fit border-border-secondary", children: [
3084
+ /* @__PURE__ */ jsxs(CardHeader, { className: "gap-3 border-b border-border-secondary p-4", children: [
3085
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
3086
+ /* @__PURE__ */ jsx(CardTitle, { className: "text-base", children: tr("fluidgrids.dataTables.tables", "Tables") }),
3087
+ /* @__PURE__ */ jsx(Badge, { variant: "outline", children: total })
3088
+ ] }),
3089
+ /* @__PURE__ */ jsxs("form", { className: "flex gap-2", onSubmit: submitSearch, children: [
3090
+ /* @__PURE__ */ jsxs("div", { className: "relative min-w-0 flex-1", children: [
3169
3091
  /* @__PURE__ */ jsx(
3170
- Table2,
3092
+ Search,
3171
3093
  {
3172
- className: "mt-0.5 size-4 shrink-0",
3094
+ className: "pointer-events-none absolute left-2.5 top-2.5 size-4 text-text-secondary",
3173
3095
  "aria-hidden": "true"
3174
3096
  }
3097
+ ),
3098
+ /* @__PURE__ */ jsx(
3099
+ Input,
3100
+ {
3101
+ className: "pl-8",
3102
+ value: searchInput,
3103
+ onChange: (event) => setSearchInput(event.target.value),
3104
+ placeholder: tr(
3105
+ "fluidgrids.dataTables.search",
3106
+ "Search tables"
3107
+ ),
3108
+ "aria-label": tr(
3109
+ "fluidgrids.dataTables.search",
3110
+ "Search tables"
3111
+ )
3112
+ }
3113
+ )
3114
+ ] }),
3115
+ /* @__PURE__ */ jsx(Button, { type: "submit", variant: "outline", size: "sm", children: tr("fluidgrids.dataTables.searchAction", "Search") })
3116
+ ] })
3117
+ ] }),
3118
+ /* @__PURE__ */ jsxs(CardContent, { className: "max-h-72 overflow-y-auto p-2 xl:max-h-[36rem]", children: [
3119
+ loading && /* @__PURE__ */ jsx("p", { className: "p-4 text-sm text-text-secondary", children: tr("fluidgrids.dataTables.loading", "Loading tables\u2026") }),
3120
+ !loading && tables.length === 0 && /* @__PURE__ */ jsx(
3121
+ IllustratedEmptyState,
3122
+ {
3123
+ className: "py-8",
3124
+ illustration: "onboarding",
3125
+ title: tr(
3126
+ "fluidgrids.dataTables.empty",
3127
+ "Create your first Data Table"
3128
+ ),
3129
+ description: tr(
3130
+ "fluidgrids.dataTables.emptyHint",
3131
+ "Give your workflows a shared place to store typed records across runs."
3132
+ ),
3133
+ action: /* @__PURE__ */ jsxs(
3134
+ Button,
3135
+ {
3136
+ size: "sm",
3137
+ onClick: () => {
3138
+ setEditingTable(null);
3139
+ setTableDialogOpen(true);
3140
+ },
3141
+ children: [
3142
+ /* @__PURE__ */ jsx(Plus, { className: "mr-2 size-4", "aria-hidden": "true" }),
3143
+ tr(
3144
+ "fluidgrids.dataTables.createFirstTable",
3145
+ "Create a table"
3146
+ )
3147
+ ]
3148
+ }
3175
3149
  )
3150
+ }
3151
+ ),
3152
+ !loading && tables.map((table) => /* @__PURE__ */ jsxs(
3153
+ "button",
3154
+ {
3155
+ type: "button",
3156
+ onClick: () => setSelectedId(table.id),
3157
+ className: `mb-1 flex w-full items-start justify-between gap-3 rounded-md px-3 py-3 text-left transition-colors ${selectedId === table.id ? "bg-background-tertiary text-text-primary" : "text-text-secondary hover:bg-background-secondary hover:text-text-primary"}`,
3158
+ children: [
3159
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0", children: [
3160
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-medium", children: table.name }),
3161
+ /* @__PURE__ */ jsxs("span", { className: "mt-1 block text-xs text-text-secondary", children: [
3162
+ table.rowCount,
3163
+ " ",
3164
+ tr("fluidgrids.dataTables.rows", "rows"),
3165
+ " \xB7",
3166
+ " ",
3167
+ table.columns.length,
3168
+ " ",
3169
+ tr("fluidgrids.dataTables.columns", "columns")
3170
+ ] })
3171
+ ] }),
3172
+ /* @__PURE__ */ jsx(
3173
+ Table2,
3174
+ {
3175
+ className: "mt-0.5 size-4 shrink-0",
3176
+ "aria-hidden": "true"
3177
+ }
3178
+ )
3179
+ ]
3180
+ },
3181
+ table.id
3182
+ ))
3183
+ ] })
3184
+ ] }),
3185
+ error && !selectedTable && /* @__PURE__ */ jsx(Card, { className: "border-border-secondary", children: /* @__PURE__ */ jsxs(CardContent, { className: "p-6 text-sm text-text-secondary", children: [
3186
+ /* @__PURE__ */ jsx("p", { children: error.message }),
3187
+ /* @__PURE__ */ jsxs(
3188
+ Button,
3189
+ {
3190
+ className: "mt-4",
3191
+ variant: "outline",
3192
+ onClick: () => void refresh(),
3193
+ children: [
3194
+ /* @__PURE__ */ jsx(RefreshCw, { className: "mr-2 size-4", "aria-hidden": "true" }),
3195
+ tr("fluidgrids.dataTables.retry", "Try again")
3176
3196
  ]
3177
- },
3178
- table.id
3179
- ))
3180
- ] })
3181
- ] }),
3182
- error && !selectedTable && /* @__PURE__ */ jsx(Card, { className: "border-border-secondary", children: /* @__PURE__ */ jsxs(CardContent, { className: "p-6 text-sm text-text-secondary", children: [
3183
- /* @__PURE__ */ jsx("p", { children: error.message }),
3184
- /* @__PURE__ */ jsxs(
3185
- Button,
3186
- {
3187
- className: "mt-4",
3188
- variant: "outline",
3189
- onClick: () => void refresh(),
3190
- children: [
3191
- /* @__PURE__ */ jsx(RefreshCw, { className: "mr-2 size-4", "aria-hidden": "true" }),
3192
- tr("fluidgrids.dataTables.retry", "Try again")
3193
- ]
3194
- }
3195
- )
3196
- ] }) }),
3197
- !error && !selectedTable && !loading && /* @__PURE__ */ jsx(Card, { className: "border-border-secondary", children: /* @__PURE__ */ jsxs(CardContent, { className: "flex min-h-[22rem] flex-col items-center justify-center p-6 text-center", children: [
3198
- /* @__PURE__ */ jsx(
3199
- Database,
3197
+ }
3198
+ )
3199
+ ] }) }),
3200
+ !error && !selectedTable && !loading && /* @__PURE__ */ jsx(Card, { className: "border-border-secondary", children: /* @__PURE__ */ jsxs(CardContent, { className: "flex min-h-[22rem] flex-col items-center justify-center p-6 text-center", children: [
3201
+ /* @__PURE__ */ jsx(
3202
+ Database,
3203
+ {
3204
+ className: "mb-3 size-10 text-text-secondary",
3205
+ "aria-hidden": "true"
3206
+ }
3207
+ ),
3208
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold text-text-primary", children: tr(
3209
+ "fluidgrids.dataTables.selectTitle",
3210
+ "Select a data table"
3211
+ ) }),
3212
+ /* @__PURE__ */ jsx("p", { className: "mt-1 max-w-sm text-sm text-text-secondary", children: tr(
3213
+ "fluidgrids.dataTables.selectDescription",
3214
+ "Choose a table to view and edit its rows, or create your first table."
3215
+ ) })
3216
+ ] }) }),
3217
+ selectedTable && /* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsx(
3218
+ TableRowsPanel,
3200
3219
  {
3201
- className: "mb-3 size-10 text-text-secondary",
3202
- "aria-hidden": "true"
3203
- }
3204
- ),
3205
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold text-text-primary", children: tr(
3206
- "fluidgrids.dataTables.selectTitle",
3207
- "Select a data table"
3208
- ) }),
3209
- /* @__PURE__ */ jsx("p", { className: "mt-1 max-w-sm text-sm text-text-secondary", children: tr(
3210
- "fluidgrids.dataTables.selectDescription",
3211
- "Choose a table to view and edit its rows, or create your first table."
3212
- ) })
3213
- ] }) }),
3214
- selectedTable && /* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsx(
3215
- TableRowsPanel,
3216
- {
3217
- table: selectedTable,
3218
- onTableChanged: refresh,
3219
- onEditTable: () => {
3220
- setEditingTable(selectedTable);
3221
- setTableDialogOpen(true);
3220
+ table: selectedTable,
3221
+ onTableChanged: refresh,
3222
+ onEditTable: () => {
3223
+ setEditingTable(selectedTable);
3224
+ setTableDialogOpen(true);
3225
+ },
3226
+ onDeleteTable: handleDeleteTable,
3227
+ deletingTable: deleting
3222
3228
  },
3223
- onDeleteTable: handleDeleteTable,
3224
- deletingTable: deleting
3225
- },
3226
- selectedTable.id
3227
- ) })
3228
- ] })
3229
- ] }),
3230
- /* @__PURE__ */ jsx(
3231
- TableFormDialog,
3232
- {
3233
- open: tableDialogOpen,
3234
- table: editingTable,
3235
- onOpenChange: setTableDialogOpen,
3236
- onSaved: handleTableSaved
3237
- }
3238
- )
3239
- ] });
3229
+ selectedTable.id
3230
+ ) })
3231
+ ] })
3232
+ ] }),
3233
+ /* @__PURE__ */ jsx(
3234
+ TableFormDialog,
3235
+ {
3236
+ open: tableDialogOpen,
3237
+ table: editingTable,
3238
+ onOpenChange: setTableDialogOpen,
3239
+ onSaved: handleTableSaved
3240
+ }
3241
+ )
3242
+ ] })
3243
+ );
3240
3244
  }
3241
3245
 
3242
3246
  // src/graphql/client-helpers.ts