@thegraphitelab/n8n-nodes-servicetitan 0.8.0 → 0.9.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 CHANGED
@@ -79,12 +79,13 @@ Adding a new resource or trigger event is a localized change — see [`CONTRIBUT
79
79
 
80
80
  ServiceTitan returns custom fields as an array of `{typeId, name, value}` objects. That shape is awkward to consume in downstream n8n nodes — every workflow has to write a JS-code step to find a field by name.
81
81
 
82
- This package returns **both** shapes on every entity that has custom fields:
82
+ This package returns **three shapes** on every entity that has custom fields, so consumers pick what fits:
83
83
 
84
- - `customFields` — the raw array, untouched, so anything that depends on the ServiceTitan shape still works
85
- - `customFieldsByName` — sibling object, keys are field names, values are `{typeId, value}`
84
+ - `customFields` — raw array of `{typeId, name, value}`, untouched. Use this if your workflow already depends on the ST shape, or you need both name + typeId together.
85
+ - `custom_fields_by_name` — flat map: keys are field names, values are the raw values. Use `{{ $json.custom_fields_by_name["Lockbox Code"] }}` to read directly.
86
+ - `custom_fields_by_type_id` — flat map: keys are stringified typeIds, values are the raw values. Use this when you want to address a field by ID (more stable than name across tenant renames).
86
87
 
87
- Downstream workflows can use `{{ $json.customFieldsByName["Field Name"].value }}` directly without a code step. A workflow that already does the manual flattening keeps working because `customFields` is unchanged.
88
+ All three coexist on every entity. None is destructive of the others.
88
89
 
89
90
  ## Roadmap
90
91
 
@@ -19,12 +19,14 @@ export declare function serviceTitanApiRequest(this: IExecuteFunctions | IPollFu
19
19
  */
20
20
  export declare function serviceTitanApiRequestAllItems(this: IExecuteFunctions | IPollFunctions | ILoadOptionsFunctions, method: IHttpRequestMethods, path: string, qs?: IDataObject, body?: IDataObject | undefined): Promise<IDataObject[]>;
21
21
  /**
22
- * Returns the same item with a sibling `customFieldsByName` object added,
23
- * keyed by the customField's `name`, mapping to `{ typeId, value }`.
22
+ * Returns the same item with two sibling flat-map objects added:
23
+ * - `custom_fields_by_name` — keyed by the customField's `name`, value = value
24
+ * - `custom_fields_by_type_id` — keyed by the customField's `typeId` (stringified),
25
+ * value = value
24
26
  *
25
27
  * Idempotent and non-destructive:
26
- * - Original `customFields[]` array is left untouched
28
+ * - Original `customFields[]` array is left untouched, so all three shapes coexist
27
29
  * - Missing or non-array `customFields` returns the input unchanged
28
- * - Duplicate names: last write wins (ST doesn't normally emit duplicates)
30
+ * - Duplicate names or typeIds: last write wins (ST doesn't normally emit duplicates)
29
31
  */
30
32
  export declare function flattenCustomFields(item: IDataObject): IDataObject;
@@ -55,24 +55,35 @@ async function serviceTitanApiRequestAllItems(method, path, qs = {}, body = unde
55
55
  return collected;
56
56
  }
57
57
  /**
58
- * Returns the same item with a sibling `customFieldsByName` object added,
59
- * keyed by the customField's `name`, mapping to `{ typeId, value }`.
58
+ * Returns the same item with two sibling flat-map objects added:
59
+ * - `custom_fields_by_name` — keyed by the customField's `name`, value = value
60
+ * - `custom_fields_by_type_id` — keyed by the customField's `typeId` (stringified),
61
+ * value = value
60
62
  *
61
63
  * Idempotent and non-destructive:
62
- * - Original `customFields[]` array is left untouched
64
+ * - Original `customFields[]` array is left untouched, so all three shapes coexist
63
65
  * - Missing or non-array `customFields` returns the input unchanged
64
- * - Duplicate names: last write wins (ST doesn't normally emit duplicates)
66
+ * - Duplicate names or typeIds: last write wins (ST doesn't normally emit duplicates)
65
67
  */
66
68
  function flattenCustomFields(item) {
67
69
  const customFields = item.customFields;
68
70
  if (!Array.isArray(customFields))
69
71
  return item;
70
72
  const byName = {};
73
+ const byTypeId = {};
71
74
  for (const raw of customFields) {
72
- if (!raw || typeof raw.name !== 'string')
75
+ if (!raw)
73
76
  continue;
74
- byName[raw.name] = { typeId: raw.typeId, value: raw.value };
77
+ if (typeof raw.name === 'string')
78
+ byName[raw.name] = raw.value;
79
+ if (raw.typeId !== undefined && raw.typeId !== null) {
80
+ byTypeId[String(raw.typeId)] = raw.value;
81
+ }
75
82
  }
76
- return { ...item, customFieldsByName: byName };
83
+ return {
84
+ ...item,
85
+ custom_fields_by_name: byName,
86
+ custom_fields_by_type_id: byTypeId,
87
+ };
77
88
  }
78
89
  //# sourceMappingURL=GenericFunctions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GenericFunctions.js","sourceRoot":"","sources":["../../../nodes/ServiceTitan/GenericFunctions.ts"],"names":[],"mappings":";;AAiBA,wDA4BC;AAcD,wEAwBC;AAWD,kDAWC;AAhGD,+FAA2E;AAG3E;;;;GAIG;AACI,KAAK,UAAU,sBAAsB,CAE3C,MAA2B,EAC3B,IAAY,EACZ,KAAkB,EAAE,EACpB,OAAgC,SAAS;IAEzC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACjE,MAAM,WAAW,GAAI,WAAW,CAAC,WAAsB,IAAI,aAAa,CAAC;IACzE,MAAM,OAAO,GAAG,IAAA,wCAAU,EAAC,WAAW,CAAC,CAAC;IAExC,MAAM,OAAO,GAAwB;QACpC,MAAM;QACN,GAAG,EAAE,WAAW,OAAO,GAAG,IAAI,EAAE;QAChC,EAAE;QACF,OAAO,EAAE;YACR,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SAClC;QACD,IAAI,EAAE,IAAI;KACV,CAAC;IACF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAE5C,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAC5D,IAAI,EACJ,iBAAiB,EACjB,OAAO,CACP,CAAgB,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,8BAA8B,CAEnD,MAA2B,EAC3B,IAAY,EACZ,KAAkB,EAAE,EACpB,OAAgC,SAAS;IAEzC,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,QAAQ,GAAG,EAAE,CAAC;IAEpB,OAAO,IAAI,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,CAAC,MAAM,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAClE,CAAC;QAE7B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,MAAM;QAC7B,IAAI,IAAI,CAAC,CAAC;IACX,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,mBAAmB,CAAC,IAAiB;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,MAAM,MAAM,GAAuD,EAAE,CAAC;IACtE,KAAK,MAAM,GAAG,IAAI,YAA+B,EAAE,CAAC;QACnD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACnD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IAC7D,CAAC;IAED,OAAO,EAAE,GAAG,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"GenericFunctions.js","sourceRoot":"","sources":["../../../nodes/ServiceTitan/GenericFunctions.ts"],"names":[],"mappings":";;AAiBA,wDA4BC;AAcD,wEAwBC;AAaD,kDAoBC;AA3GD,+FAA2E;AAG3E;;;;GAIG;AACI,KAAK,UAAU,sBAAsB,CAE3C,MAA2B,EAC3B,IAAY,EACZ,KAAkB,EAAE,EACpB,OAAgC,SAAS;IAEzC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACjE,MAAM,WAAW,GAAI,WAAW,CAAC,WAAsB,IAAI,aAAa,CAAC;IACzE,MAAM,OAAO,GAAG,IAAA,wCAAU,EAAC,WAAW,CAAC,CAAC;IAExC,MAAM,OAAO,GAAwB;QACpC,MAAM;QACN,GAAG,EAAE,WAAW,OAAO,GAAG,IAAI,EAAE;QAChC,EAAE;QACF,OAAO,EAAE;YACR,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SAClC;QACD,IAAI,EAAE,IAAI;KACV,CAAC;IACF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAE5C,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAC5D,IAAI,EACJ,iBAAiB,EACjB,OAAO,CACP,CAAgB,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,8BAA8B,CAEnD,MAA2B,EAC3B,IAAY,EACZ,KAAkB,EAAE,EACpB,OAAgC,SAAS;IAEzC,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,QAAQ,GAAG,EAAE,CAAC;IAEpB,OAAO,IAAI,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,CAAC,MAAM,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAClE,CAAC;QAE7B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,MAAM;QAC7B,IAAI,IAAI,CAAC,CAAC;IACX,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,mBAAmB,CAAC,IAAiB;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAE7C,KAAK,MAAM,GAAG,IAAI,YAA+B,EAAE,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAC/D,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACrD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAC1C,CAAC;IACF,CAAC;IAED,OAAO;QACN,GAAG,IAAI;QACP,qBAAqB,EAAE,MAAM;QAC7B,wBAAwB,EAAE,QAAQ;KAClC,CAAC;AACH,CAAC"}
@@ -4,6 +4,45 @@ exports.ServiceTitanTrigger = void 0;
4
4
  const n8n_workflow_1 = require("n8n-workflow");
5
5
  const GenericFunctions_1 = require("./GenericFunctions");
6
6
  const JOB_STATUSES = ['Scheduled', 'InProgress', 'Hold', 'Completed', 'Canceled'];
7
+ const JOB_PAGE_SIZE = 100;
8
+ const MAX_PAGES_PER_POLL = 10; // 1,000 jobs catch-up per poll; uses ~17% of ST's 60req/s budget for one second
9
+ function emptyJobState(tenantId) {
10
+ return { tenantId, cursorCreatedOn: '', seenIdsAtCursor: [], needsSeeding: true };
11
+ }
12
+ function pickLatestIso(a, b) {
13
+ if (!a)
14
+ return b;
15
+ if (!b)
16
+ return a;
17
+ return a > b ? a : b; // ISO 8601 sorts lexicographically
18
+ }
19
+ /**
20
+ * Fetch a single sample job for "Fetch Test Event". Sorts descending by
21
+ * createdOn so the user sees the most recent job that matches their
22
+ * filters. Does NOT mutate staticData.
23
+ */
24
+ async function fetchManualSample(tenantId, baseQs, userFloorIso) {
25
+ const qs = {
26
+ ...baseQs,
27
+ pageSize: 1,
28
+ sort: '-createdOn',
29
+ };
30
+ if (userFloorIso)
31
+ qs.createdOnOrAfter = userFloorIso;
32
+ let response;
33
+ try {
34
+ response = (await GenericFunctions_1.serviceTitanApiRequest.call(this, 'GET', `/jpm/v2/tenant/${tenantId}/jobs`, qs));
35
+ }
36
+ catch (error) {
37
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), error);
38
+ }
39
+ const rows = Array.isArray(response.data) ? response.data : [];
40
+ if (rows.length === 0)
41
+ return null;
42
+ return [
43
+ this.helpers.returnJsonArray([(0, GenericFunctions_1.flattenCustomFields)(rows[0])]),
44
+ ];
45
+ }
7
46
  class ServiceTitanTrigger {
8
47
  description = {
9
48
  displayName: 'ServiceTitan Trigger',
@@ -49,7 +88,7 @@ class ServiceTitanTrigger {
49
88
  {
50
89
  name: 'New Job',
51
90
  value: 'newJob',
52
- description: 'Fires for each new job created in ServiceTitan (mirrors the Zapier query_jobs trigger: latest 100 per poll, dedup by job ID)',
91
+ description: 'Fires once per newly created ServiceTitan job, ordered by createdOn ascending',
53
92
  },
54
93
  ],
55
94
  },
@@ -74,7 +113,7 @@ class ServiceTitanTrigger {
74
113
  name: 'createdOnOrAfter',
75
114
  type: 'dateTime',
76
115
  default: '',
77
- description: 'Only jobs created on or after this date/time',
116
+ description: 'Floor under the trigger\'s internal cursor. The trigger never polls earlier than this date/time. Useful for a one-time backfill or to skip very old jobs.',
78
117
  },
79
118
  {
80
119
  displayName: 'Customer ID',
@@ -136,70 +175,99 @@ class ServiceTitanTrigger {
136
175
  const credentials = await this.getCredentials('serviceTitanApi');
137
176
  const tenantId = credentials.tenantId;
138
177
  const staticData = this.getWorkflowStaticData('node');
139
- // Tenant-swap detection: if the credential's tenant changed, wipe the
140
- // dedup cursor so we don't reuse another tenant's ID watermark.
141
- if (staticData.tenantId && staticData.tenantId !== tenantId) {
178
+ // 0.8.0 → 0.8.1 migration: drop legacy root-level fields. The old id
179
+ // watermark was unreliable; we'd rather re-seed than carry it forward.
180
+ if (staticData.tenantId !== undefined || staticData.highestSeenId !== undefined) {
181
+ delete staticData.tenantId;
142
182
  delete staticData.highestSeenId;
143
183
  }
144
- staticData.tenantId = tenantId;
184
+ // Tenant-swap detection: wipe the dedup block on credential change.
185
+ if (!staticData.jobs || staticData.jobs.tenantId !== tenantId) {
186
+ staticData.jobs = emptyJobState(tenantId);
187
+ }
188
+ const state = staticData.jobs;
189
+ // Filter UI → API params
145
190
  const filters = this.getNodeParameter('filters', 0, {});
146
- // Mirror the Zapier query_jobs param shape: pageSize=100, active filter, plus user filters.
147
- const qs = {
148
- pageSize: 100,
191
+ const userFloorIso = filters.createdOnOrAfter ?? '';
192
+ const baseQs = {
193
+ pageSize: JOB_PAGE_SIZE,
149
194
  active: filters.includeInactive ? 'Any' : 'True',
195
+ sort: '+createdOn',
150
196
  };
151
197
  if (filters.businessUnitId)
152
- qs.businessUnitId = filters.businessUnitId;
153
- if (filters.createdOnOrAfter)
154
- qs.createdOnOrAfter = filters.createdOnOrAfter;
198
+ baseQs.businessUnitId = filters.businessUnitId;
155
199
  if (filters.customerId)
156
- qs.customerId = filters.customerId;
200
+ baseQs.customerId = filters.customerId;
157
201
  if (filters.jobStatus)
158
- qs.jobStatus = filters.jobStatus;
202
+ baseQs.jobStatus = filters.jobStatus;
159
203
  if (filters.jobTypeId)
160
- qs.jobTypeId = filters.jobTypeId;
204
+ baseQs.jobTypeId = filters.jobTypeId;
161
205
  if (filters.modifiedBefore)
162
- qs.modifiedBefore = filters.modifiedBefore;
163
- let response;
206
+ baseQs.modifiedBefore = filters.modifiedBefore;
207
+ // Manual mode (Fetch Test Event): return one sample. NO state mutation.
208
+ if (this.getMode() === 'manual') {
209
+ return await fetchManualSample.call(this, tenantId, baseQs, userFloorIso);
210
+ }
211
+ // First activation: seed cursor at "now" and emit nothing. Avoids
212
+ // draining historical jobs into n8n on activation.
213
+ if (state.needsSeeding) {
214
+ state.cursorCreatedOn = pickLatestIso(new Date().toISOString(), userFloorIso);
215
+ state.seenIdsAtCursor = [];
216
+ state.needsSeeding = false;
217
+ return null;
218
+ }
219
+ // Real poll: paginate forward from the cursor.
220
+ const effectiveCursorIso = pickLatestIso(state.cursorCreatedOn, userFloorIso);
221
+ const collected = [];
222
+ let page = 1;
223
+ let hasMore = true;
164
224
  try {
165
- response = (await GenericFunctions_1.serviceTitanApiRequest.call(this, 'GET', `/jpm/v2/tenant/${tenantId}/jobs`, qs));
225
+ while (hasMore && page <= MAX_PAGES_PER_POLL) {
226
+ const qs = { ...baseQs, page };
227
+ if (effectiveCursorIso)
228
+ qs.createdOnOrAfter = effectiveCursorIso;
229
+ const response = (await GenericFunctions_1.serviceTitanApiRequest.call(this, 'GET', `/jpm/v2/tenant/${tenantId}/jobs`, qs));
230
+ const rows = Array.isArray(response.data) ? response.data : [];
231
+ collected.push(...rows);
232
+ hasMore = Boolean(response.hasMore) && rows.length > 0;
233
+ page += 1;
234
+ }
166
235
  }
167
236
  catch (error) {
168
237
  throw new n8n_workflow_1.NodeApiError(this.getNode(), error);
169
238
  }
170
- const rows = Array.isArray(response.data) ? response.data : [];
171
- const previousHighest = staticData.highestSeenId;
172
- const maxIdSeen = rows.reduce((m, j) => Math.max(m, Number(j.id) || 0), 0);
173
- // First activation: seed the cursor at the current highest job ID and emit
174
- // nothing. Avoids draining the latest 100 jobs into n8n on activation.
175
- if (previousHighest === undefined) {
176
- staticData.highestSeenId = maxIdSeen;
177
- return null;
178
- }
179
- // Dedup: only jobs with ID > the watermark. ST job IDs are monotonically
180
- // increasing, so id > watermark === "newer than what we last saw".
181
- const newJobs = rows
182
- .filter((j) => Number.isFinite(Number(j.id)) && Number(j.id) > previousHighest)
183
- .sort((a, b) => Number(a.id) - Number(b.id)); // ascending — older-new before newer-new
184
- // Manual mode ("Fetch Test Event"): return one sample without burning the
185
- // watermark. If there are no new jobs, fall back to the most recent one
186
- // so the user can wire downstream nodes against a real row.
187
- if (this.getMode() === 'manual') {
188
- const sample = newJobs[0] ?? (rows.length > 0
189
- ? [...rows].sort((a, b) => Number(b.id) - Number(a.id))[0]
190
- : undefined);
191
- if (!sample)
192
- return null;
193
- return [
194
- this.helpers.returnJsonArray([
195
- (0, GenericFunctions_1.flattenCustomFields)(sample),
196
- ]),
197
- ];
239
+ // Dedup against the boundary-id set.
240
+ const seen = new Set(state.seenIdsAtCursor);
241
+ const newJobs = [];
242
+ for (const job of collected) {
243
+ if (!job || job.createdOn === undefined || job.id === undefined)
244
+ continue;
245
+ const idStr = String(job.id);
246
+ // Inclusive-window guard: drop boundary jobs we've already emitted.
247
+ if (job.createdOn === state.cursorCreatedOn && seen.has(idStr))
248
+ continue;
249
+ // Defensive: drop anything strictly older than the cursor (clock skew).
250
+ if (state.cursorCreatedOn && job.createdOn < state.cursorCreatedOn)
251
+ continue;
252
+ newJobs.push(job);
198
253
  }
199
254
  if (newJobs.length === 0)
200
255
  return null;
201
- // Advance cursor to the highest ID emitted.
202
- staticData.highestSeenId = Math.max(previousHighest, ...newJobs.map((j) => Number(j.id)));
256
+ // Compute the new cursor and rebuild the boundary set.
257
+ const newestCreatedOn = newJobs.reduce((max, j) => ((j.createdOn ?? '') > max ? (j.createdOn ?? '') : max), state.cursorCreatedOn);
258
+ const refreshedSeen = [];
259
+ if (newestCreatedOn === state.cursorCreatedOn) {
260
+ // Cursor didn't advance — preserve the existing set
261
+ for (const id of state.seenIdsAtCursor)
262
+ refreshedSeen.push(id);
263
+ }
264
+ for (const j of newJobs) {
265
+ if (j.createdOn === newestCreatedOn)
266
+ refreshedSeen.push(String(j.id));
267
+ }
268
+ // State mutation — only after we've successfully built the emission.
269
+ state.cursorCreatedOn = newestCreatedOn;
270
+ state.seenIdsAtCursor = Array.from(new Set(refreshedSeen));
203
271
  const enriched = newJobs.map((j) => (0, GenericFunctions_1.flattenCustomFields)(j));
204
272
  return [this.helpers.returnJsonArray(enriched)];
205
273
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceTitanTrigger.node.js","sourceRoot":"","sources":["../../../nodes/ServiceTitan/ServiceTitanTrigger.node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ServiceTitanTrigger.node.js","sourceRoot":"","sources":["../../../nodes/ServiceTitan/ServiceTitanTrigger.node.ts"],"names":[],"mappings":"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"}
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thegraphitelab/n8n-nodes-servicetitan",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "n8n custom node for ServiceTitan — TGL internal use.",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thegraphitelab/n8n-nodes-servicetitan",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "n8n custom node for ServiceTitan — TGL internal use.",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",