@docupace/ihub-config 1.1.25 → 1.1.26-sync.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.
Files changed (51) hide show
  1. package/dist/config-extension.d.ts +72 -1
  2. package/dist/config-extension.d.ts.map +1 -1
  3. package/dist/config-extension.js +2 -0
  4. package/dist/config-extension.js.map +1 -1
  5. package/dist/config-service.d.ts +31 -4
  6. package/dist/config-service.d.ts.map +1 -1
  7. package/dist/config-service.js +513 -24
  8. package/dist/config-service.js.map +1 -1
  9. package/dist/index.d.ts +4 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/lib/named-array-merge.d.ts +29 -0
  14. package/dist/lib/named-array-merge.d.ts.map +1 -0
  15. package/dist/lib/named-array-merge.js +158 -0
  16. package/dist/lib/named-array-merge.js.map +1 -0
  17. package/dist/mappers/config-mapper.d.ts.map +1 -1
  18. package/dist/mappers/config-mapper.js +2 -0
  19. package/dist/mappers/config-mapper.js.map +1 -1
  20. package/dist/model/graphs/config/fields.graphql +45 -0
  21. package/dist/model/graphs/config/menu.graphql +6 -0
  22. package/dist/model/graphs/config/page.graphql +8 -1
  23. package/dist/model/graphs/config/panel.graphql +7 -0
  24. package/dist/model/graphs/config/query.graphql +9 -1
  25. package/dist/model/graphs/config/selectOptions.graphql +1 -0
  26. package/dist/model/graphs/config/table.graphql +26 -0
  27. package/dist/model/graphs/config/ui-components.graphql +1 -0
  28. package/dist/providers/index.d.ts +4 -0
  29. package/dist/providers/index.d.ts.map +1 -1
  30. package/dist/providers/index.js +5 -0
  31. package/dist/providers/index.js.map +1 -1
  32. package/dist/providers/screen-layout-patch.d.ts +6 -0
  33. package/dist/providers/screen-layout-patch.d.ts.map +1 -0
  34. package/dist/providers/screen-layout-patch.js +57 -0
  35. package/dist/providers/screen-layout-patch.js.map +1 -0
  36. package/dist/providers/whole-patch.d.ts +6 -0
  37. package/dist/providers/whole-patch.d.ts.map +1 -0
  38. package/dist/providers/whole-patch.js +2 -0
  39. package/dist/providers/whole-patch.js.map +1 -0
  40. package/dist/types/graphql.d.ts +4 -2
  41. package/dist/types/graphql.d.ts.map +1 -1
  42. package/dist/types/graphql.js.map +1 -1
  43. package/model/graphs/config/fields.graphql +45 -0
  44. package/model/graphs/config/menu.graphql +6 -0
  45. package/model/graphs/config/page.graphql +8 -1
  46. package/model/graphs/config/panel.graphql +7 -0
  47. package/model/graphs/config/query.graphql +9 -1
  48. package/model/graphs/config/selectOptions.graphql +1 -0
  49. package/model/graphs/config/table.graphql +26 -0
  50. package/model/graphs/config/ui-components.graphql +1 -0
  51. package/package.json +5 -3
@@ -27,4 +27,11 @@ type PanelRow implements IPanelRow {
27
27
  title: String
28
28
  titleVariant: String
29
29
  visibilityCondition: String
30
+ """
31
+ Screen Designer: true when this group exists only via the screen layout patch — no
32
+ counterpart in the raw base config — vs. `false`/absent for a real group (whether or
33
+ not the patch also overrides some of its properties). See `Tab.custom` for the full
34
+ reasoning; stamped the same way, one level down the tree.
35
+ """
36
+ custom: Boolean
30
37
  }
@@ -1,6 +1,14 @@
1
1
 
2
2
  type PageQuery {
3
- getPageConfig(path: String, context: JSON): Page
3
+ """
4
+ impersonateRoleId / impersonateGeneral: preview this page's config as
5
+ someone else would see it — either a specific role (impersonateRoleId)
6
+ or the site default with no role/personal override at all
7
+ (impersonateGeneral) — restricted to admins by the host's identity
8
+ resolution (see docupace-graphql-server's resolveCurrentIdentity), which
9
+ throws for a non-admin caller.
10
+ """
11
+ getPageConfig(path: String, context: JSON, impersonateRoleId: ID, impersonateGeneral: Boolean): Page
4
12
  getAIConfig(path: String, context: JSON): JSON
5
13
  }
