@thegraphitelab/n8n-nodes-servicetitan 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -5
- package/dist/credentials/ServiceTitanApi.credentials.js +74 -56
- package/dist/credentials/ServiceTitanApi.credentials.js.map +1 -1
- package/dist/nodes/ServiceTitan/ServiceTitan.node.js +14 -3
- package/dist/nodes/ServiceTitan/ServiceTitan.node.js.map +1 -1
- package/dist/nodes/ServiceTitan/ServiceTitanTrigger.node.js +14 -3
- package/dist/nodes/ServiceTitan/ServiceTitanTrigger.node.js.map +1 -1
- package/dist/nodes/ServiceTitan/v1/ServiceTitanTriggerV1.node.js +10 -6
- package/dist/nodes/ServiceTitan/v1/ServiceTitanTriggerV1.node.js.map +1 -1
- package/dist/nodes/ServiceTitan/v1/ServiceTitanV1.node.js +7 -6
- package/dist/nodes/ServiceTitan/v1/ServiceTitanV1.node.js.map +1 -1
- package/dist/nodes/ServiceTitan/v1/methods/methods.js +2 -2
- package/dist/nodes/ServiceTitan/v1/methods/methods.js.map +1 -1
- package/dist/nodes/ServiceTitan/v1/settings/description.d.ts +5 -0
- package/dist/nodes/ServiceTitan/v1/settings/description.js +94 -0
- package/dist/nodes/ServiceTitan/v1/settings/description.js.map +1 -0
- package/dist/nodes/ServiceTitan/v1/settings/index.d.ts +3 -0
- package/dist/nodes/ServiceTitan/v1/settings/index.js +14 -0
- package/dist/nodes/ServiceTitan/v1/settings/index.js.map +1 -0
- package/dist/nodes/ServiceTitan/v1/settings/manifest.d.ts +2 -0
- package/dist/nodes/ServiceTitan/v1/{manifest.js → settings/manifest.js} +1 -1
- package/dist/nodes/ServiceTitan/v1/settings/manifest.js.map +1 -0
- package/dist/nodes/ServiceTitan/v1/settings/transport.d.ts +3 -0
- package/dist/nodes/ServiceTitan/v1/settings/transport.js +31 -0
- package/dist/nodes/ServiceTitan/v1/settings/transport.js.map +1 -0
- package/dist/nodes/ServiceTitanHandwritten/ServiceTitanHandwrittenTrigger.node.d.ts +4 -0
- package/dist/nodes/ServiceTitanHandwritten/ServiceTitanHandwrittenTrigger.node.js +27 -0
- package/dist/nodes/ServiceTitanHandwritten/ServiceTitanHandwrittenTrigger.node.js.map +1 -0
- package/dist/nodes/ServiceTitanHandwritten/ServiceTitanHandwrittenTrigger.node.json +18 -0
- package/dist/nodes/ServiceTitanHandwritten/servicetitan.dark.svg +5 -0
- package/dist/nodes/ServiceTitanHandwritten/servicetitan.svg +5 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/ServiceTitanHandwrittenTriggerV1.node.d.ts +13 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/ServiceTitanHandwrittenTriggerV1.node.js +67 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/ServiceTitanHandwrittenTriggerV1.node.js.map +1 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/parameters/index.d.ts +3 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/parameters/index.js +6 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/parameters/index.js.map +1 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/parameters/types.d.ts +1 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/parameters/types.js.map +1 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/triggers/index.d.ts +3 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/triggers/index.js +18 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/triggers/index.js.map +1 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/triggers/webhook/onJobCompletion/description.d.ts +3 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/triggers/webhook/onJobCompletion/description.js +15 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/triggers/webhook/onJobCompletion/description.js.map +1 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/triggers/webhook/onJobCompletion/webhookMethods.d.ts +7 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/triggers/webhook/onJobCompletion/webhookMethods.js +12 -0
- package/dist/nodes/ServiceTitanHandwritten/v1/triggers/webhook/onJobCompletion/webhookMethods.js.map +1 -0
- package/dist/package.json +7 -2
- package/package.json +7 -2
- package/dist/nodes/ServiceTitan/descriptions/base.d.ts +0 -3
- package/dist/nodes/ServiceTitan/descriptions/base.js +0 -50
- package/dist/nodes/ServiceTitan/descriptions/base.js.map +0 -1
- package/dist/nodes/ServiceTitan/types/common.d.ts +0 -27
- package/dist/nodes/ServiceTitan/types/common.js +0 -9
- package/dist/nodes/ServiceTitan/types/common.js.map +0 -1
- package/dist/nodes/ServiceTitan/types/customer.d.ts +0 -15
- package/dist/nodes/ServiceTitan/types/customer.js +0 -3
- package/dist/nodes/ServiceTitan/types/customer.js.map +0 -1
- package/dist/nodes/ServiceTitan/types/index.d.ts +0 -3
- package/dist/nodes/ServiceTitan/types/index.js +0 -3
- package/dist/nodes/ServiceTitan/types/index.js.map +0 -1
- package/dist/nodes/ServiceTitan/types/job.d.ts +0 -21
- package/dist/nodes/ServiceTitan/types/job.js +0 -3
- package/dist/nodes/ServiceTitan/types/job.js.map +0 -1
- package/dist/nodes/ServiceTitan/v1/descriptions/node.description.d.ts +0 -2
- package/dist/nodes/ServiceTitan/v1/descriptions/node.description.js +0 -41
- package/dist/nodes/ServiceTitan/v1/descriptions/node.description.js.map +0 -1
- package/dist/nodes/ServiceTitan/v1/descriptions/trigger.description.d.ts +0 -2
- package/dist/nodes/ServiceTitan/v1/descriptions/trigger.description.js +0 -35
- package/dist/nodes/ServiceTitan/v1/descriptions/trigger.description.js.map +0 -1
- package/dist/nodes/ServiceTitan/v1/manifest.d.ts +0 -2
- package/dist/nodes/ServiceTitan/v1/manifest.js.map +0 -1
- package/dist/nodes/ServiceTitan/v1/transport/config.d.ts +0 -2
- package/dist/nodes/ServiceTitan/v1/transport/config.js +0 -20
- package/dist/nodes/ServiceTitan/v1/transport/config.js.map +0 -1
- package/dist/nodes/ServiceTitan/v1/transport/index.d.ts +0 -1
- package/dist/nodes/ServiceTitan/v1/transport/index.js +0 -9
- package/dist/nodes/ServiceTitan/v1/transport/index.js.map +0 -1
- package/dist/nodes/core/factories/read/export.d.ts +0 -6
- package/dist/nodes/core/factories/read/export.js +0 -26
- package/dist/nodes/core/factories/read/export.js.map +0 -1
- package/dist/nodes/core/factories/read/filters.d.ts +0 -2
- package/dist/nodes/core/factories/read/filters.js +0 -14
- package/dist/nodes/core/factories/read/filters.js.map +0 -1
- package/dist/nodes/core/factories/read/get.d.ts +0 -7
- package/dist/nodes/core/factories/read/get.js +0 -41
- package/dist/nodes/core/factories/read/get.js.map +0 -1
- package/dist/nodes/core/factories/read/getArray.d.ts +0 -7
- package/dist/nodes/core/factories/read/getArray.js +0 -30
- package/dist/nodes/core/factories/read/getArray.js.map +0 -1
- package/dist/nodes/core/factories/read/getMany.d.ts +0 -7
- package/dist/nodes/core/factories/read/getMany.js +0 -33
- package/dist/nodes/core/factories/read/getMany.js.map +0 -1
- package/dist/nodes/core/factories/read/properties.d.ts +0 -17
- package/dist/nodes/core/factories/read/properties.js +0 -123
- package/dist/nodes/core/factories/read/properties.js.map +0 -1
- package/dist/nodes/core/factories/read/read.d.ts +0 -18
- package/dist/nodes/core/factories/read/read.js +0 -21
- package/dist/nodes/core/factories/read/read.js.map +0 -1
- package/dist/nodes/core/factories/router.d.ts +0 -5
- package/dist/nodes/core/factories/router.js +0 -31
- package/dist/nodes/core/factories/router.js.map +0 -1
- package/dist/nodes/core/factories/write/action.d.ts +0 -7
- package/dist/nodes/core/factories/write/action.js +0 -22
- package/dist/nodes/core/factories/write/action.js.map +0 -1
- package/dist/nodes/core/factories/write/delete.d.ts +0 -7
- package/dist/nodes/core/factories/write/delete.js +0 -33
- package/dist/nodes/core/factories/write/delete.js.map +0 -1
- package/dist/nodes/core/factories/write/poll.d.ts +0 -11
- package/dist/nodes/core/factories/write/poll.js +0 -206
- package/dist/nodes/core/factories/write/poll.js.map +0 -1
- package/dist/nodes/core/factories/write/utils.d.ts +0 -6
- package/dist/nodes/core/factories/write/utils.js +0 -65
- package/dist/nodes/core/factories/write/utils.js.map +0 -1
- package/dist/nodes/core/factories/write/write.d.ts +0 -7
- package/dist/nodes/core/factories/write/write.js +0 -217
- package/dist/nodes/core/factories/write/write.js.map +0 -1
- package/dist/nodes/core/helpers/array.d.ts +0 -1
- package/dist/nodes/core/helpers/array.js +0 -7
- package/dist/nodes/core/helpers/array.js.map +0 -1
- package/dist/nodes/core/helpers/customFields.d.ts +0 -13
- package/dist/nodes/core/helpers/customFields.js +0 -36
- package/dist/nodes/core/helpers/customFields.js.map +0 -1
- package/dist/nodes/core/helpers/reduce.d.ts +0 -5
- package/dist/nodes/core/helpers/reduce.js +0 -20
- package/dist/nodes/core/helpers/reduce.js.map +0 -1
- package/dist/nodes/core/helpers/string.d.ts +0 -2
- package/dist/nodes/core/helpers/string.js +0 -21
- package/dist/nodes/core/helpers/string.js.map +0 -1
- package/dist/nodes/core/manifest/getDescription.d.ts +0 -5
- package/dist/nodes/core/manifest/getDescription.js +0 -92
- package/dist/nodes/core/manifest/getDescription.js.map +0 -1
- package/dist/nodes/core/manifest/getExecute.d.ts +0 -6
- package/dist/nodes/core/manifest/getExecute.js +0 -89
- package/dist/nodes/core/manifest/getExecute.js.map +0 -1
- package/dist/nodes/core/manifest/getPoll.d.ts +0 -4
- package/dist/nodes/core/manifest/getPoll.js +0 -40
- package/dist/nodes/core/manifest/getPoll.js.map +0 -1
- package/dist/nodes/core/manifest/types.d.ts +0 -23
- package/dist/nodes/core/manifest/types.js.map +0 -1
- package/dist/nodes/core/transport/constructRequest.d.ts +0 -2
- package/dist/nodes/core/transport/constructRequest.js +0 -21
- package/dist/nodes/core/transport/constructRequest.js.map +0 -1
- package/dist/nodes/core/transport/createTransport.d.ts +0 -21
- package/dist/nodes/core/transport/createTransport.js +0 -56
- package/dist/nodes/core/transport/createTransport.js.map +0 -1
- package/dist/nodes/core/types/separate.d.ts +0 -68
- package/dist/nodes/core/types/separate.js +0 -3
- package/dist/nodes/core/types/separate.js.map +0 -1
- package/dist/nodes/core/types/shared/dialect.d.ts +0 -16
- package/dist/nodes/core/types/shared/dialect.js +0 -3
- package/dist/nodes/core/types/shared/dialect.js.map +0 -1
- package/dist/nodes/core/types/shared/operation.d.ts +0 -76
- package/dist/nodes/core/types/shared/operation.js +0 -5
- package/dist/nodes/core/types/shared/operation.js.map +0 -1
- package/dist/nodes/core/types/shared/resource.d.ts +0 -19
- package/dist/nodes/core/types/shared/resource.js +0 -5
- package/dist/nodes/core/types/shared/resource.js.map +0 -1
- package/dist/nodes/core/types/shared/selection.d.ts +0 -9
- package/dist/nodes/core/types/shared/selection.js +0 -5
- package/dist/nodes/core/types/shared/selection.js.map +0 -1
- package/dist/nodes/core/types/shared/sourced.d.ts +0 -7
- package/dist/nodes/core/types/shared/sourced.js +0 -3
- package/dist/nodes/core/types/shared/sourced.js.map +0 -1
- package/dist/nodes/core/types/shared/trigger.d.ts +0 -21
- package/dist/nodes/core/types/shared/trigger.js +0 -5
- package/dist/nodes/core/types/shared/trigger.js.map +0 -1
- /package/dist/nodes/{core/manifest → ServiceTitanHandwritten/v1/parameters}/types.js +0 -0
package/README.md
CHANGED
|
@@ -67,13 +67,14 @@ Polling-based with `modifiedOnOrAfter` cursor and a boundary-id dedup set to avo
|
|
|
67
67
|
|
|
68
68
|
## Architecture
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
Manifest-driven. The shared engine lives in **[`@thegraphitelab/n8n-nodes-core`](../n8n-nodes-core/)** (a runtime dependency, pulled in automatically when n8n installs this package); this package supplies only ServiceTitan's specifics:
|
|
71
71
|
|
|
72
|
-
- `
|
|
73
|
-
- `
|
|
74
|
-
- `
|
|
72
|
+
- `nodes/ServiceTitan/v1/generated/manifests.ts` — the **generated** manifest: every resource/operation and trigger, each described declaratively by a `shape`. Build output from `n8n-codegen` — do not hand-edit.
|
|
73
|
+
- `nodes/ServiceTitan/v1/transport/config.ts` — the `TransportConfig` the engine reads: credential key, base URL, pagination/cursor rules, and `pathContext` (maps the credential's `tenantId` into the `{tenant}` path placeholder).
|
|
74
|
+
- `nodes/ServiceTitan/v1/*.node.ts` + `descriptions/` — the action and trigger node wrappers, which call the engine's `router` / `pollRouter` and `getActionProperties` / `getTriggerProperties`.
|
|
75
|
+
- `credentials/` — the ServiceTitan API credential.
|
|
75
76
|
|
|
76
|
-
|
|
77
|
+
The engine compiles the manifest into n8n operations, poll triggers, property descriptions, and the authenticated HTTP transport. Adding or refreshing coverage is a codegen regenerate + rebuild (see the [repo root README](../../README.md#how-the-nodes-are-generated)), not a hand-edit.
|
|
77
78
|
|
|
78
79
|
## Custom fields behavior
|
|
79
80
|
|
|
@@ -5,21 +5,78 @@ exports.getApiHost = getApiHost;
|
|
|
5
5
|
const customAppSecrets_1 = require("./customAppSecrets");
|
|
6
6
|
// Label of the TGL_CUSTOM_APP_SECRETS entry holding the TGL-owned ST-App-Key.
|
|
7
7
|
const SERVICETITAN_APP_KEY_LABEL = "TGL_SERVICETITAN_API_KEY";
|
|
8
|
-
/**
|
|
9
|
-
* ServiceTitan auth hosts by environment.
|
|
10
|
-
* Integration ("Sandbox") and Production are entirely separate ST environments —
|
|
11
|
-
* different app registrations, different tenant IDs, different credentials.
|
|
12
|
-
*/
|
|
13
|
-
function getAuthHost(environment) {
|
|
14
|
-
return environment === "production"
|
|
15
|
-
? "auth.servicetitan.io"
|
|
16
|
-
: "auth-integration.servicetitan.io";
|
|
17
|
-
}
|
|
18
8
|
function getApiHost(environment) {
|
|
19
9
|
return environment === "production"
|
|
20
10
|
? "api.servicetitan.io"
|
|
21
11
|
: "api-integration.servicetitan.io";
|
|
22
12
|
}
|
|
13
|
+
function getCredentialInputs(credentials) {
|
|
14
|
+
function getCredentialFields(credentials) {
|
|
15
|
+
const clientId = credentials.clientId;
|
|
16
|
+
const clientSecret = credentials.clientSecret;
|
|
17
|
+
const tenantId = credentials.tenantId;
|
|
18
|
+
const missing = [];
|
|
19
|
+
if (!clientId)
|
|
20
|
+
missing.push("Client ID");
|
|
21
|
+
if (!clientSecret)
|
|
22
|
+
missing.push("Client Secret");
|
|
23
|
+
if (!tenantId)
|
|
24
|
+
missing.push("Tenant ID");
|
|
25
|
+
if (missing.length > 0) {
|
|
26
|
+
throw new Error(`[ServiceTitan auth] Missing required credential field(s): ${missing.join(", ")}. Fill them in on the n8n credential and save.`);
|
|
27
|
+
}
|
|
28
|
+
return { clientId, clientSecret, tenantId };
|
|
29
|
+
}
|
|
30
|
+
// The ST-App-Key is TGL-owned and identical across all clients, so it lives
|
|
31
|
+
// at the n8n instance level in the shared TGL_CUSTOM_APP_SECRETS array
|
|
32
|
+
// (keyed by label), not on every credential. Throws if unset/missing.
|
|
33
|
+
const appKey = (0, customAppSecrets_1.getCustomAppSecret)(SERVICETITAN_APP_KEY_LABEL);
|
|
34
|
+
const { clientId, clientSecret } = getCredentialFields.call(this, credentials);
|
|
35
|
+
const environment = credentials.environment ?? "integration";
|
|
36
|
+
return { appKey, clientId, clientSecret, environment };
|
|
37
|
+
}
|
|
38
|
+
function getRequestOptions(credentials) {
|
|
39
|
+
function getAuthHost(environment) {
|
|
40
|
+
return environment === "production"
|
|
41
|
+
? "auth.servicetitan.io"
|
|
42
|
+
: "auth-integration.servicetitan.io";
|
|
43
|
+
}
|
|
44
|
+
function getBody(clientId, clientSecret) {
|
|
45
|
+
return new URLSearchParams({
|
|
46
|
+
grant_type: "client_credentials",
|
|
47
|
+
client_id: clientId,
|
|
48
|
+
client_secret: clientSecret,
|
|
49
|
+
}).toString();
|
|
50
|
+
}
|
|
51
|
+
const { environment, clientId, clientSecret } = getCredentialInputs.call(this, credentials);
|
|
52
|
+
const tokenUrl = `https://${getAuthHost(environment)}/connect/token`;
|
|
53
|
+
const body = getBody(clientId, clientSecret);
|
|
54
|
+
return {
|
|
55
|
+
method: "POST",
|
|
56
|
+
url: tokenUrl,
|
|
57
|
+
headers: {
|
|
58
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
59
|
+
},
|
|
60
|
+
body,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function deriveErrorMessage(credentials, err) {
|
|
64
|
+
const { environment, clientId } = getCredentialInputs.call(this, credentials);
|
|
65
|
+
const requestOptions = getRequestOptions.call(this, credentials);
|
|
66
|
+
// Diagnostics — env, host, clientId prefix (NOT secret), App Key prefix
|
|
67
|
+
const clientIdPreview = `${clientId.slice(0, 6)}…${clientId.slice(-4)}`;
|
|
68
|
+
// Surface ServiceTitan's actual error response so users can fix it
|
|
69
|
+
const e = err;
|
|
70
|
+
const status = e.response?.status;
|
|
71
|
+
const statusText = e.response?.statusText;
|
|
72
|
+
const data = e.response?.data;
|
|
73
|
+
const bodyStr = typeof data === "string" ? data : JSON.stringify(data);
|
|
74
|
+
const detail = bodyStr ? ` body=${bodyStr.slice(0, 500)}` : "";
|
|
75
|
+
const { url: tokenUrl } = requestOptions;
|
|
76
|
+
return (`[ServiceTitan auth] Token fetch failed: ${status ?? "?"} ${statusText ?? ""}${detail}. ` +
|
|
77
|
+
`URL=${tokenUrl} env=${environment} clientId=${clientIdPreview}. ` +
|
|
78
|
+
`Verify Client ID/Secret are correct for the ${environment} environment.`);
|
|
79
|
+
}
|
|
23
80
|
class ServiceTitanApi {
|
|
24
81
|
name = "serviceTitanApi";
|
|
25
82
|
displayName = "ServiceTitan API";
|
|
@@ -85,60 +142,21 @@ class ServiceTitanApi {
|
|
|
85
142
|
},
|
|
86
143
|
];
|
|
87
144
|
async preAuthentication(credentials) {
|
|
88
|
-
|
|
89
|
-
// at the n8n instance level in the shared TGL_CUSTOM_APP_SECRETS array
|
|
90
|
-
// (keyed by label), not on every credential. Throws if unset/missing.
|
|
91
|
-
const appKey = (0, customAppSecrets_1.getCustomAppSecret)(SERVICETITAN_APP_KEY_LABEL);
|
|
92
|
-
const environment = credentials.environment ?? "integration";
|
|
93
|
-
const clientId = credentials.clientId;
|
|
94
|
-
const clientSecret = credentials.clientSecret;
|
|
95
|
-
const tenantId = credentials.tenantId;
|
|
96
|
-
const missing = [];
|
|
97
|
-
if (!clientId)
|
|
98
|
-
missing.push("Client ID");
|
|
99
|
-
if (!clientSecret)
|
|
100
|
-
missing.push("Client Secret");
|
|
101
|
-
if (!tenantId)
|
|
102
|
-
missing.push("Tenant ID");
|
|
103
|
-
if (missing.length > 0) {
|
|
104
|
-
throw new Error(`[ServiceTitan auth] Missing required credential field(s): ${missing.join(", ")}. Fill them in on the n8n credential and save.`);
|
|
105
|
-
}
|
|
106
|
-
const authHost = getAuthHost(environment);
|
|
107
|
-
const tokenUrl = `https://${authHost}/connect/token`;
|
|
108
|
-
// Diagnostics — env, host, clientId prefix (NOT secret), App Key prefix
|
|
109
|
-
const clientIdPreview = `${clientId.slice(0, 6)}…${clientId.slice(-4)}`;
|
|
110
|
-
const body = new URLSearchParams({
|
|
111
|
-
grant_type: "client_credentials",
|
|
112
|
-
client_id: clientId,
|
|
113
|
-
client_secret: clientSecret,
|
|
114
|
-
}).toString();
|
|
145
|
+
const requestOptions = getRequestOptions.call(this, credentials);
|
|
115
146
|
let response;
|
|
116
147
|
try {
|
|
117
|
-
response =
|
|
118
|
-
method: "POST",
|
|
119
|
-
url: tokenUrl,
|
|
120
|
-
headers: {
|
|
121
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
122
|
-
},
|
|
123
|
-
body,
|
|
124
|
-
}));
|
|
148
|
+
response = await this.helpers.httpRequest(requestOptions);
|
|
125
149
|
}
|
|
126
150
|
catch (err) {
|
|
127
|
-
|
|
128
|
-
const e = err;
|
|
129
|
-
const status = e.response?.status;
|
|
130
|
-
const statusText = e.response?.statusText;
|
|
131
|
-
const data = e.response?.data;
|
|
132
|
-
const bodyStr = typeof data === "string" ? data : JSON.stringify(data);
|
|
133
|
-
const detail = bodyStr ? ` body=${bodyStr.slice(0, 500)}` : "";
|
|
134
|
-
throw new Error(`[ServiceTitan auth] Token fetch failed: ${status ?? "?"} ${statusText ?? ""}${detail}. ` +
|
|
135
|
-
`URL=${tokenUrl} env=${environment} clientId=${clientIdPreview}. ` +
|
|
136
|
-
`Verify Client ID/Secret are correct for the ${environment} environment.`);
|
|
151
|
+
throw new Error(deriveErrorMessage.call(this, credentials, err));
|
|
137
152
|
}
|
|
138
153
|
if (!response?.access_token) {
|
|
139
154
|
throw new Error(`[ServiceTitan auth] Token endpoint returned 2xx but no access_token. Response: ${JSON.stringify(response).slice(0, 500)}`);
|
|
140
155
|
}
|
|
141
|
-
return {
|
|
156
|
+
return {
|
|
157
|
+
accessToken: response.access_token,
|
|
158
|
+
appKey: getCredentialInputs.call(this, credentials).appKey,
|
|
159
|
+
};
|
|
142
160
|
}
|
|
143
161
|
authenticate = {
|
|
144
162
|
type: "generic",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceTitanApi.credentials.js","sourceRoot":"","sources":["../../credentials/ServiceTitanApi.credentials.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"ServiceTitanApi.credentials.js","sourceRoot":"","sources":["../../credentials/ServiceTitanApi.credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,14 +2,25 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ServiceTitan = void 0;
|
|
4
4
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
-
const base_1 = require("./descriptions/base");
|
|
6
5
|
const ServiceTitanV1_node_1 = require("./v1/ServiceTitanV1.node");
|
|
6
|
+
const baseDescription = {
|
|
7
|
+
displayName: "ServiceTitan (Generated)",
|
|
8
|
+
name: "serviceTitan",
|
|
9
|
+
group: ["transform"],
|
|
10
|
+
icon: {
|
|
11
|
+
light: "file:servicetitan.svg",
|
|
12
|
+
dark: "file:servicetitan.dark.svg",
|
|
13
|
+
},
|
|
14
|
+
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
|
15
|
+
description: "Interact with ServiceTitan API via TGL's generated integration. Use ServiceTitan (Handwritten) for special triggers.",
|
|
16
|
+
defaultVersion: 1,
|
|
17
|
+
};
|
|
7
18
|
class ServiceTitan extends n8n_workflow_1.VersionedNodeType {
|
|
8
19
|
constructor() {
|
|
9
20
|
const nodeVersions = {
|
|
10
|
-
1: new ServiceTitanV1_node_1.ServiceTitanV1(
|
|
21
|
+
1: new ServiceTitanV1_node_1.ServiceTitanV1(baseDescription),
|
|
11
22
|
};
|
|
12
|
-
super(nodeVersions,
|
|
23
|
+
super(nodeVersions, baseDescription);
|
|
13
24
|
}
|
|
14
25
|
}
|
|
15
26
|
exports.ServiceTitan = ServiceTitan;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceTitan.node.js","sourceRoot":"","sources":["../../../nodes/ServiceTitan/ServiceTitan.node.ts"],"names":[],"mappings":";;;AAAA,+
|
|
1
|
+
{"version":3,"file":"ServiceTitan.node.js","sourceRoot":"","sources":["../../../nodes/ServiceTitan/ServiceTitan.node.ts"],"names":[],"mappings":";;;AAAA,+CAIsB;AACtB,kEAA0D;AAE1D,MAAM,eAAe,GAA6B;IAC9C,WAAW,EAAE,0BAA0B;IACvC,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,CAAC,WAAW,CAAC;IACpB,IAAI,EAAE;QACF,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,4BAA4B;KACrC;IACD,QAAQ,EAAE,8DAA8D;IACxE,WAAW,EACP,sHAAsH;IAC1H,cAAc,EAAE,CAAC;CACpB,CAAC;AAEF,MAAa,YAAa,SAAQ,gCAAiB;IAC/C;QACI,MAAM,YAAY,GAAuC;YACrD,CAAC,EAAE,IAAI,oCAAc,CAAC,eAAe,CAAC;SACzC,CAAC;QAEF,KAAK,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzC,CAAC;CACJ;AARD,oCAQC"}
|
|
@@ -3,13 +3,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ServiceTitanTrigger = void 0;
|
|
4
4
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
5
|
const ServiceTitanTriggerV1_node_1 = require("./v1/ServiceTitanTriggerV1.node");
|
|
6
|
-
const
|
|
6
|
+
const triggerBaseDescription = {
|
|
7
|
+
displayName: "ServiceTitan Trigger",
|
|
8
|
+
name: "serviceTitanTrigger",
|
|
9
|
+
group: ["trigger"],
|
|
10
|
+
icon: {
|
|
11
|
+
light: "file:servicetitan.svg",
|
|
12
|
+
dark: "file:servicetitan.dark.svg",
|
|
13
|
+
},
|
|
14
|
+
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
|
15
|
+
description: "Starts a workflow on ServiceTitan events",
|
|
16
|
+
defaultVersion: 1,
|
|
17
|
+
};
|
|
7
18
|
class ServiceTitanTrigger extends n8n_workflow_1.VersionedNodeType {
|
|
8
19
|
constructor() {
|
|
9
20
|
const nodeVersions = {
|
|
10
|
-
1: new ServiceTitanTriggerV1_node_1.ServiceTitanTriggerV1(
|
|
21
|
+
1: new ServiceTitanTriggerV1_node_1.ServiceTitanTriggerV1(triggerBaseDescription),
|
|
11
22
|
};
|
|
12
|
-
super(nodeVersions,
|
|
23
|
+
super(nodeVersions, triggerBaseDescription);
|
|
13
24
|
}
|
|
14
25
|
}
|
|
15
26
|
exports.ServiceTitanTrigger = ServiceTitanTrigger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceTitanTrigger.node.js","sourceRoot":"","sources":["../../../nodes/ServiceTitan/ServiceTitanTrigger.node.ts"],"names":[],"mappings":";;;AAAA,+
|
|
1
|
+
{"version":3,"file":"ServiceTitanTrigger.node.js","sourceRoot":"","sources":["../../../nodes/ServiceTitan/ServiceTitanTrigger.node.ts"],"names":[],"mappings":";;;AAAA,+CAIsB;AACtB,gFAAwE;AAExE,MAAM,sBAAsB,GAA6B;IACrD,WAAW,EAAE,sBAAsB;IACnC,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,CAAC,SAAS,CAAC;IAClB,IAAI,EAAE;QACF,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,4BAA4B;KACrC;IACD,QAAQ,EAAE,8DAA8D;IACxE,WAAW,EAAE,0CAA0C;IACvD,cAAc,EAAE,CAAC;CACpB,CAAC;AAEF,MAAa,mBAAoB,SAAQ,gCAAiB;IACtD;QACI,MAAM,YAAY,GAAuC;YACrD,CAAC,EAAE,IAAI,kDAAqB,CAAC,sBAAsB,CAAC;SACvD,CAAC;QAEF,KAAK,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;IAChD,CAAC;CACJ;AARD,kDAQC"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ServiceTitanTriggerV1 = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/* eslint-disable @n8n/community-nodes/no-restricted-imports --
|
|
5
|
+
* This is the best solution to share core functionality across integrations
|
|
6
|
+
*/
|
|
7
|
+
const n8n_nodes_core_1 = require("@thegraphitelab/n8n-nodes-core");
|
|
8
|
+
const settings_1 = require("./settings");
|
|
6
9
|
const methods_1 = require("./methods/methods");
|
|
7
|
-
const transport_1 = require("./transport");
|
|
8
|
-
const manifest_1 = require("./manifest");
|
|
9
10
|
/* eslint-disable @n8n/community-nodes/icon-validation --
|
|
10
11
|
Icon lives on the versioned wrapper's description/baseDescription and is merged
|
|
11
12
|
in via the constructor; this static rule can't see spreads, so it false-positives. */
|
|
@@ -13,11 +14,14 @@ class ServiceTitanTriggerV1 {
|
|
|
13
14
|
description;
|
|
14
15
|
methods;
|
|
15
16
|
constructor(baseDescription) {
|
|
16
|
-
this.description = {
|
|
17
|
+
this.description = {
|
|
18
|
+
...baseDescription,
|
|
19
|
+
...settings_1.serviceTitanTriggerV1Description,
|
|
20
|
+
};
|
|
17
21
|
this.methods = methods_1.serviceTitanMethods;
|
|
18
22
|
}
|
|
19
23
|
async poll() {
|
|
20
|
-
return (0,
|
|
24
|
+
return (0, n8n_nodes_core_1.pollRouter)(this, settings_1.serviceTitanV1Manifest, settings_1.serviceTitanV1Transport);
|
|
21
25
|
}
|
|
22
26
|
}
|
|
23
27
|
exports.ServiceTitanTriggerV1 = ServiceTitanTriggerV1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceTitanTriggerV1.node.js","sourceRoot":"","sources":["../../../../nodes/ServiceTitan/v1/ServiceTitanTriggerV1.node.ts"],"names":[],"mappings":";;;AAOA,
|
|
1
|
+
{"version":3,"file":"ServiceTitanTriggerV1.node.js","sourceRoot":"","sources":["../../../../nodes/ServiceTitan/v1/ServiceTitanTriggerV1.node.ts"],"names":[],"mappings":";;;AAOA;;GAEG;AACH,mEAA4D;AAC5D,yCAIoB;AACpB,+CAAwD;AAExD;;0FAE0F;AAC1F,MAAa,qBAAqB;IAC9B,WAAW,CAAuB;IAElC,OAAO,CAAC;IAER,YAAY,eAAyC;QACjD,IAAI,CAAC,WAAW,GAAG;YACf,GAAG,eAAe;YAClB,GAAG,2CAAgC;SACtC,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,6BAAmB,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI;QACN,OAAO,IAAA,2BAAU,EACb,IAAI,EACJ,iCAAsB,EACtB,kCAAuB,CAC1B,CAAC;IACN,CAAC;CACJ;AApBD,sDAoBC"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ServiceTitanV1 = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
4
|
+
/* eslint-disable @n8n/community-nodes/no-restricted-imports --
|
|
5
|
+
* This is the best solution to share core functionality across integrations
|
|
6
|
+
*/
|
|
7
|
+
const n8n_nodes_core_1 = require("@thegraphitelab/n8n-nodes-core");
|
|
8
|
+
const settings_1 = require("./settings");
|
|
8
9
|
/* eslint-disable @n8n/community-nodes/icon-validation --
|
|
9
10
|
Icon lives on the versioned wrapper's description/baseDescription and is merged
|
|
10
11
|
in via the constructor; this static rule can't see spreads, so it false-positives. */
|
|
11
12
|
class ServiceTitanV1 {
|
|
12
13
|
description;
|
|
13
14
|
constructor(baseDescription) {
|
|
14
|
-
this.description = { ...baseDescription, ...
|
|
15
|
+
this.description = { ...baseDescription, ...settings_1.serviceTitanV1Description };
|
|
15
16
|
}
|
|
16
17
|
async execute() {
|
|
17
|
-
return await (0,
|
|
18
|
+
return await (0, n8n_nodes_core_1.router)(this, settings_1.serviceTitanV1Manifest, settings_1.serviceTitanV1Transport);
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
21
|
exports.ServiceTitanV1 = ServiceTitanV1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceTitanV1.node.js","sourceRoot":"","sources":["../../../../nodes/ServiceTitan/v1/ServiceTitanV1.node.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"ServiceTitanV1.node.js","sourceRoot":"","sources":["../../../../nodes/ServiceTitan/v1/ServiceTitanV1.node.ts"],"names":[],"mappings":";;;AAMA;;GAEG;AACH,mEAAwD;AAExD,yCAIoB;AACpB;;0FAE0F;AAC1F,MAAa,cAAc;IACvB,WAAW,CAAuB;IAClC,YAAY,eAAyC;QACjD,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,oCAAyB,EAAE,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,OAAO;QACT,OAAO,MAAM,IAAA,uBAAM,EACf,IAAI,EACJ,iCAAsB,EACtB,kCAAuB,CAC1B,CAAC;IACN,CAAC;CACJ;AAbD,wCAaC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.serviceTitanMethods = void 0;
|
|
4
|
-
const transport_1 = require("../transport");
|
|
4
|
+
const transport_1 = require("../settings/transport");
|
|
5
5
|
exports.serviceTitanMethods = {
|
|
6
6
|
loadOptions: {
|
|
7
7
|
async getBusinessUnits() {
|
|
8
8
|
const credentials = await this.getCredentials("serviceTitanApi");
|
|
9
9
|
const tenantId = credentials.tenantId;
|
|
10
|
-
const response = (await transport_1.
|
|
10
|
+
const response = (await transport_1.serviceTitanV1Transport.request(this, "GET", `/settings/v2/tenant/${tenantId}/business-units`, { pageSize: 200, active: true }));
|
|
11
11
|
const rows = Array.isArray(response.data) ? response.data : [];
|
|
12
12
|
return rows
|
|
13
13
|
.map((bu) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../../../../../nodes/ServiceTitan/v1/methods/methods.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../../../../../nodes/ServiceTitan/v1/methods/methods.ts"],"names":[],"mappings":";;;AAKA,qDAAgE;AAUnD,QAAA,mBAAmB,GAAG;IAC/B,WAAW,EAAE;QACT,KAAK,CAAC,gBAAgB;YAGlB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAkB,CAAC;YAEhD,MAAM,QAAQ,GAAG,CAAC,MAAM,mCAAuB,CAAC,OAAO,CACnD,IAAI,EACJ,KAAK,EACL,uBAAuB,QAAQ,iBAAiB,EAChD,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAClC,CAAgC,CAAC;YAElC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI;iBACN,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACV,IAAI,EAAG,EAAE,CAAC,IAAe,IAAI,iBAAiB,EAAE,CAAC,EAAE,EAAE;gBACrD,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;aACvB,CAAC,CAAC;iBACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;KACJ;CACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { INodeTypeBaseDescription, INodeTypeDescription } from "n8n-workflow";
|
|
2
|
+
export declare const serviceTitanDescription: INodeTypeBaseDescription;
|
|
3
|
+
export declare const serviceTitanV1Description: INodeTypeDescription;
|
|
4
|
+
export declare const serviceTitanTriggerDescription: INodeTypeBaseDescription;
|
|
5
|
+
export declare const serviceTitanTriggerV1Description: INodeTypeDescription;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serviceTitanTriggerV1Description = exports.serviceTitanTriggerDescription = exports.serviceTitanV1Description = exports.serviceTitanDescription = void 0;
|
|
4
|
+
/* eslint-disable n8n-nodes-base/node-filename-against-convention */
|
|
5
|
+
/* eslint-disable @n8n/community-nodes/no-restricted-imports --
|
|
6
|
+
* This is the best solution to share core functionality across integrations
|
|
7
|
+
*/
|
|
8
|
+
const n8n_nodes_core_1 = require("@thegraphitelab/n8n-nodes-core");
|
|
9
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
10
|
+
const transport_1 = require("./transport");
|
|
11
|
+
const manifest_1 = require("./manifest");
|
|
12
|
+
exports.serviceTitanDescription = {
|
|
13
|
+
displayName: "ServiceTitan",
|
|
14
|
+
name: "serviceTitan",
|
|
15
|
+
group: ["transform"],
|
|
16
|
+
icon: {
|
|
17
|
+
light: "file:servicetitan.svg",
|
|
18
|
+
dark: "file:servicetitan.dark.svg",
|
|
19
|
+
},
|
|
20
|
+
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
|
21
|
+
description: "Interact with ServiceTitan API",
|
|
22
|
+
defaultVersion: 1,
|
|
23
|
+
};
|
|
24
|
+
exports.serviceTitanV1Description = {
|
|
25
|
+
displayName: "ServiceTitan",
|
|
26
|
+
name: "serviceTitan",
|
|
27
|
+
icon: {
|
|
28
|
+
light: "file:servicetitan.svg",
|
|
29
|
+
dark: "file:servicetitan.dark.svg",
|
|
30
|
+
},
|
|
31
|
+
group: ["transform"],
|
|
32
|
+
version: 1,
|
|
33
|
+
subtitle: '={{$parameter["operation"] || $parameter["event"]}}: {{$parameter["resource"]}}',
|
|
34
|
+
description: "Interact with the ServiceTitan API",
|
|
35
|
+
defaults: {
|
|
36
|
+
name: "ServiceTitan",
|
|
37
|
+
},
|
|
38
|
+
usableAsTool: true,
|
|
39
|
+
inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
40
|
+
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
41
|
+
credentials: [
|
|
42
|
+
{
|
|
43
|
+
name: "serviceTitanApi",
|
|
44
|
+
required: true,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
requestDefaults: {
|
|
48
|
+
baseURL: '=https://{{$credentials.environment === "production" ? "api.servicetitan.io" : "api-integration.servicetitan.io"}}',
|
|
49
|
+
headers: {
|
|
50
|
+
"Content-Type": "application/json",
|
|
51
|
+
Accept: "application/json",
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
properties: (0, n8n_nodes_core_1.getActionProperties)(manifest_1.serviceTitanV1Manifest, transport_1.serviceTitanV1Transport, "customer"),
|
|
55
|
+
};
|
|
56
|
+
exports.serviceTitanTriggerDescription = {
|
|
57
|
+
displayName: "ServiceTitan Trigger",
|
|
58
|
+
name: "serviceTitanTrigger",
|
|
59
|
+
group: ["trigger"],
|
|
60
|
+
icon: {
|
|
61
|
+
light: "file:servicetitan.svg",
|
|
62
|
+
dark: "file:servicetitan.dark.svg",
|
|
63
|
+
},
|
|
64
|
+
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
|
65
|
+
description: "Starts a workflow on ServiceTitan events",
|
|
66
|
+
defaultVersion: 1,
|
|
67
|
+
};
|
|
68
|
+
exports.serviceTitanTriggerV1Description = {
|
|
69
|
+
displayName: "ServiceTitan Trigger",
|
|
70
|
+
name: "serviceTitanTrigger",
|
|
71
|
+
icon: {
|
|
72
|
+
light: "file:servicetitan.svg",
|
|
73
|
+
dark: "file:servicetitan.dark.svg",
|
|
74
|
+
},
|
|
75
|
+
group: ["trigger"],
|
|
76
|
+
version: 1,
|
|
77
|
+
description: "Interact with ServiceTitan or start workflows on ServiceTitan events",
|
|
78
|
+
subtitle: '={{$parameter["operation"] || $parameter["event"]}}: {{$parameter["resource"]}}',
|
|
79
|
+
defaults: {
|
|
80
|
+
name: "ServiceTitan Trigger",
|
|
81
|
+
},
|
|
82
|
+
polling: true,
|
|
83
|
+
usableAsTool: true,
|
|
84
|
+
inputs: [],
|
|
85
|
+
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
86
|
+
credentials: [
|
|
87
|
+
{
|
|
88
|
+
name: "serviceTitanApi",
|
|
89
|
+
required: true,
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
properties: (0, n8n_nodes_core_1.getTriggerProperties)(manifest_1.serviceTitanV1Manifest, transport_1.serviceTitanV1Transport, "customer"),
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=description.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"description.js","sourceRoot":"","sources":["../../../../../nodes/ServiceTitan/v1/settings/description.ts"],"names":[],"mappings":";;;AAAA,oEAAoE;AACpE;;GAEG;AACH,mEAGwC;AACxC,+CAIsB;AACtB,2CAAsD;AACtD,yCAAoD;AAEvC,QAAA,uBAAuB,GAA6B;IAC7D,WAAW,EAAE,cAAc;IAC3B,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,CAAC,WAAW,CAAC;IACpB,IAAI,EAAE;QACF,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,4BAA4B;KACrC;IACD,QAAQ,EAAE,8DAA8D;IACxE,WAAW,EAAE,gCAAgC;IAC7C,cAAc,EAAE,CAAC;CACpB,CAAC;AAEW,QAAA,yBAAyB,GAAyB;IAC3D,WAAW,EAAE,cAAc;IAC3B,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE;QACF,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,4BAA4B;KACrC;IACD,KAAK,EAAE,CAAC,WAAW,CAAC;IACpB,OAAO,EAAE,CAAC;IACV,QAAQ,EACJ,iFAAiF;IACrF,WAAW,EAAE,oCAAoC;IACjD,QAAQ,EAAE;QACN,IAAI,EAAE,cAAc;KACvB;IACD,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;IAClC,OAAO,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;IACnC,WAAW,EAAE;QACT;YACI,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,IAAI;SACjB;KACJ;IACD,eAAe,EAAE;QACb,OAAO,EACH,oHAAoH;QACxH,OAAO,EAAE;YACL,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;SAC7B;KACJ;IACD,UAAU,EAAE,IAAA,oCAAmB,EAC3B,iCAAsB,EACtB,mCAAuB,EACvB,UAAU,CACb;CACJ,CAAC;AAEW,QAAA,8BAA8B,GAA6B;IACpE,WAAW,EAAE,sBAAsB;IACnC,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,CAAC,SAAS,CAAC;IAClB,IAAI,EAAE;QACF,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,4BAA4B;KACrC;IACD,QAAQ,EAAE,8DAA8D;IACxE,WAAW,EAAE,0CAA0C;IACvD,cAAc,EAAE,CAAC;CACpB,CAAC;AAEW,QAAA,gCAAgC,GAAyB;IAClE,WAAW,EAAE,sBAAsB;IACnC,IAAI,EAAE,qBAAqB;IAC3B,IAAI,EAAE;QACF,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,4BAA4B;KACrC;IACD,KAAK,EAAE,CAAC,SAAS,CAAC;IAClB,OAAO,EAAE,CAAC;IACV,WAAW,EACP,sEAAsE;IAC1E,QAAQ,EACJ,iFAAiF;IACrF,QAAQ,EAAE;QACN,IAAI,EAAE,sBAAsB;KAC/B;IACD,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;IACnC,WAAW,EAAE;QACT;YACI,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,IAAI;SACjB;KACJ;IACD,UAAU,EAAE,IAAA,qCAAoB,EAC5B,iCAAsB,EACtB,mCAAuB,EACvB,UAAU,CACb;CACJ,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { serviceTitanV1TransportConfig, serviceTitanV1Transport, } from "./transport";
|
|
2
|
+
export { serviceTitanV1Manifest } from "./manifest";
|
|
3
|
+
export { serviceTitanDescription, serviceTitanV1Description, serviceTitanTriggerDescription, serviceTitanTriggerV1Description, } from "./description";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serviceTitanTriggerV1Description = exports.serviceTitanTriggerDescription = exports.serviceTitanV1Description = exports.serviceTitanDescription = exports.serviceTitanV1Manifest = exports.serviceTitanV1Transport = exports.serviceTitanV1TransportConfig = void 0;
|
|
4
|
+
var transport_1 = require("./transport");
|
|
5
|
+
Object.defineProperty(exports, "serviceTitanV1TransportConfig", { enumerable: true, get: function () { return transport_1.serviceTitanV1TransportConfig; } });
|
|
6
|
+
Object.defineProperty(exports, "serviceTitanV1Transport", { enumerable: true, get: function () { return transport_1.serviceTitanV1Transport; } });
|
|
7
|
+
var manifest_1 = require("./manifest");
|
|
8
|
+
Object.defineProperty(exports, "serviceTitanV1Manifest", { enumerable: true, get: function () { return manifest_1.serviceTitanV1Manifest; } });
|
|
9
|
+
var description_1 = require("./description");
|
|
10
|
+
Object.defineProperty(exports, "serviceTitanDescription", { enumerable: true, get: function () { return description_1.serviceTitanDescription; } });
|
|
11
|
+
Object.defineProperty(exports, "serviceTitanV1Description", { enumerable: true, get: function () { return description_1.serviceTitanV1Description; } });
|
|
12
|
+
Object.defineProperty(exports, "serviceTitanTriggerDescription", { enumerable: true, get: function () { return description_1.serviceTitanTriggerDescription; } });
|
|
13
|
+
Object.defineProperty(exports, "serviceTitanTriggerV1Description", { enumerable: true, get: function () { return description_1.serviceTitanTriggerV1Description; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../nodes/ServiceTitan/v1/settings/index.ts"],"names":[],"mappings":";;;AAAA,yCAGqB;AAFjB,0HAAA,6BAA6B,OAAA;AAC7B,oHAAA,uBAAuB,OAAA;AAE3B,uCAAoD;AAA3C,kHAAA,sBAAsB,OAAA;AAC/B,6CAKuB;AAJnB,sHAAA,uBAAuB,OAAA;AACvB,wHAAA,yBAAyB,OAAA;AACzB,6HAAA,8BAA8B,OAAA;AAC9B,+HAAA,gCAAgC,OAAA"}
|
|
@@ -4,6 +4,6 @@ exports.serviceTitanV1Manifest = void 0;
|
|
|
4
4
|
// The FROZEN v1 manifest contract. Every v1 node instance resolves through
|
|
5
5
|
// this. Do not regenerate over v1/generated/manifests.ts — a breaking change
|
|
6
6
|
// gets a new vN/generated/ directory and its own vN/manifest.ts.
|
|
7
|
-
const manifests_1 = require("
|
|
7
|
+
const manifests_1 = require("../generated/manifests");
|
|
8
8
|
exports.serviceTitanV1Manifest = manifests_1.manifests;
|
|
9
9
|
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../../../nodes/ServiceTitan/v1/settings/manifest.ts"],"names":[],"mappings":";;;AAAA,2EAA2E;AAC3E,6EAA6E;AAC7E,iEAAiE;AACjE,sDAAmD;AAMtC,QAAA,sBAAsB,GAAG,qBAAgC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serviceTitanV1Transport = exports.serviceTitanV1TransportConfig = void 0;
|
|
4
|
+
/* eslint-disable @n8n/community-nodes/no-restricted-imports --
|
|
5
|
+
* This is the best solution to share core functionality across integrations
|
|
6
|
+
*/
|
|
7
|
+
const n8n_nodes_core_1 = require("@thegraphitelab/n8n-nodes-core");
|
|
8
|
+
const ServiceTitanApi_credentials_1 = require("../../../../credentials/ServiceTitanApi.credentials");
|
|
9
|
+
// The ServiceTitan business logic the generic transport reads.
|
|
10
|
+
exports.serviceTitanV1TransportConfig = {
|
|
11
|
+
credentialKey: "serviceTitanApi",
|
|
12
|
+
// Fills the `{tenant}` placeholder in generated paths from the credential.
|
|
13
|
+
pathContext: (credentials) => ({
|
|
14
|
+
tenant: String(credentials.tenantId),
|
|
15
|
+
}),
|
|
16
|
+
baseUrl: (credentials) => `https://${(0, ServiceTitanApi_credentials_1.getApiHost)(credentials.environment ?? "integration")}`,
|
|
17
|
+
itemsOf: (response) => {
|
|
18
|
+
const data = response.data;
|
|
19
|
+
return Array.isArray(data) ? data : [];
|
|
20
|
+
},
|
|
21
|
+
hasMore: (response) => Boolean(response.hasMore),
|
|
22
|
+
pageParam: "page",
|
|
23
|
+
maxPages: 50,
|
|
24
|
+
cursorParam: "from",
|
|
25
|
+
nextCursor: (response) => response.continueFrom,
|
|
26
|
+
maxExportIterations: 1,
|
|
27
|
+
};
|
|
28
|
+
// The ServiceTitan transport: the generic engine bound to ST's config. Factories
|
|
29
|
+
// and node methods consume this injected Transport (no per-call `this` wrappers).
|
|
30
|
+
exports.serviceTitanV1Transport = (0, n8n_nodes_core_1.createTransport)(exports.serviceTitanV1TransportConfig);
|
|
31
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../../nodes/ServiceTitan/v1/settings/transport.ts"],"names":[],"mappings":";;;AACA;;GAEG;AACH,mEAAiE;AAGjE,qGAAiF;AAUjF,+DAA+D;AAClD,QAAA,6BAA6B,GAAoB;IAC1D,aAAa,EAAE,iBAAiB;IAChC,2EAA2E;IAC3E,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC;KACvC,CAAC;IACF,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CACrB,WAAW,IAAA,wCAAU,EAAE,WAAW,CAAC,WAAsB,IAAI,aAAa,CAAC,EAAE;IACjF,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;QAClB,MAAM,IAAI,GAAI,QAAwC,CAAC,IAAI,CAAC;QAC5D,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAE,QAAkC,CAAC,OAAO,CAAC;IAC3E,SAAS,EAAE,MAAM;IACjB,QAAQ,EAAE,EAAE;IACZ,WAAW,EAAE,MAAM;IACnB,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,CACpB,QAAsC,CAAC,YAAY;IACxD,mBAAmB,EAAE,CAAC;CACzB,CAAC;AAEF,iFAAiF;AACjF,kFAAkF;AACrE,QAAA,uBAAuB,GAAG,IAAA,gCAAe,EAClD,qCAA6B,CAChC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ServiceTitanHandwrittenTrigger = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
const ServiceTitanHandwrittenTriggerV1_node_1 = require("./v1/ServiceTitanHandwrittenTriggerV1.node");
|
|
6
|
+
const triggerBaseDescription = {
|
|
7
|
+
displayName: "ServiceTitan (Handwritten) Trigger",
|
|
8
|
+
name: "serviceTitanHandwrittenTrigger",
|
|
9
|
+
group: ["trigger"],
|
|
10
|
+
icon: {
|
|
11
|
+
light: "file:servicetitan.svg",
|
|
12
|
+
dark: "file:servicetitan.dark.svg",
|
|
13
|
+
},
|
|
14
|
+
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
|
15
|
+
description: "Starts a workflow on ServiceTitan events",
|
|
16
|
+
defaultVersion: 1,
|
|
17
|
+
};
|
|
18
|
+
class ServiceTitanHandwrittenTrigger extends n8n_workflow_1.VersionedNodeType {
|
|
19
|
+
constructor() {
|
|
20
|
+
const nodeVersions = {
|
|
21
|
+
1: new ServiceTitanHandwrittenTriggerV1_node_1.ServiceTitanHandwrittenTriggerV1(triggerBaseDescription),
|
|
22
|
+
};
|
|
23
|
+
super(nodeVersions, triggerBaseDescription);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.ServiceTitanHandwrittenTrigger = ServiceTitanHandwrittenTrigger;
|
|
27
|
+
//# sourceMappingURL=ServiceTitanHandwrittenTrigger.node.js.map
|