first commit
This commit is contained in:
commit
0a45a1f5fb
20 changed files with 992 additions and 0 deletions
64
f/clickup/utils/filter-task-fields.deno.ts
Normal file
64
f/clickup/utils/filter-task-fields.deno.ts
Normal file
|
@ -0,0 +1,64 @@
|
|||
// utils/filter-task-fields.ts
|
||||
import type { TaskResponse } from '../types/clickup';
|
||||
|
||||
type FieldSelector = Array<string | NestedField>;
|
||||
type NestedField = {
|
||||
field: string;
|
||||
subfields?: FieldSelector;
|
||||
};
|
||||
|
||||
export function filterTaskFields(
|
||||
task: TaskResponse,
|
||||
fields: FieldSelector
|
||||
): Partial<TaskResponse> {
|
||||
return fields.reduce((acc, selector) => {
|
||||
if (typeof selector === 'string') {
|
||||
handleStringSelector(acc, task, selector);
|
||||
} else if (selector.subfields) {
|
||||
handleNestedSelector(acc, task, selector);
|
||||
}
|
||||
return acc;
|
||||
}, {} as Partial<TaskResponse>);
|
||||
}
|
||||
|
||||
function handleStringSelector(
|
||||
acc: Partial<TaskResponse>,
|
||||
task: TaskResponse,
|
||||
selector: string
|
||||
) {
|
||||
const [root, ...nested] = selector.split('.');
|
||||
|
||||
if (task[root as keyof TaskResponse] !== undefined) {
|
||||
if (nested.length > 0) {
|
||||
acc[root as keyof TaskResponse] = processNestedField(
|
||||
task[root as keyof TaskResponse],
|
||||
nested.join('.')
|
||||
);
|
||||
} else {
|
||||
acc[root as keyof TaskResponse] = task[root as keyof TaskResponse];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function handleNestedSelector(
|
||||
acc: Partial<TaskResponse>,
|
||||
task: TaskResponse,
|
||||
selector: NestedField
|
||||
) {
|
||||
const value = task[selector.field as keyof TaskResponse];
|
||||
if (value && typeof value === 'object') {
|
||||
acc[selector.field as keyof TaskResponse] = Array.isArray(value)
|
||||
? value.map(item => filterTaskFields(item as TaskResponse, selector.subfields!))
|
||||
: filterTaskFields(value as TaskResponse, selector.subfields!);
|
||||
}
|
||||
}
|
||||
|
||||
function processNestedField(value: any, nestedPath: string): any {
|
||||
const [current, ...remaining] = nestedPath.split('.');
|
||||
|
||||
if (value[current] === undefined) return undefined;
|
||||
|
||||
return remaining.length > 0
|
||||
? processNestedField(value[current], remaining.join('.'))
|
||||
: value[current];
|
||||
}
|
10
f/clickup/utils/filter-task-fields.script.yaml
Normal file
10
f/clickup/utils/filter-task-fields.script.yaml
Normal file
|
@ -0,0 +1,10 @@
|
|||
summary: Filter Task Fields
|
||||
description: ''
|
||||
lock: ''
|
||||
kind: script
|
||||
no_main_func: true
|
||||
schema:
|
||||
$schema: 'https://json-schema.org/draft/2020-12/schema'
|
||||
type: object
|
||||
properties: {}
|
||||
required: []
|
Loading…
Add table
Add a link
Reference in a new issue