From 4a798cab7b3690b963a6f2b08ae7a5ba6754693f Mon Sep 17 00:00:00 2001 From: Leela Senthil Nathan Date: Mon, 7 Oct 2024 13:46:18 -0700 Subject: [PATCH 01/10] Add "new project" trigger --- package.json | 2 +- src/index.ts | 6 + src/triggers/initiative.ts | 77 ++++++++++++ src/triggers/newProject.ts | 219 ++++++++++++++++++++++++++++++++++ src/triggers/projectStatus.ts | 51 ++++++++ 5 files changed, 354 insertions(+), 1 deletion(-) create mode 100644 src/triggers/initiative.ts create mode 100644 src/triggers/newProject.ts create mode 100644 src/triggers/projectStatus.ts diff --git a/package.json b/package.json index d4b0c01..e6cd82f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linear-zapier", - "version": "4.0.1", + "version": "4.0.2", "description": "Linear's Zapier integration", "main": "index.js", "license": "MIT", diff --git a/src/index.ts b/src/index.ts index 1fd6ddb..8a48301 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,6 +20,9 @@ import { newProjectUpdateCommentInstant } from "./triggers/commentProjectUpdateV import { newProjectUpdateInstant, updatedProjectUpdateInstant } from "./triggers/projectUpdateV2"; import { projectWithoutTeam } from "./triggers/projectWithoutTeam"; import { newIssueInstant, updatedIssueInstant } from "./triggers/issueV2"; +import { initiative } from "./triggers/initiative"; +import { projectStatus } from "./triggers/projectStatus"; +import { newProjectInstant } from "./triggers/newProject"; const handleErrors = (response: HttpResponse, z: ZObject) => { if (response.request.url !== "https://api.linear.app/graphql") { @@ -69,6 +72,9 @@ const App = { [label.key]: label, [user.key]: user, [estimate.key]: estimate, + [initiative.key]: initiative, + [projectStatus.key]: projectStatus, + [newProjectInstant.key]: newProjectInstant, }, authentication, beforeRequest: [addBearerHeader], diff --git a/src/triggers/initiative.ts b/src/triggers/initiative.ts new file mode 100644 index 0000000..032c428 --- /dev/null +++ b/src/triggers/initiative.ts @@ -0,0 +1,77 @@ +import { ZObject, Bundle } from "zapier-platform-core"; + +interface TeamStatesResponse { + data: { + initiatives: { + nodes: { + id: string; + name: string; + }[]; + pageInfo: { + hasNextPage: boolean; + endCursor: string; + }; + }; + }; +} + +const getInitiativesList = async (z: ZObject, bundle: Bundle) => { + const cursor = bundle.meta.page ? await z.cursor.get() : undefined; + + const response = await z.request({ + url: "https://api.linear.app/graphql", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + authorization: bundle.authData.api_key, + }, + body: { + query: ` + query Initiatives($after: String) { + initiatives( + first: 50 + after: $after + ) { + nodes { + id + name + } + pageInfo { + endCursor + hasNextPage + } + } + }`, + variables: { + after: cursor, + }, + }, + method: "POST", + }); + + const data = (response.json as TeamStatesResponse).data; + const initiatives = data.initiatives.nodes; + + // Set cursor for pagination + if (data.initiatives.pageInfo.hasNextPage) { + await z.cursor.set(data.initiatives.pageInfo.endCursor); + } + + return initiatives; +}; + +export const initiative = { + key: "initiative", + noun: "Initiative", + display: { + label: "Get initiative", + hidden: true, + description: + "The only purpose of this trigger is to populate the dropdown list of initiatives in the UI, thus, it's hidden.", + }, + + operation: { + perform: getInitiativesList, + canPaginate: true, + }, +}; diff --git a/src/triggers/newProject.ts b/src/triggers/newProject.ts new file mode 100644 index 0000000..50a9708 --- /dev/null +++ b/src/triggers/newProject.ts @@ -0,0 +1,219 @@ +import { omit, omitBy, pick } from "lodash"; +import { ZObject, Bundle } from "zapier-platform-core"; +import sample from "../samples/issue.json"; +import { getWebhookData, unsubscribeHook } from "../handleWebhook"; +import { jsonToGraphQLQuery, VariableType } from "json-to-graphql-query"; +import { fetchFromLinear } from "../fetchFromLinear"; + +interface IdAndName { + id: string; + name: string; +} + +interface ProjectCommon { + id: string; + url: string; + name: string; + description: string; + priority: number; + createdAt: Date; + startDate?: Date; + targetDate?: Date; + status: { + id: string; + name: string; + type: string; + }; +} + +interface ProjectApi extends ProjectCommon { + teams: { + nodes: IdAndName[]; + }; + initiatives: { + nodes: IdAndName[]; + }; + projectMilestones: { + nodes: IdAndName[]; + }; +} + +interface ProjectsResponse { + data: { + projects: { + nodes: ProjectApi[]; + }; + }; +} + +interface ProjectWebhook extends ProjectCommon { + teamIds: string[]; + milestones: IdAndName[]; + initiatives: IdAndName[]; +} + +const subscribeHook = async (z: ZObject, bundle: Bundle) => { + const inputData = + bundle.inputData && Object.keys(bundle.inputData).length > 0 + ? omitBy( + { + ...pick(bundle.inputData, ["teamId", "statusId", "leadId", "initiativeId"]), + }, + (v) => v === undefined + ) + : undefined; + + const data = { + url: bundle.targetUrl, + inputData, + }; + + return z + .request({ + url: "https://client-api.linear.app/connect/zapier/subscribe/createProject", + method: "POST", + body: data, + }) + .then((response) => response.data); +}; + +const getProjectList = + () => + async (z: ZObject, bundle: Bundle): Promise => { + const variables: Record = {}; + const variableSchema: Record = {}; + const filters: unknown[] = []; + if (bundle.inputData.statusId) { + variableSchema.statusId = "ID"; + variables.statusId = bundle.inputData.statusId; + filters.push({ status: { id: { eq: new VariableType("statusId") } } }); + } + if (bundle.inputData.leadId) { + variableSchema.leadId = "ID"; + variables.leadId = bundle.inputData.leadId; + filters.push({ lead: { id: { eq: new VariableType("leadId") } } }); + } + if (bundle.inputData.teamId) { + variableSchema.teamId = "ID!"; + variables.teamId = bundle.inputData.teamId; + filters.push({ accessibleTeams: { and: [{ id: { in: [new VariableType("teamId")] } }] } }); + } + if (bundle.inputData.initiativeId) { + variableSchema.initiativeId = "ID!"; + variables.initiativeId = bundle.inputData.initiativeId; + filters.push({ initiatives: { and: [{ id: { in: [new VariableType("initiativeId")] } }] } }); + } + const filter = { and: filters }; + + const jsonQuery = { + query: { + __variables: variableSchema, + projects: { + __args: { + first: 25, + filter, + }, + nodes: { + id: true, + url: true, + name: true, + description: true, + priority: true, + createdAt: true, + startDate: true, + targetDate: true, + status: { + id: true, + name: true, + type: true, + }, + teams: { + nodes: { + id: true, + name: true, + }, + }, + initiatives: { + nodes: { + id: true, + name: true, + }, + }, + projectMilestones: { + nodes: { + id: true, + name: true, + }, + }, + }, + }, + }, + }; + const query = jsonToGraphQLQuery(jsonQuery); + const response = await fetchFromLinear(z, bundle, query, variables); + const data = (response.json as ProjectsResponse).data; + const projectsRaw = data.projects.nodes; + // We need to map the API schema to the webhook schema + return projectsRaw.map((projectRaw) => + omit( + { + ...projectRaw, + teamIds: projectRaw.teams.nodes.map((team) => team.id), + milestones: projectRaw.projectMilestones.nodes, + initiatives: projectRaw.initiatives.nodes, + }, + ["teams", "projectMilestones"] + ) + ); + }; + +export const newProjectInstant = { + noun: "Project", + key: "newProjectInstant", + display: { + label: "New Project", + description: "Triggers when a new project is created.", + }, + operation: { + inputFields: [ + { + required: false, + label: "Team", + key: "teamId", + helpText: "The team associated with the project.", + dynamic: "team.id.name", + altersDynamicFields: true, + }, + { + required: false, + label: "Status", + key: "statusId", + helpText: "The project status.", + dynamic: "projectStatus.id.name", + altersDynamicFields: true, + }, + { + required: false, + label: "Lead", + key: "leadId", + helpText: "The user who is the lead of the project.", + dynamic: "user.id.name", + altersDynamicFields: true, + }, + { + required: false, + label: "Initiative", + key: "initiativeId", + helpText: "The initiative this project belongs to.", + dynamic: "initiative.id.name", + altersDynamicFields: true, + }, + ], + type: "hook", + perform: getWebhookData, + performUnsubscribe: unsubscribeHook, + performList: getProjectList(), + sample, + performSubscribe: subscribeHook, + }, +}; diff --git a/src/triggers/projectStatus.ts b/src/triggers/projectStatus.ts new file mode 100644 index 0000000..d0630c2 --- /dev/null +++ b/src/triggers/projectStatus.ts @@ -0,0 +1,51 @@ +import { ZObject, Bundle } from "zapier-platform-core"; + +interface ProjectStatusesResponse { + data: { + organization: { + projectStatuses: { + id: string; + name: string; + }[]; + }; + }; +} + +const getStatusList = async (z: ZObject, bundle: Bundle) => { + const response = await z.request({ + url: "https://api.linear.app/graphql", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + authorization: bundle.authData.api_key, + }, + body: { + query: ` + query ProjectStatuses { + organization { + projectStatuses { + id + name + } + } + }`, + }, + method: "POST", + }); + const data = (response.json as ProjectStatusesResponse).data; + return data.organization.projectStatuses; +}; + +export const projectStatus = { + key: "projectStatus", + noun: "Project Status", + display: { + label: "Get project status", + hidden: true, + description: + "The only purpose of this trigger is to populate the dropdown list of project statuses in the UI, thus, it's hidden.", + }, + operation: { + perform: getStatusList, + }, +}; From da4e894eeb8d4b1ee8d2e01eddf62d9310e7330c Mon Sep 17 00:00:00 2001 From: Leela Senthil Nathan Date: Mon, 7 Oct 2024 13:51:16 -0700 Subject: [PATCH 02/10] Name --- src/triggers/initiative.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/triggers/initiative.ts b/src/triggers/initiative.ts index 032c428..440f860 100644 --- a/src/triggers/initiative.ts +++ b/src/triggers/initiative.ts @@ -1,6 +1,6 @@ import { ZObject, Bundle } from "zapier-platform-core"; -interface TeamStatesResponse { +interface InitiativesResponse { data: { initiatives: { nodes: { @@ -49,7 +49,7 @@ const getInitiativesList = async (z: ZObject, bundle: Bundle) => { method: "POST", }); - const data = (response.json as TeamStatesResponse).data; + const data = (response.json as InitiativesResponse).data; const initiatives = data.initiatives.nodes; // Set cursor for pagination From 096e2cd3afee356beafa86d5eb1e65e5aa5f00ae Mon Sep 17 00:00:00 2001 From: Leela Senthil Nathan Date: Mon, 7 Oct 2024 14:29:56 -0700 Subject: [PATCH 03/10] Sample --- src/samples/project.json | 46 ++++++++++++++++++++++++++++++++++++++ src/triggers/newProject.ts | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/samples/project.json diff --git a/src/samples/project.json b/src/samples/project.json new file mode 100644 index 0000000..d1b0f1d --- /dev/null +++ b/src/samples/project.json @@ -0,0 +1,46 @@ +{ + "id": "7351c0e1-094b-4063-846b-3c30f451470f", + "url": "https://linear.app/linear/project/test-bb9746674991", + "name": "Test", + "description": "A test project", + "priority": 0, + "createdAt": "2024-10-04T22:38:43.396Z", + "startDate": "2024-10-05T22:38:43.396Z", + "targetDate": null, + "status": + { + "id": "53f3e40f-dd09-4cbc-a5f0-c965158cb203", + "name": "Idea", + "type": "backlog" + }, + "teams": + { + "nodes": + [ + { + "id": "548a0f78-eeb3-4bc8-ad6f-a4e7c4ac185c", + "name": "Linear US" + } + ] + }, + "initiatives": + { + "nodes": + [ + { + "id": "8cad3a3c-3bf0-4ad0-a48e-1a51056a6379", + "name": "Product / Work Scale" + } + ] + }, + "projectMilestones": + { + "nodes": + [ + { + "id": "1a6de292-2cc2-4e4a-b7d2-7886c4070072", + "name": "Release" + } + ] + } +} \ No newline at end of file diff --git a/src/triggers/newProject.ts b/src/triggers/newProject.ts index 50a9708..dbf593a 100644 --- a/src/triggers/newProject.ts +++ b/src/triggers/newProject.ts @@ -1,6 +1,6 @@ import { omit, omitBy, pick } from "lodash"; import { ZObject, Bundle } from "zapier-platform-core"; -import sample from "../samples/issue.json"; +import sample from "../samples/project.json"; import { getWebhookData, unsubscribeHook } from "../handleWebhook"; import { jsonToGraphQLQuery, VariableType } from "json-to-graphql-query"; import { fetchFromLinear } from "../fetchFromLinear"; From e006c06fd22ebaebf50c1dc05c31373b2b937175 Mon Sep 17 00:00:00 2001 From: leelasn Date: Mon, 7 Oct 2024 15:20:12 -0700 Subject: [PATCH 04/10] Update project.json --- src/samples/project.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/samples/project.json b/src/samples/project.json index d1b0f1d..cc6046b 100644 --- a/src/samples/project.json +++ b/src/samples/project.json @@ -1,5 +1,5 @@ { - "id": "7351c0e1-094b-4063-846b-3c30f451470f", + "id": "dc1a7af0-059e-4586-b779-d36a6a1b8478", "url": "https://linear.app/linear/project/test-bb9746674991", "name": "Test", "description": "A test project", @@ -9,8 +9,8 @@ "targetDate": null, "status": { - "id": "53f3e40f-dd09-4cbc-a5f0-c965158cb203", - "name": "Idea", + "id": "f5d6c8d3-fac2-482c-a1b0-565718d9b103", + "name": "Test status", "type": "backlog" }, "teams": @@ -18,8 +18,8 @@ "nodes": [ { - "id": "548a0f78-eeb3-4bc8-ad6f-a4e7c4ac185c", - "name": "Linear US" + "id": "cd718ff4-d8e3-4569-aa41-082d512a1809", + "name": "US Team" } ] }, @@ -28,8 +28,8 @@ "nodes": [ { - "id": "8cad3a3c-3bf0-4ad0-a48e-1a51056a6379", - "name": "Product / Work Scale" + "id": "6d6cbf03-dd67-47c6-ae21-d1b2519454e3", + "name": "Product" } ] }, @@ -38,9 +38,9 @@ "nodes": [ { - "id": "1a6de292-2cc2-4e4a-b7d2-7886c4070072", - "name": "Release" + "id": "acd884e4-c056-43b5-9a07-f4adb213a8ca", + "name": "V1" } ] } -} \ No newline at end of file +} From 1a152fa401f39d8bd5387719f5428b3ac5cbf9ab Mon Sep 17 00:00:00 2001 From: leelasn Date: Mon, 7 Oct 2024 15:31:37 -0700 Subject: [PATCH 05/10] Update documentComment.json --- src/samples/documentComment.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/samples/documentComment.json b/src/samples/documentComment.json index e7ee8ff..78d4474 100644 --- a/src/samples/documentComment.json +++ b/src/samples/documentComment.json @@ -1,5 +1,5 @@ { - "id": "cc0ab5ef-e040-451b-805b-712b7740fc2f", + "id": "acd884e4-c056-43b5-9a07-f4adb213a8ca", "body": "I agree with you, let's go with this version of the design.", "createdAt": "2024-01-05T23:36:40.311Z", "resolvedAt": null, @@ -8,14 +8,14 @@ "createdAt": "2023-09-29T18:07:35.001Z", "updatedAt": "2024-01-11T16:56:47.539Z", "project": { - "id": "73cd5db5-35a1-4d6a-a796-7060c98842f5", - "name": "iOS App", - "url": "https://linear.app/example/project/ios-app-629ae4138e0d" + "id": "d8f35c8d-055c-40b7-91ed-485298e23ebc", + "name": "Test App", + "url": "https://linear.app/example/project/test-app-629ae4138e0d" }, "document": null }, "user": { - "id": "4a6575f7-a80b-4419-8088-8119f97954c3", + "id": "044a462c-1acd-4092-8e66-51e4d7c9c7ca", "email": "another-user@example.com", "name": "Tom Lee", "avatarUrl": null From 31113d1649fdc9897cdc5e788699b4611a4d5fb1 Mon Sep 17 00:00:00 2001 From: leelasn Date: Mon, 7 Oct 2024 15:34:48 -0700 Subject: [PATCH 06/10] Update issue.json --- src/samples/issue.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/samples/issue.json b/src/samples/issue.json index edb3a5f..a4b0c45 100644 --- a/src/samples/issue.json +++ b/src/samples/issue.json @@ -1,5 +1,5 @@ { - "id": "dbb942a5-cb3e-4dd0-a4bb-34711761f6ab", + "id": "044a462c-1acd-4092-8e66-51e4d7c9c7ca", "identifier": "SAMPLE-15", "url": "https://linear.app/example/issue/SAMPLE-15", "title": "Zapier sample", @@ -12,30 +12,30 @@ "createdAt": "2022-10-27T21:20:59.199Z", "updatedAt": "2022-10-27T21:20:59.199Z", "project": { - "id": "66913eff-e405-4d04-bd31-91678259f9e7", + "id": "04a48f13-c39f-4522-85bb-a17225cbfdf3", "name": "My Project" }, "projectMilestone": { - "id": "88cdcd40-4660-4e87-b15a-5d23589afba9", - "name": "Pre-release" + "id": "84cb5a2f-4b84-4e90-a06a-d0b38f9ac2dd", + "name": "V1" }, "creator": { - "id": "df2b39ba-3dfd-4b75-9ce2-2be2d1c79a2b", + "id": "45920bc2-c4be-434f-b588-f422155667b5", "name": "Zapier User", "email": "creator@example.com" }, "assignee": { - "id": "843e7b66-9d10-11ed-a8fc-0242ac120002", - "name": "Zapier User", + "id": "8a225115-706e-4389-87da-e687b9b5ae76", + "name": "Zapier User 2", "email": "assignee@example.com" }, "status": { - "id": "e3e2a3c4-9d10-11ed-a8fc-0242ac120002", + "id": "e6d2eb84-b03b-4827-9230-94b0a1099419", "name": "In Progress", "type": "started" }, "parent": { - "id": "a4d10085-11bc-408a-909d-c9a1a146f8b4", + "id": "e6d2eb84-b03b-4827-9230-94b0a1099419", "identifier": "SAMPLE-10", "url": "https://linear.app/example/issue/SAMPLE-10", "title": "Zapier parent sample" From df4808e3914afaff3cd0acf9dc5cf8be3469dedf Mon Sep 17 00:00:00 2001 From: leelasn Date: Mon, 7 Oct 2024 15:36:09 -0700 Subject: [PATCH 07/10] Update issueComment.json --- src/samples/issueComment.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/samples/issueComment.json b/src/samples/issueComment.json index 270f188..7ff4b6d 100644 --- a/src/samples/issueComment.json +++ b/src/samples/issueComment.json @@ -1,21 +1,21 @@ { - "id": "dbb942a5-cb3e-4dd0-a4bb-34711761f6ab", + "id": "e6d2eb84-b03b-4827-9230-94b0a1099419", "body": "New comment", "url": "https://linear.app/example/issue/SAMPLE-15#comment-dbb942a5-cb3e-4dd0-a4bb-34711761f6ab", "createdAt": "2020-10-27T21:20:59.199Z", "updatedAt": "2020-10-27T21:20:59.199Z", "issue": { - "id": "dbb942a5-cb3e-4dd0-a4bb-34711761f6ac", + "id": "824797c0-fc97-493c-8237-08ff5ec3701f", "identifier": "SAMPLE-15", "title": "Zapier sample", "url": "https://linear.app/example/issue/SAMPLE-15", "team": { - "id": "df2b39ba-3dfd-4b75-9ce2-2be2d1c79a2d", + "id": "a582cb67-8f1b-4d8a-9d91-e9894dcf7fa6", "name": "Sample team" } }, "user": { - "id": "df2b39ba-3dfd-4b75-9ce2-2be2d1c79a2b", + "id": "722c8d97-f01e-4d2a-85da-271592463f8d", "name": "Zapier User", "email": "user@example.com", "avatarUrl": null From 40eb42603fad35f633097b8a57aa9afc6f211ab9 Mon Sep 17 00:00:00 2001 From: leelasn Date: Mon, 7 Oct 2024 15:37:08 -0700 Subject: [PATCH 08/10] Update projectUpdate.json --- src/samples/projectUpdate.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/samples/projectUpdate.json b/src/samples/projectUpdate.json index 110bd79..515a9ad 100644 --- a/src/samples/projectUpdate.json +++ b/src/samples/projectUpdate.json @@ -1,5 +1,5 @@ { - "id": "4bec2b49-56bb-4a4f-a961-abf2148d4837", + "id": "722c8d97-f01e-4d2a-85da-271592463f8d", "body": "This is a project update body in Markdown format!", "health": "onTrack", "url": "https://local.linear.dev/linear/updateA", @@ -7,11 +7,11 @@ "createdAt": "2022-10-27T21:20:59.199Z", "updatedAt": "2022-10-27T21:20:59.199Z", "project": { - "id": "72aaeee5-f7de-419b-aa89-10640f513ddf", + "id": "e632a843-19da-4199-9489-3a962a96b549", "name": "My Project" }, "user": { - "id": "df2b39ba-3dfd-4b75-9ce2-2be2d1c79a2b", + "id": "e632a843-19da-4199-9489-3a962a96b549", "name": "Zapier User", "email": "creator@example.com" } From 51ec17c33a40165ddce2431f78d17705de577d8c Mon Sep 17 00:00:00 2001 From: leelasn Date: Mon, 7 Oct 2024 15:38:48 -0700 Subject: [PATCH 09/10] Update projectUpdateComment.json --- src/samples/projectUpdateComment.json | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/samples/projectUpdateComment.json b/src/samples/projectUpdateComment.json index b61bec6..21fbb3e 100644 --- a/src/samples/projectUpdateComment.json +++ b/src/samples/projectUpdateComment.json @@ -1,27 +1,26 @@ { - "id": "cc0ab5ef-e040-451b-805b-712b7740fc2f", + "id": "e632a843-19da-4199-9489-3a962a96b549", "body": "A great update! I'm looking forward to trying it out.", "createdAt": "2024-01-05T23:36:40.311Z", "resolvedAt": null, - "resolvingUser": null, "projectUpdate": { - "id": "bb1cfa33-722b-492f-9277-b47133baff13", + "id": "799e7b95-2902-4c0a-86d8-d817a60f7f9f", "body": "This week I focused on getting email attachments working and an initial implementation is now in review on GitHub.", "user": { - "id": "46832797-1b82-48ab-bb4a-592adf8d1572", + "id": "a3188fa9-f757-4046-a847-b5174a39b978", "name": "John Smith", "email": "user@example.com", "avatarUrl": null }, "url": "https://linear.app/example/project/the-bext-project-4437c60bc5ec#projectUpdate-bb1cfa33", "project": { - "id": "9f337b8e-f1fa-4d37-b41a-7f58e2321b63", + "id": "a3188fa9-f757-4046-a847-b5174a39b978", "name": "The Best Project", "url": "https://linear.app/example/project/the-bext-project-4437c60bc5ec" } }, "user": { - "id": "4a6575f7-a80b-4419-8088-8119f97954c3", + "id": "fda6d8ba-2d19-4776-affa-0cdd7ab158de", "email": "another-user@example.com", "name": "Tom Lee", "avatarUrl": null From 8728b5db61f3fe172d9d47acca061604995cfd22 Mon Sep 17 00:00:00 2001 From: leelasn Date: Tue, 8 Oct 2024 13:33:00 -0700 Subject: [PATCH 10/10] 4.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e6cd82f..e9a651a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linear-zapier", - "version": "4.0.2", + "version": "4.1.0", "description": "Linear's Zapier integration", "main": "index.js", "license": "MIT",