@rhc-office/sdk 6.6.256

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 (126) hide show
  1. package/README.md +176 -0
  2. package/dist/api/annotation-tool.d.ts +127 -0
  3. package/dist/api/annotation-tool.d.ts.map +1 -0
  4. package/dist/api/callbacks.d.ts +25 -0
  5. package/dist/api/callbacks.d.ts.map +1 -0
  6. package/dist/api/common.d.ts +83 -0
  7. package/dist/api/common.d.ts.map +1 -0
  8. package/dist/api/crypto-tool.d.ts +9 -0
  9. package/dist/api/crypto-tool.d.ts.map +1 -0
  10. package/dist/api/digital-sign-environment.d.ts +100 -0
  11. package/dist/api/digital-sign-environment.d.ts.map +1 -0
  12. package/dist/api/document-sdk.d.ts +111 -0
  13. package/dist/api/document-sdk.d.ts.map +1 -0
  14. package/dist/api/document-tool.d.ts +68 -0
  15. package/dist/api/document-tool.d.ts.map +1 -0
  16. package/dist/api/ekey-tool.d.ts +8 -0
  17. package/dist/api/ekey-tool.d.ts.map +1 -0
  18. package/dist/api/extension-tool.d.ts +5 -0
  19. package/dist/api/extension-tool.d.ts.map +1 -0
  20. package/dist/api/find-tool.d.ts +6 -0
  21. package/dist/api/find-tool.d.ts.map +1 -0
  22. package/dist/api/menu-visibility.d.ts +16 -0
  23. package/dist/api/menu-visibility.d.ts.map +1 -0
  24. package/dist/api/networking-tool.d.ts +7 -0
  25. package/dist/api/networking-tool.d.ts.map +1 -0
  26. package/dist/api/page-tool.d.ts +28 -0
  27. package/dist/api/page-tool.d.ts.map +1 -0
  28. package/dist/api/pdf-formfiller.d.ts +12 -0
  29. package/dist/api/pdf-formfiller.d.ts.map +1 -0
  30. package/dist/api/review-tool.d.ts +71 -0
  31. package/dist/api/review-tool.d.ts.map +1 -0
  32. package/dist/api/sign-server.d.ts +32 -0
  33. package/dist/api/sign-server.d.ts.map +1 -0
  34. package/dist/api/sign-tool.d.ts +31 -0
  35. package/dist/api/sign-tool.d.ts.map +1 -0
  36. package/dist/api/symbology-tool.d.ts +4 -0
  37. package/dist/api/symbology-tool.d.ts.map +1 -0
  38. package/dist/api/template-sign.d.ts +88 -0
  39. package/dist/api/template-sign.d.ts.map +1 -0
  40. package/dist/api/ui-tool.d.ts +35 -0
  41. package/dist/api/ui-tool.d.ts.map +1 -0
  42. package/dist/api/watermark.d.ts +25 -0
  43. package/dist/api/watermark.d.ts.map +1 -0
  44. package/dist/index.d.ts +23 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +1061 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/index.umd.cjs +2 -0
  49. package/dist/index.umd.cjs.map +1 -0
  50. package/dist/tools/DocumentToolImpl.d.ts +27 -0
  51. package/dist/tools/DocumentToolImpl.d.ts.map +1 -0
  52. package/dist/tools/FindToolImpl.d.ts +10 -0
  53. package/dist/tools/FindToolImpl.d.ts.map +1 -0
  54. package/dist/tools/NetworkingToolImpl.d.ts +10 -0
  55. package/dist/tools/NetworkingToolImpl.d.ts.map +1 -0
  56. package/dist/tools/PageToolImpl.d.ts +31 -0
  57. package/dist/tools/PageToolImpl.d.ts.map +1 -0
  58. package/dist/tools/PdfFormFillerImpl.d.ts +13 -0
  59. package/dist/tools/PdfFormFillerImpl.d.ts.map +1 -0
  60. package/dist/tools/Phase1ToolPlaceholder.d.ts +5 -0
  61. package/dist/tools/Phase1ToolPlaceholder.d.ts.map +1 -0
  62. package/dist/tools/SDKValueObjects.d.ts +55 -0
  63. package/dist/tools/SDKValueObjects.d.ts.map +1 -0
  64. package/dist/tools/UIToolImpl.d.ts +31 -0
  65. package/dist/tools/UIToolImpl.d.ts.map +1 -0
  66. package/dist/tools/index.d.ts +9 -0
  67. package/dist/tools/index.d.ts.map +1 -0
  68. package/dist/viewer/AdapterProtocol.d.ts +78 -0
  69. package/dist/viewer/AdapterProtocol.d.ts.map +1 -0
  70. package/dist/viewer/BridgeToolAdapter.d.ts +23 -0
  71. package/dist/viewer/BridgeToolAdapter.d.ts.map +1 -0
  72. package/dist/viewer/DocumentSDK.d.ts +85 -0
  73. package/dist/viewer/DocumentSDK.d.ts.map +1 -0
  74. package/dist/viewer/ReaderBridgeClient.d.ts +31 -0
  75. package/dist/viewer/ReaderBridgeClient.d.ts.map +1 -0
  76. package/dist/viewer/ReaderConfiguration.d.ts +11 -0
  77. package/dist/viewer/ReaderConfiguration.d.ts.map +1 -0
  78. package/dist/viewer/ReaderScriptLoader.d.ts +10 -0
  79. package/dist/viewer/ReaderScriptLoader.d.ts.map +1 -0
  80. package/dist/viewer/ReaderStateStore.d.ts +21 -0
  81. package/dist/viewer/ReaderStateStore.d.ts.map +1 -0
  82. package/dist/viewer/SdkCallbackRegistry.d.ts +18 -0
  83. package/dist/viewer/SdkCallbackRegistry.d.ts.map +1 -0
  84. package/dist/viewer/index.d.ts +2 -0
  85. package/dist/viewer/index.d.ts.map +1 -0
  86. package/package.json +48 -0
  87. package/src/api/annotation-tool.ts +199 -0
  88. package/src/api/callbacks.ts +59 -0
  89. package/src/api/common.ts +117 -0
  90. package/src/api/crypto-tool.ts +10 -0
  91. package/src/api/digital-sign-environment.ts +411 -0
  92. package/src/api/document-sdk.ts +152 -0
  93. package/src/api/document-tool.ts +106 -0
  94. package/src/api/ekey-tool.ts +11 -0
  95. package/src/api/extension-tool.ts +5 -0
  96. package/src/api/find-tool.ts +7 -0
  97. package/src/api/menu-visibility.ts +17 -0
  98. package/src/api/networking-tool.ts +9 -0
  99. package/src/api/page-tool.ts +56 -0
  100. package/src/api/pdf-formfiller.ts +13 -0
  101. package/src/api/review-tool.ts +105 -0
  102. package/src/api/sign-server.ts +53 -0
  103. package/src/api/sign-tool.ts +50 -0
  104. package/src/api/symbology-tool.ts +11 -0
  105. package/src/api/template-sign.ts +102 -0
  106. package/src/api/ui-tool.ts +66 -0
  107. package/src/api/watermark.ts +35 -0
  108. package/src/index.ts +22 -0
  109. package/src/tools/DocumentToolImpl.ts +158 -0
  110. package/src/tools/FindToolImpl.ts +32 -0
  111. package/src/tools/NetworkingToolImpl.ts +36 -0
  112. package/src/tools/PageToolImpl.ts +181 -0
  113. package/src/tools/PdfFormFillerImpl.ts +67 -0
  114. package/src/tools/Phase1ToolPlaceholder.ts +35 -0
  115. package/src/tools/SDKValueObjects.ts +172 -0
  116. package/src/tools/UIToolImpl.ts +145 -0
  117. package/src/tools/index.ts +8 -0
  118. package/src/viewer/AdapterProtocol.ts +114 -0
  119. package/src/viewer/BridgeToolAdapter.ts +137 -0
  120. package/src/viewer/DocumentSDK.ts +688 -0
  121. package/src/viewer/ReaderBridgeClient.ts +216 -0
  122. package/src/viewer/ReaderConfiguration.ts +59 -0
  123. package/src/viewer/ReaderScriptLoader.ts +130 -0
  124. package/src/viewer/ReaderStateStore.ts +55 -0
  125. package/src/viewer/SdkCallbackRegistry.ts +89 -0
  126. package/src/viewer/index.ts +1 -0
