@mspcopilot/n8n-nodes-connectwise 0.1.1

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 (52) hide show
  1. package/README.md +59 -0
  2. package/dist-community/LICENSE.md +21 -0
  3. package/dist-community/credentials/ConnectWisePsaApi.credentials.js +142 -0
  4. package/dist-community/credentials/connectwise.svg +1 -0
  5. package/dist-community/nodes/ConnectWise/PSA/ConnectWisePsa.node.js +180 -0
  6. package/dist-community/nodes/ConnectWise/PSA/connectwise.svg +1 -0
  7. package/dist-community/nodes/ConnectWise/PSA/descriptions/common.descriptions.js +46 -0
  8. package/dist-community/nodes/ConnectWise/PSA/descriptions/common.properties.js +353 -0
  9. package/dist-community/nodes/ConnectWise/PSA/descriptions/index.js +30 -0
  10. package/dist-community/nodes/ConnectWise/PSA/helpers/customFields.js +116 -0
  11. package/dist-community/nodes/ConnectWise/PSA/helpers/field-collector.js +83 -0
  12. package/dist-community/nodes/ConnectWise/PSA/helpers/field-conditions.js +86 -0
  13. package/dist-community/nodes/ConnectWise/PSA/helpers/index.js +33 -0
  14. package/dist-community/nodes/ConnectWise/PSA/helpers/logging.js +61 -0
  15. package/dist-community/nodes/ConnectWise/PSA/helpers/utils.js +128 -0
  16. package/dist-community/nodes/ConnectWise/PSA/methods/fieldOptions.js +223 -0
  17. package/dist-community/nodes/ConnectWise/PSA/methods/generated.js +53 -0
  18. package/dist-community/nodes/ConnectWise/PSA/methods/index.js +40 -0
  19. package/dist-community/nodes/ConnectWise/PSA/schema/converter/index.js +66 -0
  20. package/dist-community/nodes/ConnectWise/PSA/schema/converter/reference.generator.js +178 -0
  21. package/dist-community/nodes/ConnectWise/PSA/schema/index.js +39 -0
  22. package/dist-community/nodes/ConnectWise/PSA/schema/references.js +293 -0
  23. package/dist-community/nodes/ConnectWise/PSA/schema/reports-descriptions.js +300 -0
  24. package/dist-community/nodes/ConnectWise/PSA/schema/resources/activity.schema.js +413 -0
  25. package/dist-community/nodes/ConnectWise/PSA/schema/resources/alert-consolidation.js +42 -0
  26. package/dist-community/nodes/ConnectWise/PSA/schema/resources/company.schema.js +720 -0
  27. package/dist-community/nodes/ConnectWise/PSA/schema/resources/contact.schema.js +461 -0
  28. package/dist-community/nodes/ConnectWise/PSA/schema/resources/custom.schema.js +163 -0
  29. package/dist-community/nodes/ConnectWise/PSA/schema/resources/index.js +72 -0
  30. package/dist-community/nodes/ConnectWise/PSA/schema/resources/members.schema.js +361 -0
  31. package/dist-community/nodes/ConnectWise/PSA/schema/resources/reports.schema.js +177 -0
  32. package/dist-community/nodes/ConnectWise/PSA/schema/resources/ticket.schema.js +983 -0
  33. package/dist-community/nodes/ConnectWise/PSA/schema/resources/ticketNote.schema.js +289 -0
  34. package/dist-community/nodes/ConnectWise/PSA/schema/resources/timeEntry.schema.js +407 -0
  35. package/dist-community/nodes/ConnectWise/PSA/schema/static-fields.js +1813 -0
  36. package/dist-community/nodes/ConnectWise/PSA/schema/transformer.js +126 -0
  37. package/dist-community/nodes/ConnectWise/PSA/schema/types/index.js +33 -0
  38. package/dist-community/nodes/ConnectWise/PSA/schema/types/reference.types.js +23 -0
  39. package/dist-community/nodes/ConnectWise/PSA/schema/types/resource.types.js +23 -0
  40. package/dist-community/nodes/ConnectWise/PSA/transport/cache.js +81 -0
  41. package/dist-community/nodes/ConnectWise/PSA/transport/client.js +200 -0
  42. package/dist-community/nodes/ConnectWise/PSA/transport/index.js +105 -0
  43. package/dist-community/nodes/ConnectWise/PSA/transport/operations.js +167 -0
  44. package/dist-community/nodes/ConnectWise/PSA/transport/response-transformer.js +123 -0
  45. package/dist-community/nodes/ConnectWise/PSA/transport/version-check.js +128 -0
  46. package/dist-community/nodes/ConnectWise/PSA/types/n8n-augmentation.d.js +1 -0
  47. package/dist-community/nodes/ConnectWisePsa.node.json +25 -0
  48. package/docs/assets/screenshots/create-ticket.png +0 -0
  49. package/docs/assets/screenshots/field-list.png +0 -0
  50. package/docs/assets/screenshots/field-sort.png +0 -0
  51. package/index.js +0 -0
  52. package/package.json +73 -0
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # n8n-nodes-connectwise
2
+
3
+ n8n node to integrate with ConnectWise PSA (Manage)
4
+
5
+ This aims to be a `better-than-first-party` implementation of a ConnectWise integration
6
+ for n8n. This has been an exhaustive, and rewarding build of all the functionality
7
+ we've desired after 2+ years of using n8n at our MSP.
8
+
9
+ No automation platform we've ever used has this speed of development, reliability,
10
+ and extensibility.
11
+
12
+ **WARNING**: This is beta. Just because it works for us, doesn't mean there won't be obvious bugs I haven't found yet. :)
13
+
14
+ ## Covered Actions (so far)
15
+ - Activities
16
+ - Companies
17
+ - Contacts
18
+ - Members
19
+ - Tickets
20
+ - Ticket Notes
21
+ - Time Entries
22
+
23
+ ## Features
24
+
25
+ **Lookup fields for almost all options**: Don't lookup ID numbers of boards or statuses. Just quickly create your workflow.
26
+ ![Create Ticket](docs/assets/screenshots/create-ticket.png)
27
+
28
+ **Override fields easily by drag & drop**: Any field (including nested) in **Additional Assignments** will override any options above--including blank ones.
29
+
30
+ **Quickly choose sort and field names**: Quickly identify only the fields you need or a sort. Intelligently chosen defaults. Override them with an expression if you need more customization.
31
+ ![Field Sort](docs/assets/screenshots/field-sort.png)
32
+ ![Field List](docs/assets/screenshots/field-list.png)
33
+
34
+ ## Roadmap
35
+
36
+ ### Built (in private testing)
37
+ - Custom fields
38
+ - Caching
39
+ - IF Schedule (checks timezones, calendars, etc. in a single action)
40
+ - Ticket Creation with Deduplication/Consolidation
41
+ - Many more endpoints (which ones do you want first?)
42
+ - Reports
43
+
44
+ ### Future
45
+ - Intelligent upserts (find possible duplicates to update before inserting)
46
+ - Auto link to IT Glue assets, Microsoft tenants, etc.
47
+ - More n8n nodes
48
+ - [UniFi Site Manager](https://www.npmjs.com/package/@mspcopilot/n8n-nodes-unifi-sitemanager)
49
+ - Nodes in use internally (testing):
50
+ - Microsoft Partner GDAP
51
+ - IT Glue
52
+ - Zabbix
53
+ - UniFi Local Controller
54
+
55
+ ## When?
56
+
57
+ Sign up to [tell me when stuff happens](https://tally.so/r/3jjKQ6)
58
+
59
+ I'll probably post on [r/msp](https://www.reddit.com/r/msp/) too
@@ -0,0 +1,21 @@
1
+ # Sustainable Use License (SUL-1.0)
2
+
3
+ Copyright (c) 2025 MSP Copilot
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to use,
7
+ copy, modify, merge, publish, distribute, and/or sublicense copies of the
8
+ Software, subject to the following conditions:
9
+
10
+ 1. You may not use the Software to provide a commercial software-as-a-service
11
+ (SaaS) product or service that competes with this project.
12
+
13
+ 2. You must retain the above copyright notice and this permission notice in
14
+ all copies or substantial portions of the Software.
15
+
16
+ 3. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+
20
+ For the full terms of this license, see:
21
+ https://spdx.org/licenses/SUL-1.0.html
@@ -0,0 +1,142 @@
1
+ var __defProp = Object.defineProperty;
2
+
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+
9
+ var __export = (target, all) => {
10
+ for (var name in all) __defProp(target, name, {
11
+ get: all[name],
12
+ enumerable: !0
13
+ });
14
+ }, __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, {
16
+ get: () => from[key],
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
19
+ return to;
20
+ };
21
+
22
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
23
+ value: !0
24
+ }), mod);
25
+
26
+ var ConnectWisePsaApi_credentials_exports = {};
27
+
28
+ __export(ConnectWisePsaApi_credentials_exports, {
29
+ ConnectWisePsaApi: () => ConnectWisePsaApi
30
+ });
31
+
32
+ module.exports = __toCommonJS(ConnectWisePsaApi_credentials_exports);
33
+
34
+ var import_transport = require("../nodes/ConnectWise/PSA/transport");
35
+
36
+ class ConnectWisePsaApi {
37
+ name="connectWisePsaApi";
38
+ displayName="ConnectWise PSA API";
39
+ documentationUrl="https://{$DOCURL_PREFIX}connectwise/psa{$DOCURL_SUFFIX}";
40
+ icon="file:connectwise.svg";
41
+ properties=[ {
42
+ displayName: "ConnectWise Site",
43
+ name: "site",
44
+ type: "options",
45
+ options: [ {
46
+ name: "North America (api-na.myconnectwise.net)",
47
+ value: "api-na.myconnectwise.net"
48
+ }, {
49
+ name: "Australia (api-au.myconnectwise.net)",
50
+ value: "api-au.myconnectwise.net"
51
+ }, {
52
+ name: "Europe (api-eu.myconnectwise.net)",
53
+ value: "api-eu.myconnectwise.net"
54
+ }, {
55
+ name: "Staging (api-staging.connectwisedev.com)",
56
+ value: "api-staging.connectwisedev.com"
57
+ }, {
58
+ name: "Custom…",
59
+ value: "custom"
60
+ } ],
61
+ default: "api-na.myconnectwise.net",
62
+ description: "The URL of your ConnectWise Manage instance."
63
+ }, {
64
+ displayName: "Custom Server",
65
+ name: "customServer",
66
+ type: "string",
67
+ default: "",
68
+ placeholder: "e.g. psa.mycompany.com",
69
+ description: 'Only fill this if you selected "Custom…" above. Enter your server hostname without https://.',
70
+ displayOptions: {
71
+ show: {
72
+ site: [ "custom" ]
73
+ }
74
+ }
75
+ }, {
76
+ displayName: "Company ID",
77
+ name: "companyId",
78
+ type: "string",
79
+ default: "",
80
+ description: "Your ConnectWise Company ID.",
81
+ required: !0
82
+ }, {
83
+ displayName: "Client ID",
84
+ name: "clientId",
85
+ type: "string",
86
+ default: "",
87
+ hint: 'The Client ID from your ConnectWise developer account. Create them at <a href="https://developer.connectwise.com/ClientID">https://developer.connectwise.com/ClientID</a>.',
88
+ required: !0
89
+ }, {
90
+ displayName: "Public Key",
91
+ name: "publicKey",
92
+ type: "string",
93
+ default: "",
94
+ typeOptions: {
95
+ password: !0
96
+ },
97
+ required: !0
98
+ }, {
99
+ displayName: "Private Key",
100
+ name: "privateKey",
101
+ type: "string",
102
+ default: "",
103
+ typeOptions: {
104
+ password: !0
105
+ },
106
+ required: !0
107
+ }, {
108
+ displayName: "API Path",
109
+ name: "apiPath",
110
+ type: "string",
111
+ default: "",
112
+ placeholder: import_transport.DEFAULT_API_PATH,
113
+ hint: `Leave blank to use the default API path (${import_transport.DEFAULT_API_PATH})`,
114
+ description: "Custom API version path. Leave empty to use the default."
115
+ }, {
116
+ displayName: "Check for Updates",
117
+ name: "checkForUpdates",
118
+ type: "boolean",
119
+ default: !1,
120
+ hint: "Current version: 0.1.1 (community edition)",
121
+ description: "Check for new versions of this node package and show notifications when updates are available"
122
+ } ];
123
+ async authenticate(credentials, requestOptions) {
124
+ const serverUrl = credentials.site === "custom" ? credentials.customServer : credentials.site, base64Auth = Buffer.from(`${credentials.companyId}+${credentials.publicKey}:${credentials.privateKey}`).toString("base64");
125
+ return requestOptions.baseURL || (requestOptions.baseURL = `https://${serverUrl}`),
126
+ requestOptions.headers = {
127
+ ...requestOptions.headers,
128
+ clientId: credentials.clientId,
129
+ Authorization: `Basic ${base64Auth}`
130
+ }, requestOptions;
131
+ }
132
+ test={
133
+ request: {
134
+ url: `={{$credentials.apiPath || "${import_transport.DEFAULT_API_PATH}"}}/company/companies`,
135
+ method: "GET"
136
+ }
137
+ };
138
+ }
139
+
140
+ 0 && (module.exports = {
141
+ ConnectWisePsaApi: ConnectWisePsaApi
142
+ });
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="244 340 504 252"><g transform="scale(2)"> <path d="M298.529 207.425C283.091 198.75 265.737 194.126 247.982 194.126C230.228 194.126 212.894 198.75 197.436 207.425C203.628 213.64 209.419 220.554 214.79 228.127C224.057 241.192 230.249 253.579 233.956 262.169L247.982 239.114L262.009 262.169C265.716 253.579 271.887 241.192 281.175 228.127C286.545 220.554 292.358 213.661 298.529 207.425ZM368.957 182.46C350.529 186.087 333.806 193.914 318.937 205.771C315.61 208.422 312.387 211.264 309.249 214.318C302.973 220.448 297.055 227.363 291.537 235.105C275.951 256.973 269.528 277.335 269.465 277.547C268.749 279.859 266.79 281.534 264.41 281.895C264.115 281.937 263.799 281.959 263.504 281.959C261.44 281.959 259.503 280.941 258.323 279.18L247.982 263.675L237.641 279.18C236.483 280.941 234.524 281.959 232.46 281.959C232.165 281.959 231.849 281.937 231.555 281.895C229.175 281.534 227.216 279.859 226.5 277.547C226.437 277.356 220.013 256.973 204.428 235.126C198.868 227.342 192.907 220.363 186.589 214.212C185.873 213.512 185.136 212.813 184.399 212.134C184.378 212.113 184.357 212.091 184.336 212.07C181.956 209.864 179.513 207.786 177.048 205.792C162.179 193.914 145.457 186.109 127.028 182.482C123.658 181.782 121.447 178.494 122.121 175.079C122.774 171.685 126.059 169.458 129.429 170.116C150.785 174.337 170.498 183.966 187.726 198.453C205.923 187.381 226.689 181.421 248.003 181.421C269.317 181.421 290.083 187.36 308.28 198.453C325.508 183.966 345.2 174.337 366.577 170.116C369.968 169.458 373.233 171.664 373.886 175.079C374.539 178.494 372.327 181.782 368.957 182.46ZM169.129 212.41C147.584 232.114 133.389 259.242 129.198 288.767C128.713 292.225 131.093 295.449 134.547 295.936C138.001 296.424 141.181 294.027 141.666 290.549C145.436 263.93 158.199 239.517 177.596 221.785C178.754 220.724 179.955 219.685 181.155 218.667C178.017 215.676 174.795 212.876 171.467 210.31C170.688 211.01 169.909 211.688 169.129 212.41ZM366.788 288.767C367.273 292.225 364.893 295.449 361.439 295.936C361.144 295.979 360.828 296 360.533 296C357.458 296 354.762 293.709 354.299 290.549C350.529 263.93 337.766 239.517 318.369 221.785C317.189 220.724 316.01 219.685 314.809 218.667C317.947 215.676 321.17 212.876 324.497 210.31C325.298 210.988 326.077 211.688 326.856 212.41C348.423 232.114 362.597 259.242 366.788 288.767Z" fill="#24336A"></path> </g></svg>
@@ -0,0 +1,180 @@
1
+ var __defProp = Object.defineProperty;
2
+
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+
9
+ var __export = (target, all) => {
10
+ for (var name in all) __defProp(target, name, {
11
+ get: all[name],
12
+ enumerable: !0
13
+ });
14
+ }, __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, {
16
+ get: () => from[key],
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
19
+ return to;
20
+ };
21
+
22
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
23
+ value: !0
24
+ }), mod);
25
+
26
+ var ConnectWisePsa_node_exports = {};
27
+
28
+ __export(ConnectWisePsa_node_exports, {
29
+ ConnectWisePsa: () => ConnectWisePsa
30
+ });
31
+
32
+ module.exports = __toCommonJS(ConnectWisePsa_node_exports);
33
+
34
+ var import_n8n_workflow = require("n8n-workflow"), import_methods = require("./methods"), import_fieldOptions = require("./methods/fieldOptions"), import_activity = require("./schema/resources/activity.schema"), import_company = require("./schema/resources/company.schema"), import_contact = require("./schema/resources/contact.schema"), import_members = require("./schema/resources/members.schema"), import_reports = require("./schema/resources/reports.schema"), import_ticket = require("./schema/resources/ticket.schema"), import_ticketNote = require("./schema/resources/ticketNote.schema"), import_timeEntry = require("./schema/resources/timeEntry.schema"), import_custom = require("./schema/resources/custom.schema");
35
+
36
+ const resources = {
37
+ activity: {
38
+ schema: import_activity.activitySchema,
39
+ execute: import_activity.execute
40
+ },
41
+ company: {
42
+ schema: import_company.companySchema,
43
+ execute: import_company.execute
44
+ },
45
+ contact: {
46
+ schema: import_contact.contactSchema,
47
+ execute: import_contact.execute
48
+ },
49
+ members: {
50
+ schema: import_members.membersSchema,
51
+ execute: import_members.execute
52
+ },
53
+ ticket: {
54
+ schema: import_ticket.ticketSchema,
55
+ execute: import_ticket.execute
56
+ },
57
+ ticketNote: {
58
+ schema: import_ticketNote.ticketNoteSchema,
59
+ execute: import_ticketNote.execute
60
+ },
61
+ timeEntry: {
62
+ schema: import_timeEntry.timeEntrySchema,
63
+ execute: import_timeEntry.execute
64
+ },
65
+ custom: {
66
+ schema: import_custom.customSchema,
67
+ execute: import_custom.execute
68
+ }
69
+ };
70
+
71
+ class ConnectWisePsa {
72
+ constructor() {
73
+ console.log(`🔌 ConnectWise PSA Node Loaded | 🏗️ Build: ${"community".toUpperCase()} (${"prod".toUpperCase()} mode)`);
74
+ }
75
+ description={
76
+ displayName: "ConnectWise PSA",
77
+ name: "connectWisePsa",
78
+ icon: "file:connectwise.svg",
79
+ group: [ "transform" ],
80
+ version: 1,
81
+ subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
82
+ description: "Consume ConnectWise PSA API",
83
+ defaults: {
84
+ name: "ConnectWise PSA"
85
+ },
86
+ inputs: [ import_n8n_workflow.NodeConnectionType.Main ],
87
+ outputs: [ import_n8n_workflow.NodeConnectionType.Main ],
88
+ credentials: [ {
89
+ name: "connectWisePsaApi",
90
+ required: !0
91
+ } ],
92
+ hints: Object.values(resources).filter(({schema: schema}) => schema.hints).flatMap(({schema: schema}) => schema.hints),
93
+ properties: [ {
94
+ displayName: "Resource",
95
+ name: "resource",
96
+ type: "options",
97
+ noDataExpression: !0,
98
+ default: "",
99
+ options: Object.entries(resources).map(([value, {schema: schema}]) => ({
100
+ name: schema.displayName,
101
+ value: value
102
+ }))
103
+ }, ...Object.entries(resources).flatMap(([resourceName, {schema: schema}]) => {
104
+ const processedFields = [];
105
+ for (const field of schema.fields) {
106
+ const operations = field.displayOptions?.show?.operation, operationsArray = Array.isArray(operations) ? operations : operations ? [ operations ] : [ "create", "update" ];
107
+ if (field.x_requiredOnCreate === !0 && operationsArray.includes("create") && operationsArray.length > 1) {
108
+ const createField = {
109
+ ...field
110
+ };
111
+ delete createField.x_requiredOnCreate, createField.required = !0, createField.displayOptions = {
112
+ ...field.displayOptions,
113
+ show: {
114
+ ...field.displayOptions?.show,
115
+ resource: [ resourceName ],
116
+ operation: [ "create" ]
117
+ }
118
+ }, processedFields.push(createField);
119
+ const otherOps = operationsArray.filter(op => op !== "create"), updateField = {
120
+ ...field
121
+ };
122
+ delete updateField.x_requiredOnCreate, delete updateField.required, updateField.displayOptions = {
123
+ ...field.displayOptions,
124
+ show: {
125
+ ...field.displayOptions?.show,
126
+ resource: [ resourceName ],
127
+ operation: otherOps
128
+ }
129
+ }, processedFields.push(updateField);
130
+ } else processedFields.push({
131
+ ...field,
132
+ displayOptions: {
133
+ show: {
134
+ ...field.displayOptions?.show,
135
+ resource: [ resourceName ]
136
+ }
137
+ }
138
+ });
139
+ }
140
+ return processedFields;
141
+ }) ]
142
+ };
143
+ methods={
144
+ loadOptions: {
145
+ ...import_methods.loadOptions,
146
+ loadFieldsOptions: import_fieldOptions.loadFieldsOptions,
147
+ loadOrderByFieldsOptions: import_fieldOptions.loadOrderByFieldsOptions,
148
+ loadCustomFieldsOptions: import_fieldOptions.loadCustomFieldsOptions,
149
+ loadReportColumns: import_reports.loadReportColumns
150
+ },
151
+ listSearch: import_methods.listSearch
152
+ };
153
+ async execute() {
154
+ const items = this.getInputData(), returnData = [], resource = this.getNodeParameter("resource", 0), operation = this.getNodeParameter("operation", 0);
155
+ for (let i = 0; i < items.length; i++) try {
156
+ const resourceData = resources[resource];
157
+ if (!resourceData) throw new import_n8n_workflow.NodeOperationError(this.getNode(), `Resource ${resource} not found`);
158
+ const responseData = await resourceData.execute.call(this, operation, i);
159
+ returnData.push(...responseData);
160
+ } catch (error) {
161
+ if (this.continueOnFail()) {
162
+ const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({
163
+ error: error.message
164
+ }), {
165
+ itemData: {
166
+ item: i
167
+ }
168
+ });
169
+ returnData.push(...executionData);
170
+ continue;
171
+ }
172
+ throw error;
173
+ }
174
+ return [ returnData ];
175
+ }
176
+ }
177
+
178
+ 0 && (module.exports = {
179
+ ConnectWisePsa: ConnectWisePsa
180
+ });
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="244 340 504 252"><g transform="scale(2)"> <path d="M298.529 207.425C283.091 198.75 265.737 194.126 247.982 194.126C230.228 194.126 212.894 198.75 197.436 207.425C203.628 213.64 209.419 220.554 214.79 228.127C224.057 241.192 230.249 253.579 233.956 262.169L247.982 239.114L262.009 262.169C265.716 253.579 271.887 241.192 281.175 228.127C286.545 220.554 292.358 213.661 298.529 207.425ZM368.957 182.46C350.529 186.087 333.806 193.914 318.937 205.771C315.61 208.422 312.387 211.264 309.249 214.318C302.973 220.448 297.055 227.363 291.537 235.105C275.951 256.973 269.528 277.335 269.465 277.547C268.749 279.859 266.79 281.534 264.41 281.895C264.115 281.937 263.799 281.959 263.504 281.959C261.44 281.959 259.503 280.941 258.323 279.18L247.982 263.675L237.641 279.18C236.483 280.941 234.524 281.959 232.46 281.959C232.165 281.959 231.849 281.937 231.555 281.895C229.175 281.534 227.216 279.859 226.5 277.547C226.437 277.356 220.013 256.973 204.428 235.126C198.868 227.342 192.907 220.363 186.589 214.212C185.873 213.512 185.136 212.813 184.399 212.134C184.378 212.113 184.357 212.091 184.336 212.07C181.956 209.864 179.513 207.786 177.048 205.792C162.179 193.914 145.457 186.109 127.028 182.482C123.658 181.782 121.447 178.494 122.121 175.079C122.774 171.685 126.059 169.458 129.429 170.116C150.785 174.337 170.498 183.966 187.726 198.453C205.923 187.381 226.689 181.421 248.003 181.421C269.317 181.421 290.083 187.36 308.28 198.453C325.508 183.966 345.2 174.337 366.577 170.116C369.968 169.458 373.233 171.664 373.886 175.079C374.539 178.494 372.327 181.782 368.957 182.46ZM169.129 212.41C147.584 232.114 133.389 259.242 129.198 288.767C128.713 292.225 131.093 295.449 134.547 295.936C138.001 296.424 141.181 294.027 141.666 290.549C145.436 263.93 158.199 239.517 177.596 221.785C178.754 220.724 179.955 219.685 181.155 218.667C178.017 215.676 174.795 212.876 171.467 210.31C170.688 211.01 169.909 211.688 169.129 212.41ZM366.788 288.767C367.273 292.225 364.893 295.449 361.439 295.936C361.144 295.979 360.828 296 360.533 296C357.458 296 354.762 293.709 354.299 290.549C350.529 263.93 337.766 239.517 318.369 221.785C317.189 220.724 316.01 219.685 314.809 218.667C317.947 215.676 321.17 212.876 324.497 210.31C325.298 210.988 326.077 211.688 326.856 212.41C348.423 232.114 362.597 259.242 366.788 288.767Z" fill="#24336A"></path> </g></svg>
@@ -0,0 +1,46 @@
1
+ var __defProp = Object.defineProperty;
2
+
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+
9
+ var __export = (target, all) => {
10
+ for (var name in all) __defProp(target, name, {
11
+ get: all[name],
12
+ enumerable: !0
13
+ });
14
+ }, __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, {
16
+ get: () => from[key],
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
19
+ return to;
20
+ };
21
+
22
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
23
+ value: !0
24
+ }), mod);
25
+
26
+ var common_descriptions_exports = {};
27
+
28
+ __export(common_descriptions_exports, {
29
+ CHANGELOG_URL: () => CHANGELOG_URL,
30
+ DOCURL_PREFIX: () => DOCURL_PREFIX,
31
+ DOCURL_SUFFIX: () => DOCURL_SUFFIX,
32
+ VERSION_CHECK_CACHE_TTL: () => VERSION_CHECK_CACHE_TTL,
33
+ VERSION_CHECK_URL: () => VERSION_CHECK_URL
34
+ });
35
+
36
+ module.exports = __toCommonJS(common_descriptions_exports);
37
+
38
+ const DOCURL_PREFIX = "mspcopilot.io/docs/", DOCURL_SUFFIX = "?utm_source=n8n_node_connectwise", CHANGELOG_URL = "mspcopilot.io/changelog", VERSION_CHECK_URL = "https://djstgzbunlbcnghwfzja.supabase.co/functions/v1/version-check/n8n-nodes-connectwise", VERSION_CHECK_CACHE_TTL = 6e5;
39
+
40
+ 0 && (module.exports = {
41
+ CHANGELOG_URL: CHANGELOG_URL,
42
+ DOCURL_PREFIX: DOCURL_PREFIX,
43
+ DOCURL_SUFFIX: DOCURL_SUFFIX,
44
+ VERSION_CHECK_CACHE_TTL: VERSION_CHECK_CACHE_TTL,
45
+ VERSION_CHECK_URL: VERSION_CHECK_URL
46
+ });