diff --git a/package.json b/package.json index e3fc314..85ed3a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "taskade", - "version": "1.0.6", + "version": "1.1.0", "description": "Taskade is a collaboration platform for remote teams to organize and manage projects.", "main": "index.js", "scripts": { @@ -14,26 +14,20 @@ "npm": ">=5.6.0" }, "dependencies": { - "@apollo/client": "^3.6.9", "@taskade/eslint-plugin": "0.4.0", "cross-fetch": "^3.1.5", - "graphql": "^16.6.0", - "lodash": "^4.17.21", "moment": "^2.29.1", "moment-timezone": "^0.5.37", - "uuid": "^9.0.0", "zapier-platform-core": "17.4.0" }, "devDependencies": { "@types/jest": "^26.0.23", - "@types/lodash": "^4.17.13", - "@types/luxon": "^3.0.1", "@types/node": "^18.12.0", "@types/node-fetch": "^2.6.12", - "@types/uuid": "^8.3.4", "jest": "^26.6.3", "rimraf": "^3.0.2", - "typescript": "5.3.3" + "typescript": "5.3.3", + "zapier-platform-schema": "17.4.0" }, "private": true, "zapier": { diff --git a/src/client.ts b/src/client.ts new file mode 100644 index 0000000..6fb36b7 --- /dev/null +++ b/src/client.ts @@ -0,0 +1,49 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +export const BASE_V1 = 'https://www.taskade.com/api/v1'; +export const BASE_V2 = 'https://www.taskade.com/api/v2'; + +export interface ApiResponse { + ok?: boolean; + message?: string; + item?: Record; + items?: Array>; + [key: string]: unknown; +} + +interface RequestOptions { + method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'; + /** A path relative to the API base (e.g. `/projects/123/tasks`) or a full URL. */ + path: string; + version?: 'v1' | 'v2'; + body?: unknown; + params?: Record; +} + +/** + * Single Taskade request helper used by every create/search. Mirrors the auth + + * header pattern already used in creates/createTask.ts so behaviour is identical. + */ +export const request = async (z: ZObject, bundle: Bundle, opts: RequestOptions) => { + const base = opts.version === 'v2' ? BASE_V2 : BASE_V1; + const url = opts.path.startsWith('http') ? opts.path : `${base}${opts.path}`; + return z.request({ + url, + method: opts.method, + headers: { + Accept: 'application/json', + 'content-type': 'application/json', + authorization: `Bearer ${bundle.authData.access_token}`, + }, + params: opts.params, + body: opts.body != null ? JSON.stringify(opts.body) : undefined, + }); +}; + +/** Throws the Taskade error message when the API returns `{ ok: false }`, else returns the body. */ +export const parseOk = (z: ZObject, data: ApiResponse): ApiResponse => { + if (data && data.ok === false) { + throw new z.errors.Error(data.message || 'Taskade API request failed', 'invalid_input', 400); + } + return data; +}; diff --git a/src/creates/completeTask.ts b/src/creates/completeTask.ts new file mode 100644 index 0000000..7f75bb9 --- /dev/null +++ b/src/creates/completeTask.ts @@ -0,0 +1,51 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +import { ApiResponse, parseOk, request } from '../client'; +import { projectField, spaceField, taskField } from '../fields'; + +const perform = async (z: ZObject, bundle: Bundle) => { + // Zapier may deliver booleans as the strings 'true'/'false', so check both. + const completed = bundle.inputData.completed; + const action = completed === false || completed === 'false' ? 'uncomplete' : 'complete'; + + const response = await request(z, bundle, { + method: 'POST', + path: `/projects/${bundle.inputData.project_id}/tasks/${bundle.inputData.task_id}/${action}`, + body: {}, + }); + + const data: ApiResponse = parseOk(z, response.json); + + return data.item ?? { id: bundle.inputData.task_id, completed: action === 'complete' }; +}; + +export default { + key: 'complete_task', + noun: 'Task', + display: { + label: 'Complete Task', + description: 'Marks a task as complete, or reopens it.', + hidden: false, + }, + operation: { + inputFields: [ + spaceField(false), + projectField(true), + taskField('task_id', 'Task', true), + { + key: 'completed', + label: 'Mark as Complete', + type: 'boolean', + default: 'true', + required: false, + helpText: 'Set to No to reopen (uncomplete) the task instead.', + }, + ], + perform, + sample: { id: '099630d4-267e-4b22-894b-08b69f3a4d79', completed: true }, + outputFields: [ + { key: 'id', label: 'Task ID' }, + { key: 'completed', type: 'boolean' }, + ], + }, +}; diff --git a/src/creates/createProject.ts b/src/creates/createProject.ts new file mode 100644 index 0000000..f82297a --- /dev/null +++ b/src/creates/createProject.ts @@ -0,0 +1,56 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +import { ApiResponse, parseOk, request } from '../client'; +import { spaceField } from '../fields'; + +const perform = async (z: ZObject, bundle: Bundle) => { + const response = await request(z, bundle, { + method: 'POST', + path: '/projects', + body: { + folderId: bundle.inputData.space_id, + contentType: (bundle.inputData.content_type as string) ?? 'text/markdown', + content: bundle.inputData.content as string, + }, + }); + + const data: ApiResponse = parseOk(z, response.json); + + return data.item ?? data; +}; + +export default { + key: 'create_project', + noun: 'Project', + display: { + label: 'Create Project', + description: 'Creates a new project from Markdown content in a folder.', + hidden: false, + }, + operation: { + inputFields: [ + { ...spaceField(true), label: 'Folder' }, + { + key: 'content', + label: 'Content', + type: 'text', + required: true, + helpText: 'Markdown content for the project, e.g. a title line followed by tasks.', + }, + { + key: 'content_type', + label: 'Format', + type: 'string', + choices: { 'text/markdown': 'Markdown', 'text/plain': 'Plain text' }, + default: 'text/markdown', + required: false, + }, + ], + perform, + sample: { id: '8hoA5PtYfKroDifZ', name: 'New Project' }, + outputFields: [ + { key: 'id', label: 'Project ID' }, + { key: 'name', label: 'Name' }, + ], + }, +}; diff --git a/src/creates/createProjectFromTemplate.ts b/src/creates/createProjectFromTemplate.ts new file mode 100644 index 0000000..b3143b7 --- /dev/null +++ b/src/creates/createProjectFromTemplate.ts @@ -0,0 +1,49 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +import { ApiResponse, parseOk, request } from '../client'; +import { spaceField } from '../fields'; + +const perform = async (z: ZObject, bundle: Bundle) => { + const response = await request(z, bundle, { + method: 'POST', + path: '/projects/from-template', + body: { + folderId: bundle.inputData.space_id, + templateId: bundle.inputData.template_id, + }, + }); + + const data: ApiResponse = parseOk(z, response.json); + + return data.item ?? data; +}; + +export default { + key: 'create_project_from_template', + noun: 'Project', + display: { + label: 'Create Project from Template', + description: 'Creates a new project from an existing template in a folder.', + hidden: false, + }, + operation: { + inputFields: [ + { ...spaceField(true), label: 'Folder', altersDynamicFields: true }, + { + key: 'template_id', + label: 'Template', + type: 'string', + dynamic: 'get_all_project_templates.id.title', + required: true, + list: false, + altersDynamicFields: false, + }, + ], + perform, + sample: { id: '8hoA5PtYfKroDifZ', name: 'New Project from Template' }, + outputFields: [ + { key: 'id', label: 'Project ID' }, + { key: 'name', label: 'Name' }, + ], + }, +}; diff --git a/src/creates/customApiCall.ts b/src/creates/customApiCall.ts new file mode 100644 index 0000000..3a66669 --- /dev/null +++ b/src/creates/customApiCall.ts @@ -0,0 +1,67 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +const perform = async (z: ZObject, bundle: Bundle) => { + const raw = bundle.inputData.url as string; + const url = raw.startsWith('http') + ? raw + : `https://www.taskade.com${raw.startsWith('/') ? '' : '/'}${raw}`; + + const method = + (bundle.inputData.http_method as 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH') || 'GET'; + + const response = await z.request({ + url, + method, + headers: { + Accept: 'application/json', + 'content-type': 'application/json', + authorization: `Bearer ${bundle.authData.access_token}`, + }, + body: bundle.inputData.body ? (bundle.inputData.body as string) : undefined, + // Don't auto-throw on 4xx/5xx: this escape hatch must surface the real + // status + error body so power users can inspect failed calls. + skipThrowForStatus: true, + }); + + return { status: response.status, data: response.json ?? null }; +}; + +export default { + key: 'custom_api_call', + noun: 'API Call', + display: { + label: 'Custom API Call', + description: + 'Make an authenticated request to any Taskade API endpoint. Advanced — see developer.taskade.com.', + hidden: false, + }, + operation: { + inputFields: [ + { + key: 'http_method', + label: 'Method', + type: 'string', + choices: { GET: 'GET', POST: 'POST', PUT: 'PUT', DELETE: 'DELETE', PATCH: 'PATCH' }, + default: 'GET', + required: true, + }, + { + key: 'url', + label: 'URL or Path', + type: 'string', + required: true, + helpText: 'A full URL, or a path such as `/api/v1/me/projects`.', + }, + { + key: 'body', + label: 'Body', + type: 'text', + required: false, + helpText: 'Raw JSON request body (for POST/PUT/PATCH).', + }, + ], + perform, + sample: { status: 200, data: {} }, + outputFields: [{ key: 'status', label: 'HTTP Status', type: 'integer' }], + }, +}; diff --git a/src/creates/deleteTask.ts b/src/creates/deleteTask.ts new file mode 100644 index 0000000..baaeba7 --- /dev/null +++ b/src/creates/deleteTask.ts @@ -0,0 +1,34 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +import { parseOk, request } from '../client'; +import { projectField, spaceField, taskField } from '../fields'; + +const perform = async (z: ZObject, bundle: Bundle) => { + const response = await request(z, bundle, { + method: 'DELETE', + path: `/projects/${bundle.inputData.project_id}/tasks/${bundle.inputData.task_id}`, + }); + + parseOk(z, response.json); + + return { id: bundle.inputData.task_id as string, deleted: true }; +}; + +export default { + key: 'delete_task', + noun: 'Task', + display: { + label: 'Delete Task', + description: 'Deletes a task from a project.', + hidden: false, + }, + operation: { + inputFields: [spaceField(false), projectField(true), taskField('task_id', 'Task', true)], + perform, + sample: { id: '099630d4-267e-4b22-894b-08b69f3a4d79', deleted: true }, + outputFields: [ + { key: 'id', label: 'Task ID' }, + { key: 'deleted', type: 'boolean' }, + ], + }, +}; diff --git a/src/creates/moveTask.ts b/src/creates/moveTask.ts new file mode 100644 index 0000000..3846110 --- /dev/null +++ b/src/creates/moveTask.ts @@ -0,0 +1,55 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +import { ApiResponse, parseOk, request } from '../client'; +import { projectField, spaceField, taskField } from '../fields'; + +const perform = async (z: ZObject, bundle: Bundle) => { + const response = await request(z, bundle, { + method: 'PUT', + path: `/projects/${bundle.inputData.project_id}/tasks/${bundle.inputData.task_id}/move`, + body: { + target: { + taskId: bundle.inputData.target_task_id, + position: bundle.inputData.position, + }, + }, + }); + + const data: ApiResponse = parseOk(z, response.json); + + return data.item ?? { id: bundle.inputData.task_id }; +}; + +export default { + key: 'move_task', + noun: 'Task', + display: { + label: 'Move Task', + description: 'Moves a task relative to another task in the same project.', + hidden: false, + }, + operation: { + inputFields: [ + spaceField(false), + projectField(true), + taskField('task_id', 'Task to Move', true), + taskField('target_task_id', 'Relative to Task', true), + { + key: 'position', + label: 'Position', + type: 'string', + choices: { + beforebegin: 'Before (as a sibling, above)', + afterbegin: 'Inside (as first child)', + beforeend: 'Inside (as last child)', + afterend: 'After (as a sibling, below)', + }, + default: 'afterend', + required: true, + }, + ], + perform, + sample: { id: '099630d4-267e-4b22-894b-08b69f3a4d79' }, + outputFields: [{ key: 'id', label: 'Task ID' }], + }, +}; diff --git a/src/creates/runAgent.ts b/src/creates/runAgent.ts new file mode 100644 index 0000000..49eb659 --- /dev/null +++ b/src/creates/runAgent.ts @@ -0,0 +1,58 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +import { ApiResponse, parseOk, request } from '../client'; + +const perform = async (z: ZObject, bundle: Bundle) => { + const response = await request(z, bundle, { + method: 'POST', + path: '/promptAgent', + version: 'v2', + body: { + spaceId: bundle.inputData.space_id, + agentId: bundle.inputData.agent_id, + prompt: bundle.inputData.prompt, + }, + }); + + const data: ApiResponse = parseOk(z, response.json); + + return { summary: (data.summary ?? '') as string }; +}; + +export default { + key: 'run_agent', + noun: 'Agent Response', + display: { + label: 'Run AI Agent', + description: 'Sends a prompt to a Taskade AI agent and returns its response.', + hidden: false, + }, + operation: { + inputFields: [ + { + key: 'space_id', + label: 'Workspace ID', + type: 'string', + required: true, + helpText: 'The ID of the workspace the agent belongs to.', + }, + { + key: 'agent_id', + label: 'Agent ID', + type: 'string', + required: true, + helpText: 'The ID of the agent to prompt.', + }, + { + key: 'prompt', + label: 'Prompt', + type: 'text', + required: true, + helpText: 'The message to send to the agent.', + }, + ], + perform, + sample: { summary: 'Here is the agent response.' }, + outputFields: [{ key: 'summary', label: 'Response' }], + }, +}; diff --git a/src/creates/updateTask.ts b/src/creates/updateTask.ts new file mode 100644 index 0000000..5e9ec7d --- /dev/null +++ b/src/creates/updateTask.ts @@ -0,0 +1,54 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +import { ApiResponse, parseOk, request } from '../client'; +import { projectField, spaceField, taskField } from '../fields'; + +const perform = async (z: ZObject, bundle: Bundle) => { + const response = await request(z, bundle, { + method: 'PUT', + path: `/projects/${bundle.inputData.project_id}/tasks/${bundle.inputData.task_id}`, + body: { + contentType: (bundle.inputData.content_type as string) ?? 'text/markdown', + content: bundle.inputData.content as string, + }, + }); + + const data: ApiResponse = parseOk(z, response.json); + + return data.item ?? { id: bundle.inputData.task_id }; +}; + +export default { + key: 'update_task', + noun: 'Task', + display: { + label: 'Update Task', + description: 'Updates the content of an existing task.', + hidden: false, + }, + operation: { + inputFields: [ + spaceField(false), + projectField(true), + taskField('task_id', 'Task', true), + { + key: 'content', + label: 'Content', + type: 'string', + required: true, + helpText: 'The new task text (single line, up to 2000 characters).', + }, + { + key: 'content_type', + label: 'Format', + type: 'string', + choices: { 'text/markdown': 'Markdown', 'text/plain': 'Plain text' }, + default: 'text/markdown', + required: false, + }, + ], + perform, + sample: { id: '099630d4-267e-4b22-894b-08b69f3a4d79' }, + outputFields: [{ key: 'id', label: 'Task ID' }], + }, +}; diff --git a/src/fields.ts b/src/fields.ts new file mode 100644 index 0000000..3585b43 --- /dev/null +++ b/src/fields.ts @@ -0,0 +1,35 @@ +/** + * Shared input-field builders for the dynamic dropdown chain + * (Workspace/Folder -> Project -> Task), reused across every action and search + * so the dropdowns behave identically to creates/createTask.ts. + */ + +export const spaceField = (required = false) => ({ + key: 'space_id', + label: 'Workspace or Folder', + type: 'string', + dynamic: 'get_all_spaces.id.name', + required, + list: false, + altersDynamicFields: false, +}); + +export const projectField = (required = true) => ({ + key: 'project_id', + label: 'Project', + type: 'string', + dynamic: 'get_all_projects.id.title', + required, + list: false, + altersDynamicFields: true, +}); + +export const taskField = (key = 'task_id', label = 'Task', required = true) => ({ + key, + label, + type: 'string', + dynamic: 'get_all_tasks.id.title', + required, + list: false, + altersDynamicFields: false, +}); diff --git a/src/index.ts b/src/index.ts index 4a50d23..9cdcd39 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,11 +3,23 @@ import 'cross-fetch/polyfill'; import { version as platformVersion } from 'zapier-platform-core'; import { authentication } from './authentication'; +import CompleteTask from './creates/completeTask'; +import CreateProject from './creates/createProject'; +import CreateProjectFromTemplate from './creates/createProjectFromTemplate'; import CreateTask from './creates/createTask'; +import CustomApiCall from './creates/customApiCall'; +import DeleteTask from './creates/deleteTask'; +import MoveTask from './creates/moveTask'; +import RunAgent from './creates/runAgent'; +import UpdateTask from './creates/updateTask'; +import FindProject from './searches/findProject'; +import FindTask from './searches/findTask'; import GetAllAssignableMembers from './triggers/getAllAssignableMembers'; import GetAllBlocks from './triggers/getAllBlocks'; import GetAllProjects from './triggers/getAllProjects'; +import GetAllProjectTemplates from './triggers/getAllProjectTemplates'; import GetAllSpaces from './triggers/getAllSpaces'; +import GetAllTasks from './triggers/getAllTasks'; import TaskDue from './triggers/taskDue'; const { version } = require('../package.json'); @@ -22,10 +34,25 @@ export default { [GetAllProjects.key]: GetAllProjects, [GetAllSpaces.key]: GetAllSpaces, [GetAllAssignableMembers.key]: GetAllAssignableMembers, + [GetAllTasks.key]: GetAllTasks, + [GetAllProjectTemplates.key]: GetAllProjectTemplates, [TaskDue.key]: TaskDue, }, creates: { [CreateTask.key]: CreateTask, + [CompleteTask.key]: CompleteTask, + [UpdateTask.key]: UpdateTask, + [DeleteTask.key]: DeleteTask, + [MoveTask.key]: MoveTask, + [CreateProject.key]: CreateProject, + [CreateProjectFromTemplate.key]: CreateProjectFromTemplate, + [RunAgent.key]: RunAgent, + [CustomApiCall.key]: CustomApiCall, + }, + + searches: { + [FindTask.key]: FindTask, + [FindProject.key]: FindProject, }, }; diff --git a/src/searches/findProject.ts b/src/searches/findProject.ts new file mode 100644 index 0000000..c135f42 --- /dev/null +++ b/src/searches/findProject.ts @@ -0,0 +1,56 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +import { ApiResponse, parseOk, request } from '../client'; +import { spaceField } from '../fields'; + +const perform = async (z: ZObject, bundle: Bundle) => { + const path = + bundle.inputData.space_id != null + ? `/folders/${bundle.inputData.space_id}/projects` + : '/me/projects'; + + // Best-effort: widen the page size; matching is client-side over the result set. + const response = await request(z, bundle, { method: 'GET', path, params: { limit: '100' } }); + + const data: ApiResponse = parseOk(z, response.json); + const query = String(bundle.inputData.query ?? '').toLowerCase(); + + return (data.items ?? []) + .filter((project) => + String(project.name ?? project.title ?? '') + .toLowerCase() + .includes(query), + ) + .map((project) => ({ + id: project.id as string, + name: (project.name ?? project.title ?? '') as string, + })); +}; + +export default { + key: 'find_project', + noun: 'Project', + display: { + label: 'Find Project', + description: "Finds a project by name across a folder or the user's projects.", + hidden: false, + }, + operation: { + inputFields: [ + spaceField(false), + { + key: 'query', + label: 'Project Name', + type: 'string', + required: true, + helpText: 'Returns projects whose name contains this value.', + }, + ], + perform, + sample: { id: '8hoA5PtYfKroDifZ', name: 'Get Started with Taskade' }, + outputFields: [ + { key: 'id', label: 'Project ID' }, + { key: 'name', label: 'Name' }, + ], + }, +}; diff --git a/src/searches/findTask.ts b/src/searches/findTask.ts new file mode 100644 index 0000000..91f2e55 --- /dev/null +++ b/src/searches/findTask.ts @@ -0,0 +1,53 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +import { ApiResponse, parseOk, request } from '../client'; +import { projectField, spaceField } from '../fields'; + +const perform = async (z: ZObject, bundle: Bundle) => { + // Best-effort: widen the page size; matching is client-side over the result set. + const response = await request(z, bundle, { + method: 'GET', + path: `/projects/${bundle.inputData.project_id}/tasks`, + params: { limit: '100' }, + }); + + const data: ApiResponse = parseOk(z, response.json); + const query = String(bundle.inputData.query ?? '').toLowerCase(); + + return (data.items ?? []) + .filter((task) => + String(task.text ?? task.content ?? '') + .toLowerCase() + .includes(query), + ) + .map((task) => ({ id: task.id as string, text: (task.text ?? task.content ?? '') as string })); +}; + +export default { + key: 'find_task', + noun: 'Task', + display: { + label: 'Find Task', + description: 'Finds a task in a project by matching its text.', + hidden: false, + }, + operation: { + inputFields: [ + spaceField(false), + projectField(true), + { + key: 'query', + label: 'Search Text', + type: 'string', + required: true, + helpText: 'Returns tasks whose text contains this value.', + }, + ], + perform, + sample: { id: '099630d4-267e-4b22-894b-08b69f3a4d79', text: 'Buy milk' }, + outputFields: [ + { key: 'id', label: 'Task ID' }, + { key: 'text', label: 'Text' }, + ], + }, +}; diff --git a/src/test/app.test.ts b/src/test/app.test.ts new file mode 100644 index 0000000..269c28e --- /dev/null +++ b/src/test/app.test.ts @@ -0,0 +1,59 @@ +import App from '../index'; + +// zapier-platform-schema ships with the platform and has no published types; +// require() keeps it untyped without tripping noImplicitAny. +// eslint-disable-next-line @typescript-eslint/no-var-requires +const schema = require('zapier-platform-schema'); + +// Zapier validates the *serialized* app definition, where every function is +// replaced by a `$func$$f$` marker (exactly what the CLI does before +// `zapier validate`/`zapier push`). Convert functions before validating so this +// test mirrors what the platform actually checks. +const toSchema = (value: unknown): unknown => { + if (typeof value === 'function') { + return `$func$${value.length}$f$`; + } + if (Array.isArray(value)) { + return value.map(toSchema); + } + if (value && typeof value === 'object') { + return Object.fromEntries( + Object.entries(value as Record).map(([k, v]) => [k, toSchema(v)]), + ); + } + return value; +}; + +describe('Taskade app definition', () => { + it('passes Zapier schema validation with no errors', () => { + const results = schema.validateAppDefinition(toSchema(App)); + expect(results.errors).toEqual([]); + }); + + it('registers the expected creates', () => { + expect(Object.keys(App.creates)).toEqual( + expect.arrayContaining([ + 'create_task', + 'complete_task', + 'update_task', + 'delete_task', + 'move_task', + 'create_project', + 'create_project_from_template', + 'run_agent', + 'custom_api_call', + ]), + ); + }); + + it('registers the expected searches', () => { + expect(Object.keys(App.searches)).toEqual( + expect.arrayContaining(['find_task', 'find_project']), + ); + }); + + it('keeps the existing trigger and create intact (no regression)', () => { + expect(Object.keys(App.triggers)).toEqual(expect.arrayContaining(['task_due'])); + expect(App.creates.create_task).toBeDefined(); + }); +}); diff --git a/src/triggers/getAllProjectTemplates.ts b/src/triggers/getAllProjectTemplates.ts new file mode 100644 index 0000000..f2fa092 --- /dev/null +++ b/src/triggers/getAllProjectTemplates.ts @@ -0,0 +1,37 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +import { ApiResponse, parseOk, request } from '../client'; +import { spaceField } from '../fields'; + +const perform = async (z: ZObject, bundle: Bundle) => { + const response = await request(z, bundle, { + method: 'GET', + path: `/folders/${bundle.inputData.space_id}/project-templates`, + }); + + const data: ApiResponse = parseOk(z, response.json); + + return (data.items ?? []).map((template) => ({ + id: template.id as string, + title: (template.name ?? template.title ?? template.id) as string, + })); +}; + +export default { + operation: { + perform, + inputFields: [{ ...spaceField(true), altersDynamicFields: true }], + sample: { id: '8hoA5PtYfKroDifZ', title: 'CRM Template' }, + outputFields: [ + { key: 'id', label: 'ID' }, + { key: 'title', label: 'Title' }, + ], + }, + key: 'get_all_project_templates', + noun: 'Project Templates', + display: { + label: 'Get All Project Templates', + description: 'List all project templates in a folder.', + hidden: true, + }, +}; diff --git a/src/triggers/getAllTasks.ts b/src/triggers/getAllTasks.ts new file mode 100644 index 0000000..33893a7 --- /dev/null +++ b/src/triggers/getAllTasks.ts @@ -0,0 +1,38 @@ +import { Bundle, ZObject } from 'zapier-platform-core'; + +import { ApiResponse, parseOk, request } from '../client'; +import { projectField, spaceField } from '../fields'; + +const perform = async (z: ZObject, bundle: Bundle) => { + const response = await request(z, bundle, { + method: 'GET', + path: `/projects/${bundle.inputData.project_id}/tasks`, + params: { limit: '100' }, + }); + + const data: ApiResponse = parseOk(z, response.json); + + return (data.items ?? []).map((task) => ({ + id: task.id as string, + title: (task.text ?? task.content ?? task.id) as string, + })); +}; + +export default { + operation: { + perform, + inputFields: [spaceField(false), projectField(true)], + sample: { id: '099630d4-267e-4b22-894b-08b69f3a4d79', title: 'Buy milk' }, + outputFields: [ + { key: 'id', label: 'ID' }, + { key: 'title', label: 'Title' }, + ], + }, + key: 'get_all_tasks', + noun: 'Tasks', + display: { + label: 'Get All Tasks', + description: 'List all tasks in a project.', + hidden: true, + }, +}; diff --git a/yarn.lock b/yarn.lock index c0c1f9d..a295385 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,24 +10,6 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@apollo/client@^3.6.9": - version "3.6.9" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.6.9.tgz#ad0ee2e3a3c92dbed4acd6917b6158a492739d94" - integrity sha512-Y1yu8qa2YeaCUBVuw08x8NHenFi0sw2I3KCu7Kw9mDSu86HmmtHJkCAifKVrN2iPgDTW/BbP3EpSV8/EQCcxZA== - dependencies: - "@graphql-typed-document-node/core" "^3.1.1" - "@wry/context" "^0.6.0" - "@wry/equality" "^0.5.0" - "@wry/trie" "^0.3.0" - graphql-tag "^2.12.6" - hoist-non-react-statics "^3.3.2" - optimism "^0.16.1" - prop-types "^15.7.2" - symbol-observable "^4.0.0" - ts-invariant "^0.10.3" - tslib "^2.3.0" - zen-observable-ts "^1.2.5" - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" @@ -341,11 +323,6 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@graphql-typed-document-node/core@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052" - integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== - "@humanwhocodes/config-array@^0.13.0": version "0.13.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" @@ -724,23 +701,13 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/lodash@^4.17.13": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb" - integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg== - -"@types/luxon@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.0.1.tgz#2b1657096473e24b049bdedf3710f99645f3a17f" - integrity sha512-/LAvk1cMOJt0ghzMFrZEvByUhsiEfeeT2IF53Le+Ki3A538yEL9pRZ7a6MuCxdrYK+YNqNIDmrKU/r2nnw04zQ== - "@types/node-fetch@^2.6.12": - version "2.6.12" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03" - integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== + version "2.6.13" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz#e0c9b7b5edbdb1b50ce32c127e85e880872d56ee" + integrity sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw== dependencies: "@types/node" "*" - form-data "^4.0.0" + form-data "^4.0.4" "@types/node@*", "@types/node@^20.3.1": version "20.17.9" @@ -776,11 +743,6 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== -"@types/uuid@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -884,27 +846,6 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== -"@wry/context@^0.6.0": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.1.tgz#c3c29c0ad622adb00f6a53303c4f965ee06ebeb2" - integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== - dependencies: - tslib "^2.3.0" - -"@wry/equality@^0.5.0": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.3.tgz#fafebc69561aa2d40340da89fa7dc4b1f6fb7831" - integrity sha512-avR+UXdSrsF2v8vIqIgmeTY0UR91UT+IyablCyKe/uk22uOJ8fusKZnH9JH9e1/EtLeNJBtagNmL3eJdnOV53g== - dependencies: - tslib "^2.3.0" - -"@wry/trie@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.2.tgz#a06f235dc184bd26396ba456711f69f8c35097e6" - integrity sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ== - dependencies: - tslib "^2.3.0" - "@zapier/secret-scrubber@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@zapier/secret-scrubber/-/secret-scrubber-1.1.2.tgz#4fc237c6fe0d0d91c787a1933d8d34562dfdf25f" @@ -1298,6 +1239,14 @@ call-bind-apply-helpers@^1.0.0: es-errors "^1.3.0" function-bind "^1.1.2" +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" @@ -1704,6 +1653,15 @@ dunder-proto@^1.0.0: es-errors "^1.3.0" gopd "^1.2.0" +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + electron-to-chromium@^1.4.202: version "1.4.230" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.230.tgz#666909fdf5765acb1348b69752ee9955dc1664b7" @@ -1823,6 +1781,13 @@ es-object-atoms@^1.0.0: dependencies: es-errors "^1.3.0" +es-object-atoms@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" + integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== + dependencies: + es-errors "^1.3.0" + es-set-tostringtag@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" @@ -1832,6 +1797,16 @@ es-set-tostringtag@^2.0.3: has-tostringtag "^1.0.2" hasown "^2.0.1" +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" @@ -2232,7 +2207,7 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== -form-data@4.0.1, form-data@^4.0.0: +form-data@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== @@ -2250,6 +2225,17 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.12" + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -2311,11 +2297,35 @@ get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: has-symbols "^1.1.0" hasown "^2.0.2" +get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -2417,18 +2427,6 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -graphql-tag@^2.12.6: - version "2.12.6" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" - integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== - dependencies: - tslib "^2.1.0" - -graphql@^16.6.0: - version "16.6.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" - integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== - growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -2522,13 +2520,6 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" -hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -3562,7 +3553,7 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@4.17.21, lodash@^4.17.21, lodash@^4.7.0: +lodash@4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3600,6 +3591,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -3916,14 +3912,6 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -optimism@^0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" - integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== - dependencies: - "@wry/context" "^0.6.0" - "@wry/trie" "^0.3.0" - optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -4120,7 +4108,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -4157,7 +4145,7 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -react-is@^16.13.1, react-is@^16.7.0: +react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -4770,11 +4758,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -symbol-observable@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" - integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -4884,14 +4867,7 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== -ts-invariant@^0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" - integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== - dependencies: - tslib "^2.1.0" - -tslib@^2.1.0, tslib@^2.3.0, tslib@^2.6.2: +tslib@^2.6.2: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -5083,11 +5059,6 @@ uuid@^8.3.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== - v8-to-istanbul@^7.0.0: version "7.1.2" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" @@ -5346,15 +5317,3 @@ zapier-platform-schema@17.4.0: dependencies: jsonschema "1.2.2" lodash "4.17.21" - -zen-observable-ts@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" - integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== - dependencies: - zen-observable "0.8.15" - -zen-observable@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==