6
14
 
@@ -9,6 +9,7 @@ type SelectOptionsFilter {
9
9
  type QuerySelectOptions implements ISelectOptions {
10
10
  type: String
11
11
  labelProp: String # defaults to "name" in ui
12
+ labelExpression: String # JS expression evaluated against each option (e.g. "`${option.name} (${option.internalId})`"); takes precedence over labelProp when set
12
13
  valueProp: String # defaults to "id" in ui
13
14
  queryName: String!
14
15
  variableDefinitions: JSON
@@ -34,6 +34,19 @@ interface ITable {
34
34
  expandable: Expandable
35
35
  totals: [TotalsItem!]
36
36
  config: JSON
37
+ configPath: String
38
+ configurableAttributes: [ConfigurableAttribute!]
39
+ """Admin-defined columns not present in this table's own base `columns`, available to add via the Configure Columns dialog. Site/tenant-scoped catalog — see `$.predefinedColumns` under `configurableAttributes`."""
40
+ predefinedColumns: [Column!]
41
+ """Admin-defined filter criteria not present in this table's own base `filter.criteria`, available to add via the Configure Filters dialog. Site/tenant-scoped catalog — see `$.predefinedFilters` under `configurableAttributes`."""
42
+ predefinedFilters: [TableCriteria!]
43
+ }
44
+
45
+ """One overridable sub-element of a config object identified by `configPath` — see the parent's own `configPath` field for how the two combine (`${configPath}#${configSubPath}`)."""
46
+ type ConfigurableAttribute {
47
+ name: String! # e.g. "columns", "filter" — matches the field name on the parent type
48
+ configPath: String! # copy of the parent object's own configPath, for convenience
49
+ configSubPath: String! # JSONPath relative to the parent object, e.g. "$.columns"
37
50
  }
38
51
 
39
52
  type TotalsItem {
@@ -91,6 +104,8 @@ enum TablePinnedPosition {
91
104
 
92
105
  type Toolbar {
93
106
  columns: ToolbarColumns
107
+ configureColumns: ToolbarColumns
108
+ configureFilters: ToolbarColumns
94
109
  }
95
110
 
96
111
  type ToolbarColumns {
@@ -157,6 +172,11 @@ type TableCriteria {
157
172
  selectOptions: ISelectOptions
158
173
  min: Float
159
174
  max: Float
175
+ visible: Boolean
176
+ """Set when this criterion was added by `$ref`-referencing a predefined/base criterion (e.g. `"#$.predefinedFilters[?(@.name=='status')]"`) rather than being copied inline — see the config-path override merge in `config-service.ts`. Clients that re-save this criterion unchanged should keep sending the same `$ref` (as this value) rather than flattening it into a full copy."""
177
+ ref: String
178
+ """True when this criterion would still show up — present by name *and* not hidden — without the current scope's own override, i.e. from a broader layer (a role/site override, or the table's own base template `filter.criteria`). Drives two things in the Configure Filters editor. Hide-vs-delete: "remove" must hide (`visible: false`) an inherited criterion, since deleting it from the override would just have it reappear from the broader layer on the next read, while a non-inherited one can be deleted outright. And pin-on-add: re-adding a *non*-inherited criterion must write an explicit `visible: true`, or the broader layer's `visible: false` is inherited per-attribute by the name-keyed merge and the criterion stays invisible however it's re-added. Computed fresh on every read in `config-service.ts`'s `applyConfigPathOverride` against the layers below the identity's own scope tier (`ConfigurationOverrideResult.inheritedSubPaths`), never persisted."""
179
+ inherited: Boolean
160
180
  }
161
181
 
162
182
  enum TableFilterVariant {
@@ -170,12 +190,18 @@ type Column {
170
190
  visible: Boolean
171
191
  paths: [String!]
172
192
  expression: String
193
+ """Which predefined formatter (if any) generated `expression` — e.g. `"commaList"`, `"custom"` — see `EXPRESSION_FORMATTERS`/`CUSTOM_FORMATTER_ID` in docupace-ui-main's `expressionGeneration.ts`. Absent for the raw/no-formatting default, which stores neither this nor `expression` at all. Without this field, a column's `expression` round-trips but the formatter that produced it doesn't, so the Configure Columns editor can't tell "built from a known formatter" apart from "hand-authored custom script" on reload and always falls back to showing the latter."""
194
+ formatterName: String
173
195
  component: String
174
196
  sortable: Boolean
175
197
  flex: Float
176
198
  pinned: TablePinnedPosition
177
199
  config: JSON
178
200
  filter: ColumnFilter
201
+ """Set when this column was added by `$ref`-referencing a predefined/base column (e.g. `"#$.predefinedColumns[?(@.name=='email')]"`) rather than being copied inline — see the config-path override merge in `config-service.ts`. Clients that re-save this column unchanged should keep sending the same `$ref` (as this value) rather than flattening it into a full copy."""
202
+ ref: String
203
+ """True when this column would still show up — present by name *and* not hidden — without the current scope's own override, i.e. from a broader layer (a role/site override, or the table's own base template `columns`). Drives hide-vs-delete and pin-on-add in the Configure Columns editor — see `TableCriteria.inherited`'s doc comment for the full reasoning, identical here."""
204
+ inherited: Boolean
179
205
  }
180
206
 
181
207
  type ColumnFilter {
@@ -8,4 +8,5 @@ type TextElement implements IRowElement & IElement {
8
8
  valueExpression: String
9
9
  variant: String
10
10
  visibilityCondition: String
11
+ custom: Boolean
11
12
  }
@@ -1,4 +1,8 @@
1
1
  import { ConfigProviders } from './base-config.js';
2
+ import type { WholePatchMergers } from './whole-patch.js';
2
3
  export declare const builtInProviders: ConfigProviders;
4
+ export declare const builtInWholePatchMergers: WholePatchMergers;
3
5
  export type { ConfigProviders } from './base-config.js';
6
+ export type { WholePatchMerger, WholePatchMergers } from './whole-patch.js';
7
+ export { SCREEN_LAYOUT_PATCH_CONTENT_TYPE } from './screen-layout-patch.js';
4
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,eAAO,MAAM,gBAAgB,EAAE,eAE9B,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAMnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,eAAO,MAAM,gBAAgB,EAAE,eAE9B,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,iBAEtC,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC"}
@@ -1,5 +1,10 @@
1
1
  import { DashboardPageConfigProvider } from './dashboard-page-config.js';
2
+ import { ScreenLayoutPatchMerger, SCREEN_LAYOUT_PATCH_CONTENT_TYPE, } from './screen-layout-patch.js';
2
3
  export const builtInProviders = {
3
4
  DashboardPage: DashboardPageConfigProvider,
4
5
  };
6
+ export const builtInWholePatchMergers = {
7
+ [SCREEN_LAYOUT_PATCH_CONTENT_TYPE]: new ScreenLayoutPatchMerger(),
8
+ };
9
+ export { SCREEN_LAYOUT_PATCH_CONTENT_TYPE } from './screen-layout-patch.js';
5
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAEzE,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,aAAa,EAAE,2BAA2B;CAC3C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EACL,uBAAuB,EACvB,gCAAgC,GACjC,MAAM,0BAA0B,CAAC;AAGlC,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,aAAa,EAAE,2BAA2B;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAsB;IACzD,CAAC,gCAAgC,CAAC,EAAE,IAAI,uBAAuB,EAAE;CAClE,CAAC;AAIF,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { WholePatchMerger } from './whole-patch.js';
2
+ export declare const SCREEN_LAYOUT_PATCH_CONTENT_TYPE = "application/x-screen-layout-patch+json";
3
+ export declare class ScreenLayoutPatchMerger implements WholePatchMerger {
4
+ merge(processedObj: any, patch: any): any;
5
+ }
6
+ //# sourceMappingURL=screen-layout-patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-layout-patch.d.ts","sourceRoot":"","sources":["../../src/providers/screen-layout-patch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAKzD,eAAO,MAAM,gCAAgC,2CACH,CAAC;AAW3C,qBAAa,uBAAwB,YAAW,gBAAgB;IAC9D,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG;CA4D1C"}
@@ -0,0 +1,57 @@
1
+ import { mergeMatchedFields, } from '../lib/named-array-merge.js';
2
+ // `Configuration.value` is typed CLOB, but the underlying attribute is JSON — for a
3
+ // JSON-shaped value like a screen layout patch, it can come back already parsed as an
4
+ // object rather than as the JSON string it was saved as.
5
+ export const SCREEN_LAYOUT_PATCH_CONTENT_TYPE = 'application/x-screen-layout-patch+json';
6
+ // A Screen Designer override entry counts as "self-contained" when it carries a
7
+ // `__typename` — every full tab/row/element node the client builds for a brand-new,
8
+ // not-yet-in-the-base-config entry always does (see `AddElementDialog.buildDefaultNode`
9
+ // and the client's new-tab/new-row construction), while a thin `{ name, ...diffs }`
10
+ // reference to an existing base node never does.
11
+ function isSelfContainedScreenLayoutNode(item) {
12
+ return typeof item.__typename === 'string' && item.__typename.length > 0;
13
+ }
14
+ export class ScreenLayoutPatchMerger {
15
+ merge(processedObj, patch) {
16
+ // A screen layout patch is always tabs-shaped (`{ tabs: [...] }`), but the config
17
+ // path it's saved against doesn't have to resolve to a bare `TabbedPage` — a modal
18
+ // config like `modals/select-account-holder` resolves to an `AnyPage` that wraps
19
+ // the real `TabbedPage` via `tabbedPages[0]` (a `$ref`, in that case). Detect that
20
+ // shape and merge onto the nested TabbedPage instead, so the patch lands on
21
+ // `tabbedPages[0].tabs` rather than a same-named `tabs` field bolted onto the
22
+ // AnyPage root (which `mergeMatchedFields` would otherwise do silently, since
23
+ // `tabbedPages` itself doesn't qualify as a named-object array to recurse into —
24
+ // `TabbedPage` has no `name` field).
25
+ if (!processedObj?.tabs && Array.isArray(processedObj?.tabbedPages)) {
26
+ const [tabbedPage, ...restTabbedPages] = processedObj.tabbedPages;
27
+ return {
28
+ ...processedObj,
29
+ tabbedPages: [
30
+ mergeMatchedFields(tabbedPage, patch, isSelfContainedScreenLayoutNode, true),
31
+ ...restTabbedPages,
32
+ ],
33
+ };
34
+ }
35
+ // A `WizardPage` (e.g. `contacts/add-new-contact`) has no `tabs`/`tabbedPages` of
36
+ // its own — its `TabbedPage`(s) live nested one level down, at `steps[].page`. A
37
+ // wizard can carry more than one `TabbedPage` step (add-new-contact has both
38
+ // `enterContactInformation` and `reviewContactInformation`, mutually exclusive by
39
+ // `visibilityCondition` but $ref-ing the identical tabs) — apply the same patch to
40
+ // every step whose `page.tabs` exists, so whichever step is actually visible at
41
+ // runtime reflects the edit, and leave every other step (ComponentPage, etc.)
42
+ // untouched.
43
+ if (!processedObj?.tabbedPages && Array.isArray(processedObj?.steps)) {
44
+ return {
45
+ ...processedObj,
46
+ steps: processedObj.steps.map((step) => step?.page?.tabs
47
+ ? {
48
+ ...step,
49
+ page: mergeMatchedFields(step.page, patch, isSelfContainedScreenLayoutNode, true),
50
+ }
51
+ : step),
52
+ };
53
+ }
54
+ return mergeMatchedFields(processedObj, patch, isSelfContainedScreenLayoutNode, true);
55
+ }
56
+ }
57
+ //# sourceMappingURL=screen-layout-patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-layout-patch.js","sourceRoot":"","sources":["../../src/providers/screen-layout-patch.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AAGrC,oFAAoF;AACpF,sFAAsF;AACtF,yDAAyD;AACzD,MAAM,CAAC,MAAM,gCAAgC,GAC3C,wCAAwC,CAAC;AAE3C,gFAAgF;AAChF,oFAAoF;AACpF,wFAAwF;AACxF,oFAAoF;AACpF,iDAAiD;AACjD,SAAS,+BAA+B,CAAC,IAAiB;IACxD,OAAO,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,OAAO,uBAAuB;IAClC,KAAK,CAAC,YAAiB,EAAE,KAAU;QACjC,kFAAkF;QAClF,mFAAmF;QACnF,iFAAiF;QACjF,mFAAmF;QACnF,4EAA4E;QAC5E,8EAA8E;QAC9E,8EAA8E;QAC9E,iFAAiF;QACjF,qCAAqC;QACrC,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;YACpE,MAAM,CAAC,UAAU,EAAE,GAAG,eAAe,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC;YAClE,OAAO;gBACL,GAAG,YAAY;gBACf,WAAW,EAAE;oBACX,kBAAkB,CAChB,UAAU,EACV,KAAK,EACL,+BAA+B,EAC/B,IAAI,CACL;oBACD,GAAG,eAAe;iBACnB;aACF,CAAC;QACJ,CAAC;QAED,kFAAkF;QAClF,iFAAiF;QACjF,6EAA6E;QAC7E,kFAAkF;QAClF,mFAAmF;QACnF,gFAAgF;QAChF,8EAA8E;QAC9E,aAAa;QACb,IAAI,CAAC,YAAY,EAAE,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;YACrE,OAAO;gBACL,GAAG,YAAY;gBACf,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAC1C,IAAI,EAAE,IAAI,EAAE,IAAI;oBACd,CAAC,CAAC;wBACE,GAAG,IAAI;wBACP,IAAI,EAAE,kBAAkB,CACtB,IAAI,CAAC,IAAI,EACT,KAAK,EACL,+BAA+B,EAC/B,IAAI,CACL;qBACF;oBACH,CAAC,CAAC,IAAI,CACT;aACF,CAAC;QACJ,CAAC;QAED,OAAO,kBAAkB,CACvB,YAAY,EACZ,KAAK,EACL,+BAA+B,EAC/B,IAAI,CACL,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export interface WholePatchMerger {
2
+ /** Merges a parsed whole-patch document onto the fully processed config. */
3
+ merge(processedObj: any, patch: any): any;
4
+ }
5
+ export type WholePatchMergers = Record<string, WholePatchMerger>;
6
+ //# sourceMappingURL=whole-patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whole-patch.d.ts","sourceRoot":"","sources":["../../src/providers/whole-patch.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC;CAC3C;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=whole-patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whole-patch.js","sourceRoot":"","sources":["../../src/providers/whole-patch.ts"],"names":[],"mappings":""}
@@ -174,8 +174,9 @@ export type Breadcrumb = {
174
174
  __typename?: 'Breadcrumb';
175
175
  isLabelExpression?: Maybe<Scalars['Boolean']['output']>;
176
176
  isPathExpression?: Maybe<Scalars['Boolean']['output']>;
177
- label: Scalars['String']['output'];
177
+ label?: Maybe<Scalars['String']['output']>;
178
178
  path?: Maybe<Scalars['String']['output']>;
179
+ valuePaths?: Maybe<Array<Scalars['String']['output']>>;
179
180
  };
180
181
  export type Card = ICard & IElement & IRowElement & {
181
182
  __typename?: 'Card';
@@ -1974,8 +1975,9 @@ export type BooleanFieldRuleResolvers<ContextType = any, ParentType extends Reso
1974
1975
  export type BreadcrumbResolvers<ContextType = any, ParentType extends ResolversParentTypes['Breadcrumb'] = ResolversParentTypes['Breadcrumb']> = {
1975
1976
  isLabelExpression?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
1976
1977
  isPathExpression?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
1977
- label?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1978
+ label?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1978
1979
  path?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1980
+ valuePaths?: Resolver<Maybe<Array<ResolversTypes['String']>>, ParentType, ContextType>;
1979
1981
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1980
1982
  };
1981
1983
  export type CardResolvers<ContextType = any, ParentType extends ResolversParentTypes['Card'] = ResolversParentTypes['Card']> = {