@hustleops/n8n-nodes-hustleops 0.1.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/LICENSE +21 -0
- package/README.md +293 -0
- package/dist/credentials/HustleOpsApi.credentials.d.ts +12 -0
- package/dist/credentials/HustleOpsApi.credentials.js +53 -0
- package/dist/nodes/HustleOps/GenericFunctions.d.ts +38 -0
- package/dist/nodes/HustleOps/GenericFunctions.js +366 -0
- package/dist/nodes/HustleOps/HustleOps.node.d.ts +29 -0
- package/dist/nodes/HustleOps/HustleOps.node.js +1594 -0
- package/dist/nodes/HustleOps/HustleOps.node.json +18 -0
- package/dist/nodes/HustleOps/commentDefinitions.d.ts +21 -0
- package/dist/nodes/HustleOps/commentDefinitions.js +254 -0
- package/dist/nodes/HustleOps/constants.d.ts +1 -0
- package/dist/nodes/HustleOps/constants.js +4 -0
- package/dist/nodes/HustleOps/customFieldDefinitions.d.ts +36 -0
- package/dist/nodes/HustleOps/customFieldDefinitions.js +447 -0
- package/dist/nodes/HustleOps/hustleops.dark.svg +7 -0
- package/dist/nodes/HustleOps/hustleops.svg +7 -0
- package/dist/nodes/HustleOps/payloadInputMode.d.ts +18 -0
- package/dist/nodes/HustleOps/payloadInputMode.js +56 -0
- package/dist/nodes/HustleOps/resourceDefinitions.d.ts +48 -0
- package/dist/nodes/HustleOps/resourceDefinitions.js +629 -0
- package/dist/nodes/HustleOps/structuredCoreFields.d.ts +7 -0
- package/dist/nodes/HustleOps/structuredCoreFields.js +29 -0
- package/dist/nodes/HustleOps/tagDefinitions.d.ts +15 -0
- package/dist/nodes/HustleOps/tagDefinitions.js +215 -0
- package/dist/package.json +69 -0
- package/package.json +69 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"node": "@hustleops/n8n-nodes-hustleops",
|
|
3
|
+
"nodeVersion": "1.0",
|
|
4
|
+
"codexVersion": "1.0",
|
|
5
|
+
"categories": ["Development", "Security"],
|
|
6
|
+
"resources": {
|
|
7
|
+
"credentialDocumentation": [
|
|
8
|
+
{
|
|
9
|
+
"url": "https://github.com/HustleOps/hustleops-n8n-plugin#authentication"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"primaryDocumentation": [
|
|
13
|
+
{
|
|
14
|
+
"url": "https://github.com/HustleOps/hustleops-n8n-plugin#readme"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { IDataObject, IExecuteFunctions, INodePropertyOptions } from 'n8n-workflow';
|
|
2
|
+
import { type HustleOpsQueryParams } from './GenericFunctions';
|
|
3
|
+
export type CommentEntityType = 'ALERT' | 'INCIDENT' | 'OBSERVABLE' | 'KNOWLEDGE';
|
|
4
|
+
export type CommentOperation = 'list' | 'search' | 'unreadCount' | 'create' | 'markRead' | 'update' | 'delete' | 'toggleReaction' | 'togglePin';
|
|
5
|
+
export type CommentListResponse = {
|
|
6
|
+
items: IDataObject[];
|
|
7
|
+
nextCursor: string | null;
|
|
8
|
+
};
|
|
9
|
+
type ValidationContext = Pick<IExecuteFunctions, 'getNode'>;
|
|
10
|
+
export declare const COMMENT_RESOURCE_OPTION: INodePropertyOptions;
|
|
11
|
+
export declare const COMMENT_OPERATION_OPTIONS: INodePropertyOptions[];
|
|
12
|
+
export declare const COMMENT_ENTITY_TYPE_OPTIONS: INodePropertyOptions[];
|
|
13
|
+
export declare function buildCommentEntityQuery(context: ValidationContext, input: IDataObject, itemIndex: number): HustleOpsQueryParams;
|
|
14
|
+
export declare function buildCommentSearchQuery(context: ValidationContext, input: IDataObject, itemIndex: number): HustleOpsQueryParams;
|
|
15
|
+
export declare function parseCommentMaxResults(context: ValidationContext, value: unknown, itemIndex: number): number;
|
|
16
|
+
export declare function sanitizeCreateComment(context: ValidationContext, entityScope: IDataObject, body: IDataObject, itemIndex: number): IDataObject;
|
|
17
|
+
export declare function sanitizeMarkReadComment(context: ValidationContext, input: IDataObject, itemIndex: number): IDataObject;
|
|
18
|
+
export declare function sanitizeUpdateComment(context: ValidationContext, input: IDataObject, itemIndex: number): IDataObject;
|
|
19
|
+
export declare function sanitizeToggleReaction(context: ValidationContext, input: IDataObject, itemIndex: number): IDataObject;
|
|
20
|
+
export declare function assertCommentListResponse(value: unknown, label: string): CommentListResponse;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.COMMENT_ENTITY_TYPE_OPTIONS = exports.COMMENT_OPERATION_OPTIONS = exports.COMMENT_RESOURCE_OPTION = void 0;
|
|
4
|
+
exports.buildCommentEntityQuery = buildCommentEntityQuery;
|
|
5
|
+
exports.buildCommentSearchQuery = buildCommentSearchQuery;
|
|
6
|
+
exports.parseCommentMaxResults = parseCommentMaxResults;
|
|
7
|
+
exports.sanitizeCreateComment = sanitizeCreateComment;
|
|
8
|
+
exports.sanitizeMarkReadComment = sanitizeMarkReadComment;
|
|
9
|
+
exports.sanitizeUpdateComment = sanitizeUpdateComment;
|
|
10
|
+
exports.sanitizeToggleReaction = sanitizeToggleReaction;
|
|
11
|
+
exports.assertCommentListResponse = assertCommentListResponse;
|
|
12
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
13
|
+
const GenericFunctions_1 = require("./GenericFunctions");
|
|
14
|
+
const resourceDefinitions_1 = require("./resourceDefinitions");
|
|
15
|
+
const COMMENT_ENTITY_TYPES = Object.values(resourceDefinitions_1.CORE_RESOURCE_DEFINITIONS).map((definition) => definition.entityType);
|
|
16
|
+
const COMMENT_ENTITY_TYPE_SET = new Set(COMMENT_ENTITY_TYPES);
|
|
17
|
+
const MAX_COMMENT_CONTENT_LENGTH = 5000;
|
|
18
|
+
const MAX_COMMENT_SEARCH_QUERY_LENGTH = 500;
|
|
19
|
+
const MAX_COMMENT_ATTACHMENTS = 3;
|
|
20
|
+
const MAX_COMMENT_EMOJI_LENGTH = 16;
|
|
21
|
+
const MAX_COMMENT_TAKE = 100;
|
|
22
|
+
const DEFAULT_COMMENT_TAKE = 50;
|
|
23
|
+
const DEFAULT_COMMENT_MAX_RESULTS = 100;
|
|
24
|
+
const COMMENT_CREATE_BODY_FIELDS = new Set(['content', 'parentId', 'attachmentIds']);
|
|
25
|
+
const COMMENT_UPDATE_FIELDS = new Set(['content']);
|
|
26
|
+
const COMMENT_REACTION_FIELDS = new Set(['emoji']);
|
|
27
|
+
const COMMENT_DEFINITION_NODE = {
|
|
28
|
+
id: 'hustleops-comment-definitions',
|
|
29
|
+
name: 'HustleOps',
|
|
30
|
+
type: 'hustleOps',
|
|
31
|
+
typeVersion: 1,
|
|
32
|
+
position: [0, 0],
|
|
33
|
+
parameters: {},
|
|
34
|
+
};
|
|
35
|
+
exports.COMMENT_RESOURCE_OPTION = {
|
|
36
|
+
name: 'Comment',
|
|
37
|
+
value: 'comment',
|
|
38
|
+
description: 'Comment thread entries for alerts, incidents, observables, and knowledge',
|
|
39
|
+
};
|
|
40
|
+
exports.COMMENT_OPERATION_OPTIONS = [
|
|
41
|
+
{
|
|
42
|
+
name: 'List',
|
|
43
|
+
value: 'list',
|
|
44
|
+
description: 'List comments for an entity thread',
|
|
45
|
+
action: 'List comments',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'Search',
|
|
49
|
+
value: 'search',
|
|
50
|
+
description: 'Search comments within an entity thread',
|
|
51
|
+
action: 'Search comments',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'Get Unread Count',
|
|
55
|
+
value: 'unreadCount',
|
|
56
|
+
description: 'Get unread comment count for an entity thread',
|
|
57
|
+
action: 'Get unread comment count',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'Create',
|
|
61
|
+
value: 'create',
|
|
62
|
+
description: 'Create a comment or reply',
|
|
63
|
+
action: 'Create a comment',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'Mark Read',
|
|
67
|
+
value: 'markRead',
|
|
68
|
+
description: 'Mark an entity comment thread as read',
|
|
69
|
+
action: 'Mark comments as read',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'Update',
|
|
73
|
+
value: 'update',
|
|
74
|
+
description: 'Update a comment body',
|
|
75
|
+
action: 'Update a comment',
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'Delete',
|
|
79
|
+
value: 'delete',
|
|
80
|
+
description: 'Delete a comment',
|
|
81
|
+
action: 'Delete a comment',
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'Toggle Reaction',
|
|
85
|
+
value: 'toggleReaction',
|
|
86
|
+
description: 'Toggle the current user reaction for a comment',
|
|
87
|
+
action: 'Toggle comment reaction',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'Toggle Pin',
|
|
91
|
+
value: 'togglePin',
|
|
92
|
+
description: 'Toggle pinned state for a comment',
|
|
93
|
+
action: 'Toggle comment pin',
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
exports.COMMENT_ENTITY_TYPE_OPTIONS = COMMENT_ENTITY_TYPES.map((entityType) => ({
|
|
97
|
+
name: entityType.charAt(0) + entityType.slice(1).toLowerCase(),
|
|
98
|
+
value: entityType,
|
|
99
|
+
description: `Comment thread for ${entityType.toLowerCase()} entities`,
|
|
100
|
+
}));
|
|
101
|
+
function nodeError(context, message, itemIndex) {
|
|
102
|
+
var _a, _b;
|
|
103
|
+
return new n8n_workflow_1.NodeOperationError((_b = (_a = context.getNode) === null || _a === void 0 ? void 0 : _a.call(context)) !== null && _b !== void 0 ? _b : COMMENT_DEFINITION_NODE, message, {
|
|
104
|
+
itemIndex,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function requireEntityType(context, value, itemIndex) {
|
|
108
|
+
if (typeof value !== 'string' || !COMMENT_ENTITY_TYPE_SET.has(value)) {
|
|
109
|
+
throw nodeError(context, `Comment entity type must be one of: ${COMMENT_ENTITY_TYPES.join(', ')}.`, itemIndex);
|
|
110
|
+
}
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
function requireUuid(context, value, label, itemIndex) {
|
|
114
|
+
try {
|
|
115
|
+
return (0, GenericFunctions_1.assertUuid)(value, label);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
throw nodeError(context, `${label} must be a valid UUID.`, itemIndex);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function optionalUuid(context, value, label, itemIndex) {
|
|
122
|
+
if (value === undefined || value === null || value === '') {
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
return requireUuid(context, value, label, itemIndex);
|
|
126
|
+
}
|
|
127
|
+
function optionalContent(context, value, required, itemIndex) {
|
|
128
|
+
if (value === undefined || value === null) {
|
|
129
|
+
if (required) {
|
|
130
|
+
throw nodeError(context, 'Comment content is required.', itemIndex);
|
|
131
|
+
}
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
if (typeof value !== 'string' || value.trim() === '') {
|
|
135
|
+
throw nodeError(context, 'Comment content is required.', itemIndex);
|
|
136
|
+
}
|
|
137
|
+
if (value.length > MAX_COMMENT_CONTENT_LENGTH) {
|
|
138
|
+
throw nodeError(context, `Comment content cannot exceed ${MAX_COMMENT_CONTENT_LENGTH} characters.`, itemIndex);
|
|
139
|
+
}
|
|
140
|
+
return value;
|
|
141
|
+
}
|
|
142
|
+
function attachmentIds(context, value, itemIndex) {
|
|
143
|
+
if (value === undefined || value === null) {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
if (!Array.isArray(value)) {
|
|
147
|
+
throw nodeError(context, 'Comment attachmentIds must be an array of UUIDs.', itemIndex);
|
|
148
|
+
}
|
|
149
|
+
if (value.length > MAX_COMMENT_ATTACHMENTS) {
|
|
150
|
+
throw nodeError(context, `Comment attachmentIds cannot contain more than ${MAX_COMMENT_ATTACHMENTS} IDs.`, itemIndex);
|
|
151
|
+
}
|
|
152
|
+
return value.map((id) => requireUuid(context, id, 'Comment attachment ID', itemIndex));
|
|
153
|
+
}
|
|
154
|
+
function integerInRange(context, value, label, minimum, maximum, defaultValue, itemIndex) {
|
|
155
|
+
try {
|
|
156
|
+
return (0, GenericFunctions_1.parseIntegerInRange)(value, label, minimum, maximum, defaultValue);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
throw nodeError(context, error instanceof Error
|
|
160
|
+
? error.message
|
|
161
|
+
: `${label} must be between ${minimum} and ${maximum}.`, itemIndex);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function assertAllowedCommentKeys(context, operationLabel, input, allowedKeys, itemIndex) {
|
|
165
|
+
for (const key of Object.keys(input)) {
|
|
166
|
+
if (!allowedKeys.has(key)) {
|
|
167
|
+
throw nodeError(context, `Unsupported Comment ${operationLabel} field: ${key}`, itemIndex);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function buildCommentEntityQuery(context, input, itemIndex) {
|
|
172
|
+
return (0, GenericFunctions_1.compactObject)({
|
|
173
|
+
entityType: requireEntityType(context, input.entityType, itemIndex),
|
|
174
|
+
entityId: requireUuid(context, input.entityId, 'Comment entity ID', itemIndex),
|
|
175
|
+
cursor: optionalUuid(context, input.cursor, 'Comment cursor', itemIndex),
|
|
176
|
+
take: input.take === undefined
|
|
177
|
+
? undefined
|
|
178
|
+
: integerInRange(context, input.take, 'Comment take', 1, MAX_COMMENT_TAKE, DEFAULT_COMMENT_TAKE, itemIndex),
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
function buildCommentSearchQuery(context, input, itemIndex) {
|
|
182
|
+
const q = input.q;
|
|
183
|
+
if (typeof q !== 'string' || q.trim() === '') {
|
|
184
|
+
throw nodeError(context, 'Comment search query is required.', itemIndex);
|
|
185
|
+
}
|
|
186
|
+
if (q.length > MAX_COMMENT_SEARCH_QUERY_LENGTH) {
|
|
187
|
+
throw nodeError(context, `Comment search query cannot exceed ${MAX_COMMENT_SEARCH_QUERY_LENGTH} characters.`, itemIndex);
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
entityType: requireEntityType(context, input.entityType, itemIndex),
|
|
191
|
+
entityId: requireUuid(context, input.entityId, 'Comment entity ID', itemIndex),
|
|
192
|
+
q,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function parseCommentMaxResults(context, value, itemIndex) {
|
|
196
|
+
return integerInRange(context, value, 'Comment Max Results', 1, MAX_COMMENT_TAKE, DEFAULT_COMMENT_MAX_RESULTS, itemIndex);
|
|
197
|
+
}
|
|
198
|
+
function sanitizeCreateComment(context, entityScope, body, itemIndex) {
|
|
199
|
+
assertAllowedCommentKeys(context, 'create body', body, COMMENT_CREATE_BODY_FIELDS, itemIndex);
|
|
200
|
+
const content = optionalContent(context, body.content, false, itemIndex);
|
|
201
|
+
const ids = attachmentIds(context, body.attachmentIds, itemIndex);
|
|
202
|
+
if (!content && (!ids || ids.length === 0)) {
|
|
203
|
+
throw nodeError(context, 'Comment create requires content or attachmentIds.', itemIndex);
|
|
204
|
+
}
|
|
205
|
+
return (0, GenericFunctions_1.compactObject)({
|
|
206
|
+
entityType: requireEntityType(context, entityScope.entityType, itemIndex),
|
|
207
|
+
entityId: requireUuid(context, entityScope.entityId, 'Comment entity ID', itemIndex),
|
|
208
|
+
content,
|
|
209
|
+
parentId: optionalUuid(context, body.parentId, 'Comment parent ID', itemIndex),
|
|
210
|
+
attachmentIds: ids,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
function sanitizeMarkReadComment(context, input, itemIndex) {
|
|
214
|
+
return {
|
|
215
|
+
entityType: requireEntityType(context, input.entityType, itemIndex),
|
|
216
|
+
entityId: requireUuid(context, input.entityId, 'Comment entity ID', itemIndex),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
function sanitizeUpdateComment(context, input, itemIndex) {
|
|
220
|
+
assertAllowedCommentKeys(context, 'update', input, COMMENT_UPDATE_FIELDS, itemIndex);
|
|
221
|
+
return {
|
|
222
|
+
content: optionalContent(context, input.content, true, itemIndex),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function sanitizeToggleReaction(context, input, itemIndex) {
|
|
226
|
+
assertAllowedCommentKeys(context, 'reaction', input, COMMENT_REACTION_FIELDS, itemIndex);
|
|
227
|
+
const emoji = input.emoji;
|
|
228
|
+
if (typeof emoji !== 'string' || emoji.trim() === '') {
|
|
229
|
+
throw nodeError(context, 'Comment emoji is required.', itemIndex);
|
|
230
|
+
}
|
|
231
|
+
if (emoji.length > MAX_COMMENT_EMOJI_LENGTH) {
|
|
232
|
+
throw nodeError(context, `Comment emoji cannot exceed ${MAX_COMMENT_EMOJI_LENGTH} characters.`, itemIndex);
|
|
233
|
+
}
|
|
234
|
+
return { emoji };
|
|
235
|
+
}
|
|
236
|
+
function assertCommentListResponse(value, label) {
|
|
237
|
+
var _a;
|
|
238
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
239
|
+
throw new Error(`${label} must be a comment list response object.`);
|
|
240
|
+
}
|
|
241
|
+
const response = value;
|
|
242
|
+
if (!Array.isArray(response.items)) {
|
|
243
|
+
throw new Error(`${label} must include an items array.`);
|
|
244
|
+
}
|
|
245
|
+
if (response.nextCursor !== undefined &&
|
|
246
|
+
response.nextCursor !== null &&
|
|
247
|
+
typeof response.nextCursor !== 'string') {
|
|
248
|
+
throw new Error(`${label} nextCursor must be a string or null.`);
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
items: response.items,
|
|
252
|
+
nextCursor: (_a = response.nextCursor) !== null && _a !== void 0 ? _a : null,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const HUSTLEOPS_API_KEY_HEADER = "x-api-key";
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { IDataObject, IExecuteFunctions, INodePropertyOptions } from 'n8n-workflow';
|
|
2
|
+
export type CustomFieldOperation = 'listGroups' | 'createGroup' | 'updateGroup' | 'deleteGroup' | 'listDefinitions' | 'searchDefinitions' | 'createDefinition' | 'updateDefinition' | 'bulkUpdateDefinitions' | 'deleteDefinition' | 'bulkDeleteDefinitions' | 'getValues' | 'getAvailable' | 'batchGetValues' | 'replaceValues' | 'updateSelectedValuesSafely';
|
|
3
|
+
export type CustomFieldEntityType = 'ALERT' | 'INCIDENT' | 'OBSERVABLE' | 'KNOWLEDGE';
|
|
4
|
+
type ValidationContext = Pick<IExecuteFunctions, 'getNode'>;
|
|
5
|
+
export declare const CUSTOM_FIELD_RESOURCE_OPTION: INodePropertyOptions;
|
|
6
|
+
export declare const CUSTOM_FIELD_OPERATION_OPTIONS: INodePropertyOptions[];
|
|
7
|
+
export declare const CUSTOM_FIELD_ENTITY_TYPE_OPTIONS: INodePropertyOptions[];
|
|
8
|
+
export declare function sanitizeCustomFieldGroupBody(context: ValidationContext, body: IDataObject, required: boolean, itemIndex: number): IDataObject;
|
|
9
|
+
export declare function sanitizeCustomFieldDefinitionBody(context: ValidationContext, body: IDataObject, operation: 'create' | 'update', itemIndex: number): IDataObject;
|
|
10
|
+
export declare function sanitizeCustomFieldDefinitionBulkUpdate(context: ValidationContext, body: IDataObject, itemIndex: number): IDataObject;
|
|
11
|
+
export declare function sanitizeCustomFieldDefinitionBulkDelete(context: ValidationContext, body: IDataObject, itemIndex: number): IDataObject;
|
|
12
|
+
export declare function parseCustomFieldEntityIds(context: ValidationContext, value: unknown, itemIndex: number): string[];
|
|
13
|
+
export declare function parseCustomFieldValues(context: ValidationContext, value: unknown, itemIndex: number): Array<{
|
|
14
|
+
fieldId: string;
|
|
15
|
+
value: string | null;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function customFieldEntityScope(context: ValidationContext, input: IDataObject, itemIndex: number): {
|
|
18
|
+
entityType: CustomFieldEntityType;
|
|
19
|
+
entityId: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function customFieldBatchBody(context: ValidationContext, input: IDataObject, itemIndex: number): IDataObject;
|
|
22
|
+
export declare function extractAttachedCustomFieldValues(value: unknown): Array<{
|
|
23
|
+
fieldId: string;
|
|
24
|
+
value: string | null;
|
|
25
|
+
}>;
|
|
26
|
+
export declare function mergeCustomFieldValues(existing: Array<{
|
|
27
|
+
fieldId: string;
|
|
28
|
+
value: string | null;
|
|
29
|
+
}>, updates: Array<{
|
|
30
|
+
fieldId: string;
|
|
31
|
+
value: string | null;
|
|
32
|
+
}>): Array<{
|
|
33
|
+
fieldId: string;
|
|
34
|
+
value: string | null;
|
|
35
|
+
}>;
|
|
36
|
+
export {};
|