@@ -0,0 +1,145 @@
1
+ import type { UITool } from '../api/ui-tool';
2
+ import {
3
+ createBridgeToolAdapter,
4
+ type BridgeToolAdapterContext,
5
+ type BridgeToolDescriptor,
6
+ } from '../viewer/BridgeToolAdapter';
7
+
8
+ const BOOK_VIEW_PAGE_MODES = new Set([2, 5]);
9
+
10
+ const createUIToolDescriptor = (context: BridgeToolAdapterContext): BridgeToolDescriptor => ({
11
+ showToolbarMenu: { kind: 'command' },
12
+ hideToolbarMenu: { kind: 'command' },
13
+ setupToolbarMenu: { kind: 'command' },
14
+ showToolbarMenuItem: { kind: 'command' },
15
+ hideToolbarMenuItem: { kind: 'command' },
16
+ setupRibbonMenu: { kind: 'command' },
17
+ setupRibbonMenuItem: { kind: 'command' },
18
+ setupRibbonTitleBar: { kind: 'command' },
19
+ showRibbonMenu: { kind: 'command' },
20
+ hideRibbonMenu: { kind: 'command' },
21
+ showRibbonMenuItem: { kind: 'command' },
22
+ hideRibbonMenuItem: { kind: 'command' },
23
+ showRibbonTitleBar: { kind: 'command' },
24
+ hideRibbonTitleBar: { kind: 'command' },
25
+ selectRibbonMenu: { kind: 'command' },
26
+ setRibbonMenuButtonStyle: { kind: 'command' },
27
+ setWatermark: { kind: 'command' },
28
+ setCompactMode: { kind: 'command' },
29
+ enterBookViewMode: {
30
+ kind: 'callbackQuery',
31
+ mapCallbackResult: () => [],
32
+ },
33
+ exitBookViewMode: { kind: 'command' },
34
+ isBookViewActivated: {
35
+ kind: 'stateGetter',
36
+ state: () => BOOK_VIEW_PAGE_MODES.has(context.state.snapshot().pageMode),
37
+ },
38
+ requestFullScreen: { kind: 'command' },
39
+ exitFullScreen: { kind: 'command' },
40
+ invalidateView: { kind: 'command' },
41
+ });
42
+
43
+ export class UIToolImpl implements UITool {
44
+ private readonly adapter: UITool;
45
+
46
+ constructor(context: BridgeToolAdapterContext) {
47
+ this.adapter = createBridgeToolAdapter<UITool>('ui', createUIToolDescriptor(context), context);
48
+ }
49
+
50
+ showToolbarMenu: UITool['showToolbarMenu'] = () => {
51
+ return this.adapter.showToolbarMenu();
52
+ };
53
+
54
+ hideToolbarMenu: UITool['hideToolbarMenu'] = () => {
55
+ return this.adapter.hideToolbarMenu();
56
+ };
57
+
58
+ setupToolbarMenu: UITool['setupToolbarMenu'] = (opt) => {
59
+ return this.adapter.setupToolbarMenu(opt);
60
+ };
61
+
62
+ showToolbarMenuItem: UITool['showToolbarMenuItem'] = (menuId) => {
63
+ return this.adapter.showToolbarMenuItem(menuId);
64
+ };
65
+
66
+ hideToolbarMenuItem: UITool['hideToolbarMenuItem'] = (menuId) => {
67
+ return this.adapter.hideToolbarMenuItem(menuId);
68
+ };
69
+
70
+ setupRibbonMenu: UITool['setupRibbonMenu'] = (opt) => {
71
+ return this.adapter.setupRibbonMenu(opt);
72
+ };
73
+
74
+ setupRibbonMenuItem: UITool['setupRibbonMenuItem'] = (menuId, visible, config) => {
75
+ return this.adapter.setupRibbonMenuItem(menuId, visible, config);
76
+ };
77
+
78
+ setupRibbonTitleBar: UITool['setupRibbonTitleBar'] = (visible) => {
79
+ return this.adapter.setupRibbonTitleBar(visible);
80
+ };
81
+
82
+ showRibbonMenu: UITool['showRibbonMenu'] = () => {
83
+ return this.adapter.showRibbonMenu();
84
+ };
85
+
86
+ hideRibbonMenu: UITool['hideRibbonMenu'] = () => {
87
+ return this.adapter.hideRibbonMenu();
88
+ };
89
+
90
+ showRibbonMenuItem: UITool['showRibbonMenuItem'] = (menuId, config) => {
91
+ return this.adapter.showRibbonMenuItem(menuId, config);
92
+ };
93
+
94
+ hideRibbonMenuItem: UITool['hideRibbonMenuItem'] = (menuId, config) => {
95
+ return this.adapter.hideRibbonMenuItem(menuId, config);
96
+ };
97
+
98
+ showRibbonTitleBar: UITool['showRibbonTitleBar'] = () => {
99
+ return this.adapter.showRibbonTitleBar();
100
+ };
101
+
102
+ hideRibbonTitleBar: UITool['hideRibbonTitleBar'] = () => {
103
+ return this.adapter.hideRibbonTitleBar();
104
+ };
105
+
106
+ selectRibbonMenu: UITool['selectRibbonMenu'] = (menuId) => {
107
+ return this.adapter.selectRibbonMenu(menuId);
108
+ };
109
+
110
+ setRibbonMenuButtonStyle: UITool['setRibbonMenuButtonStyle'] = (buttonId, buttonStyle) => {
111
+ return this.adapter.setRibbonMenuButtonStyle(buttonId, buttonStyle);
112
+ };
113
+
114
+ setWatermark: UITool['setWatermark'] = (fields) => {
115
+ return this.adapter.setWatermark(fields);
116
+ };
117
+
118
+ setCompactMode: UITool['setCompactMode'] = (compact) => {
119
+ return this.adapter.setCompactMode(compact);
120
+ };
121
+
122
+ enterBookViewMode: UITool['enterBookViewMode'] = (callback) => {
123
+ return this.adapter.enterBookViewMode(callback);
124
+ };
125
+
126
+ exitBookViewMode: UITool['exitBookViewMode'] = () => {
127
+ return this.adapter.exitBookViewMode();
128
+ };
129
+
130
+ isBookViewActivated: UITool['isBookViewActivated'] = () => {
131
+ return this.adapter.isBookViewActivated();
132
+ };
133
+
134
+ requestFullScreen: UITool['requestFullScreen'] = () => {
135
+ return this.adapter.requestFullScreen();
136
+ };
137
+
138
+ exitFullScreen: UITool['exitFullScreen'] = () => {
139
+ return this.adapter.exitFullScreen();
140
+ };
141
+
142
+ invalidateView: UITool['invalidateView'] = () => {
143
+ return this.adapter.invalidateView();
144
+ };
145
+ }
@@ -0,0 +1,8 @@
1
+ export * from './DocumentToolImpl';
2
+ export * from './FindToolImpl';
3
+ export * from './NetworkingToolImpl';
4
+ export * from './PageToolImpl';
5
+ export * from './PdfFormFillerImpl';
6
+ export * from './Phase1ToolPlaceholder';
7
+ export * from './SDKValueObjects';
8
+ export * from './UIToolImpl';
@@ -0,0 +1,114 @@
1
+ export const RHC_OFFICE_ADAPTER_PROTOCOL = 'rhc-office.editor-adapter';
2
+ export const RHC_OFFICE_ADAPTER_VERSION = 1;
3
+ export const RHC_OFFICE_ADAPTER_GLOBAL = '__RHC_OFFICE_EDITOR_ADAPTER__';
4
+ export const RHC_OFFICE_ADAPTER_READY_EVENT = 'rhcOfficeAdapterReady';
5
+ export const RHC_OFFICE_ADAPTER_EVENT = 'rhcOfficeAdapterEvent';
6
+ export const RHC_OFFICE_READER_ID_ATTRIBUTE = 'data-rhc-office-reader-id';
7
+
8
+ export type AdapterToolName =
9
+ | 'document'
10
+ | 'page'
11
+ | 'ui'
12
+ | 'find'
13
+ | 'annotation'
14
+ | 'digitalSign'
15
+ | 'signServer'
16
+ | 'review'
17
+ | 'ekey'
18
+ | 'symbology'
19
+ | 'templateSign'
20
+ | 'pdfFormFiller'
21
+ | 'extension'
22
+ | 'networking'
23
+ | 'crypto';
24
+
25
+ export type AdapterErrorCode =
26
+ | 'ADAPTER_UNAVAILABLE'
27
+ | 'READER_NOT_READY'
28
+ | 'READER_NOT_FOUND'
29
+ | 'COMMAND_NOT_FOUND'
30
+ | 'NOT_IMPLEMENTED'
31
+ | 'INVALID_PARAMS'
32
+ | 'EXECUTION_FAILED'
33
+ | 'TIMEOUT';
34
+
35
+ export interface AdapterError {
36
+ code: AdapterErrorCode;
37
+ message: string;
38
+ details?: unknown;
39
+ }
40
+
41
+ export interface AdapterRequest<TParams = unknown> {
42
+ protocol: typeof RHC_OFFICE_ADAPTER_PROTOCOL;
43
+ version: typeof RHC_OFFICE_ADAPTER_VERSION;
44
+ requestId: string;
45
+ readerId: string;
46
+ tool: AdapterToolName;
47
+ method: string;
48
+ params?: TParams;
49
+ }
50
+
51
+ export type AdapterResponse<TResult = unknown> =
52
+ | {
53
+ ok: true;
54
+ requestId: string;
55
+ result: TResult;
56
+ }
57
+ | {
58
+ ok: false;
59
+ requestId: string;
60
+ error: AdapterError;
61
+ };
62
+
63
+ export interface AdapterCommandCapability {
64
+ implemented: boolean;
65
+ method: string;
66
+ tool: AdapterToolName;
67
+ }
68
+
69
+ export interface AdapterCapabilityManifest {
70
+ version: typeof RHC_OFFICE_ADAPTER_VERSION;
71
+ tools: AdapterToolName[];
72
+ commands: AdapterCommandCapability[];
73
+ }
74
+
75
+ export interface AdapterStatePatch {
76
+ documentOpened?: boolean;
77
+ documentModified?: boolean;
78
+ pageCount?: number;
79
+ pageIndex?: number;
80
+ pageMode?: number;
81
+ zoomLevel?: number;
82
+ documentType?: string;
83
+ annotationMode?: string;
84
+ annotationEnabled?: boolean;
85
+ extensionState?: 'connected' | 'disconnected';
86
+ }
87
+
88
+ export interface AdapterEvent<TPayload = unknown> {
89
+ protocol: typeof RHC_OFFICE_ADAPTER_PROTOCOL;
90
+ version: typeof RHC_OFFICE_ADAPTER_VERSION;
91
+ readerId: string;
92
+ event: string;
93
+ payload?: TPayload;
94
+ statePatch?: AdapterStatePatch;
95
+ }
96
+
97
+ export interface AdapterReadyEventDetail {
98
+ protocol: typeof RHC_OFFICE_ADAPTER_PROTOCOL;
99
+ version: typeof RHC_OFFICE_ADAPTER_VERSION;
100
+ readerId: string;
101
+ }
102
+
103
+ export interface AdapterReaderSession {
104
+ readerId: string;
105
+ capabilities: AdapterCapabilityManifest;
106
+ request(request: AdapterRequest): Promise<AdapterResponse>;
107
+ }
108
+
109
+ export interface AdapterGlobal {
110
+ registerReader(session: AdapterReaderSession): void;
111
+ unregisterReader(readerId: string): void;
112
+ request(request: AdapterRequest): Promise<AdapterResponse>;
113
+ getCapabilities(readerId: string): AdapterCapabilityManifest | null;
114
+ }
@@ -0,0 +1,137 @@
1
+ import type { AdapterToolName } from './AdapterProtocol';
2
+ import type { ReaderBridgeClient } from './ReaderBridgeClient';
3
+ import type { SdkCallbackRegistry } from './SdkCallbackRegistry';
4
+ import type { ReaderStateStore } from './ReaderStateStore';
5
+
6
+ export type BridgeMethodKind =
7
+ | 'callbackQuery'
8
+ | 'callbackRegister'
9
+ | 'command'
10
+ | 'query'
11
+ | 'stateGetter';
12
+
13
+ export interface BridgeToolMethodDescriptor {
14
+ adapterMethod?: string;
15
+ callback?: (callbacks: SdkCallbackRegistry, args: unknown[]) => void;
16
+ mapCallbackResult?: (result: unknown) => unknown[];
17
+ kind: BridgeMethodKind;
18
+ state?: (state: ReturnType<ReaderStateStore['snapshot']>, args: unknown[]) => unknown;
19
+ }
20
+
21
+ export type BridgeToolDescriptor = Record<string, BridgeToolMethodDescriptor>;
22
+
23
+ export interface BridgeToolAdapterContext {
24
+ bridge: ReaderBridgeClient;
25
+ callbacks: SdkCallbackRegistry;
26
+ debug: () => boolean;
27
+ onAsyncError: (error: unknown) => void;
28
+ state: ReaderStateStore;
29
+ }
30
+
31
+ const normalizeParams = (args: unknown[]): unknown => {
32
+ if (args.length === 0) {
33
+ return undefined;
34
+ }
35
+
36
+ if (args.length === 1) {
37
+ return args[0];
38
+ }
39
+
40
+ return args;
41
+ };
42
+
43
+ export const createBridgeToolAdapter = <T extends object>(
44
+ tool: AdapterToolName,
45
+ descriptor: BridgeToolDescriptor,
46
+ context: BridgeToolAdapterContext,
47
+ ): T => {
48
+ return new Proxy(
49
+ {},
50
+ {
51
+ get: (_target, property): unknown => {
52
+ if (property === 'then') {
53
+ return undefined;
54
+ }
55
+
56
+ if (typeof property === 'symbol') {
57
+ if (property === Symbol.toStringTag) {
58
+ return tool;
59
+ }
60
+
61
+ return undefined;
62
+ }
63
+
64
+ const methodDescriptor = descriptor[property];
65
+ if (!methodDescriptor) {
66
+ return (..._args: unknown[]) => {
67
+ const error = new Error(`${tool}.${property} is not implemented by the SDK adapter.`);
68
+ context.onAsyncError(error);
69
+ };
70
+ }
71
+
72
+ return (...args: unknown[]) => {
73
+ if (methodDescriptor.kind === 'callbackRegister') {
74
+ methodDescriptor.callback?.(context.callbacks, args);
75
+ return undefined;
76
+ }
77
+
78
+ if (methodDescriptor.kind === 'stateGetter') {
79
+ return methodDescriptor.state?.(context.state.snapshot(), args);
80
+ }
81
+
82
+ const adapterMethod = methodDescriptor.adapterMethod ?? property;
83
+
84
+ if (methodDescriptor.kind === 'query') {
85
+ return context.bridge.request(tool, adapterMethod, normalizeParams(args));
86
+ }
87
+
88
+ if (methodDescriptor.kind === 'callbackQuery') {
89
+ const callback = args.find((arg) => typeof arg === 'function') as
90
+ | ((...values: unknown[]) => void)
91
+ | undefined;
92
+ const params = args.filter((arg) => typeof arg !== 'function');
93
+ void context.bridge
94
+ .request(tool, adapterMethod, normalizeParams(params))
95
+ .then((result) => {
96
+ const callbackArgs = methodDescriptor.mapCallbackResult?.(result) ?? [result];
97
+ callback?.(...callbackArgs);
98
+ })
99
+ .catch(context.onAsyncError);
100
+ return undefined;
101
+ }
102
+
103
+ void context.bridge
104
+ .request(tool, adapterMethod, normalizeParams(args))
105
+ .catch(context.onAsyncError);
106
+ return undefined;
107
+ };
108
+ },
109
+ },
110
+ ) as T;
111
+ };
112
+
113
+ export const createNotImplementedBridgeTool = <T extends object>(
114
+ tool: AdapterToolName,
115
+ context: BridgeToolAdapterContext,
116
+ ): T => {
117
+ return new Proxy(
118
+ {},
119
+ {
120
+ get: (_target, property): unknown => {
121
+ if (property === 'then') {
122
+ return undefined;
123
+ }
124
+
125
+ if (typeof property === 'symbol') {
126
+ return undefined;
127
+ }
128
+
129
+ return (..._args: unknown[]) => {
130
+ const message = `${tool}.${property} is not implemented by the SDK adapter.`;
131
+ context.onAsyncError(new Error(message));
132
+ return undefined;
133
+ };
134
+ },
135
+ },
136
+ ) as T;
137
+ };