@tenonhq/dovetail-core 0.0.120 → 0.0.121
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/dist/tests/dovetailUtilsMSTableOptions.test.js +460 -0
- package/package.json +3 -3
- package/release-manifest.json +310 -231
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests the SERVER half of the sync engine — servicenow/dovetail/sys_script_include/
|
|
4
|
+
* DovetailUtilsMS.js — for the two table options that make platform-config tables
|
|
5
|
+
* syncable per scope:
|
|
6
|
+
*
|
|
7
|
+
* - `scopeQuery`: sys_choice rows carry NO sys_scope (verified on tenonworkstudio:
|
|
8
|
+
* `sys_scopeISEMPTY` returns every x_cadso_automate_* choice), so the table is never
|
|
9
|
+
* a sys_metadata child of any app — getTableNames can't discover it and the
|
|
10
|
+
* sys_scope filter in buildTableMap would return zero rows. scopeQuery replaces that
|
|
11
|
+
* filter with an encoded query ("nameSTARTSWITH{scope}_") and lists the table.
|
|
12
|
+
* - `nameTemplate`: sys_choice.label / sys_dictionary.column_label collide across tables
|
|
13
|
+
* and fields, so the display-value folder name would be "Failed (1a2b3c4d)" ×N.
|
|
14
|
+
* "{name}.{element}.{value}" names the folder from the fields that ARE unique.
|
|
15
|
+
*
|
|
16
|
+
* Same sandbox approach as dovetailUtilsMSCollision.test.ts: the real script include is
|
|
17
|
+
* loaded with minimal ServiceNow stubs so the test fails if the deployed source regresses.
|
|
18
|
+
*/
|
|
19
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
20
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
const fs_1 = __importDefault(require("fs"));
|
|
24
|
+
const path_1 = __importDefault(require("path"));
|
|
25
|
+
const vm_1 = __importDefault(require("vm"));
|
|
26
|
+
const SOURCE = path_1.default.join(__dirname, "../../../../servicenow/dovetail/sys_script_include/DovetailUtilsMS.js");
|
|
27
|
+
/**
|
|
28
|
+
* GlideRecord stub over a fixture list. Records the queries it receives so a test can
|
|
29
|
+
* assert WHICH filter buildTableMap applied (sys_scope vs the rendered scopeQuery).
|
|
30
|
+
* `validFields` controls isValidField — sys_choice has no sys_class_name column.
|
|
31
|
+
*/
|
|
32
|
+
function makeGlideRecord(rows, captured, validFields) {
|
|
33
|
+
return function GlideRecordStub(_table) {
|
|
34
|
+
var i = -1;
|
|
35
|
+
this.get = function (sysIdOrField, value) {
|
|
36
|
+
if (value !== undefined) {
|
|
37
|
+
// sys_app lookup by scope name → one row with a sys_id
|
|
38
|
+
i = rows.findIndex(function (r) {
|
|
39
|
+
return r[sysIdOrField] === value;
|
|
40
|
+
});
|
|
41
|
+
return i !== -1;
|
|
42
|
+
}
|
|
43
|
+
i = rows.findIndex(function (r) {
|
|
44
|
+
return r.sys_id === sysIdOrField;
|
|
45
|
+
});
|
|
46
|
+
return i !== -1;
|
|
47
|
+
};
|
|
48
|
+
this.addQuery = function (field, value) {
|
|
49
|
+
captured.fieldQueries.push({ field: field, value: value });
|
|
50
|
+
return { addOrCondition: function () { } };
|
|
51
|
+
};
|
|
52
|
+
this.addEncodedQuery = function (q) {
|
|
53
|
+
captured.encodedQueries.push(q);
|
|
54
|
+
};
|
|
55
|
+
this.isValidField = function (field) {
|
|
56
|
+
return validFields === null ? true : validFields.indexOf(field) !== -1;
|
|
57
|
+
};
|
|
58
|
+
this.query = function () {
|
|
59
|
+
i = -1;
|
|
60
|
+
};
|
|
61
|
+
this.next = function () {
|
|
62
|
+
i += 1;
|
|
63
|
+
return i < rows.length;
|
|
64
|
+
};
|
|
65
|
+
this.getValue = function (field) {
|
|
66
|
+
var v = rows[i][field];
|
|
67
|
+
return v === undefined ? null : v;
|
|
68
|
+
};
|
|
69
|
+
this.getDisplayValue = function (field) {
|
|
70
|
+
return field ? rows[i][field] : rows[i].label || rows[i].name;
|
|
71
|
+
};
|
|
72
|
+
this.getElement = function (field) {
|
|
73
|
+
var v = rows[i][field];
|
|
74
|
+
return {
|
|
75
|
+
getDisplayValue: function () {
|
|
76
|
+
return v === undefined ? "" : v;
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
this.getElements = function () {
|
|
81
|
+
return null;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function loadUtils(opts) {
|
|
86
|
+
const rows = opts.rows || [];
|
|
87
|
+
const warnings = [];
|
|
88
|
+
const captured = { encodedQueries: [], fieldQueries: [] };
|
|
89
|
+
const metadataClasses = opts.metadataClasses || [];
|
|
90
|
+
const sandbox = {
|
|
91
|
+
Class: {
|
|
92
|
+
create: function () {
|
|
93
|
+
return function () {
|
|
94
|
+
if (this.initialize)
|
|
95
|
+
this.initialize.apply(this, arguments);
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
GlideRecord: makeGlideRecord(rows, captured, opts.validFields === undefined ? null : opts.validFields),
|
|
100
|
+
// getTableNames aggregates sys_metadata by sys_class_name — one "row" per class.
|
|
101
|
+
GlideAggregate: function GlideAggregateStub() {
|
|
102
|
+
var i = -1;
|
|
103
|
+
this.addQuery = function () { };
|
|
104
|
+
this.groupBy = function () { };
|
|
105
|
+
this.query = function () {
|
|
106
|
+
i = -1;
|
|
107
|
+
};
|
|
108
|
+
this.next = function () {
|
|
109
|
+
i += 1;
|
|
110
|
+
return i < metadataClasses.length;
|
|
111
|
+
};
|
|
112
|
+
this.getValue = function () {
|
|
113
|
+
return metadataClasses[i];
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
gs: {
|
|
117
|
+
warn: function (msg) {
|
|
118
|
+
warnings.push(msg);
|
|
119
|
+
},
|
|
120
|
+
getProperty: function () {
|
|
121
|
+
return "https://example.service-now.com/";
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
vm_1.default.createContext(sandbox);
|
|
126
|
+
vm_1.default.runInContext(fs_1.default.readFileSync(SOURCE, "utf8"), sandbox);
|
|
127
|
+
return {
|
|
128
|
+
utils: new sandbox.DovetailUtilsMS(),
|
|
129
|
+
warnings: warnings,
|
|
130
|
+
captured: captured,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const CHOICE_ROWS = [
|
|
134
|
+
{
|
|
135
|
+
sys_id: "a21fd5c0c3bf0750d4ddf1db05013100",
|
|
136
|
+
name: "x_cadso_automate_message_batch_recipient",
|
|
137
|
+
element: "last_status",
|
|
138
|
+
value: "delivered",
|
|
139
|
+
label: "Delivered",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
sys_id: "2e1f598c33ff07507b18bc534d5c7b46",
|
|
143
|
+
name: "x_cadso_automate_message_batch_recipient",
|
|
144
|
+
element: "last_status",
|
|
145
|
+
value: "failed",
|
|
146
|
+
label: "Failed",
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
sys_id: "b94a7244c3ec8750d4ddf1db0501315e",
|
|
150
|
+
name: "x_cadso_automate_message_batch_recipient",
|
|
151
|
+
element: "state",
|
|
152
|
+
value: "Failed",
|
|
153
|
+
label: "Failed",
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
sys_id: "11327be5c3384f90d4ddf1db050131a3",
|
|
157
|
+
name: "x_cadso_automate_message_batch",
|
|
158
|
+
element: "state",
|
|
159
|
+
value: "Failed",
|
|
160
|
+
label: "Failed",
|
|
161
|
+
},
|
|
162
|
+
];
|
|
163
|
+
function buildChoices(tableOptions, validFields = ["name", "element", "value", "label"]) {
|
|
164
|
+
const loaded = loadUtils({ rows: CHOICE_ROWS, validFields: validFields });
|
|
165
|
+
const result = loaded.utils.buildTableMap({
|
|
166
|
+
tableName: "sys_choice",
|
|
167
|
+
scopeId: "5e9f5f8b87420250369f33373cbb3559",
|
|
168
|
+
scopeName: "x_cadso_automate",
|
|
169
|
+
getContents: false,
|
|
170
|
+
includes: { sys_choice: { label: { type: "txt" } } },
|
|
171
|
+
excludes: {},
|
|
172
|
+
tableOptions: tableOptions,
|
|
173
|
+
});
|
|
174
|
+
return {
|
|
175
|
+
records: result.records,
|
|
176
|
+
warnings: loaded.warnings,
|
|
177
|
+
captured: loaded.captured,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
describe("DovetailUtilsMS.buildTableMap — scopeQuery", () => {
|
|
181
|
+
it("replaces the sys_scope filter with the rendered scopeQuery ({scope} → scope name)", () => {
|
|
182
|
+
const out = buildChoices({ scopeQuery: "nameSTARTSWITH{scope}_" });
|
|
183
|
+
expect(out.captured.encodedQueries).toContain("nameSTARTSWITHx_cadso_automate_");
|
|
184
|
+
const scopeFilters = out.captured.fieldQueries.filter((q) => q.field === "sys_scope");
|
|
185
|
+
expect(scopeFilters).toHaveLength(0);
|
|
186
|
+
});
|
|
187
|
+
it("renders {scopeId} as the scope sys_id", () => {
|
|
188
|
+
const out = buildChoices({ scopeQuery: "sys_package={scopeId}" });
|
|
189
|
+
expect(out.captured.encodedQueries).toContain("sys_package=5e9f5f8b87420250369f33373cbb3559");
|
|
190
|
+
});
|
|
191
|
+
it("keeps the sys_scope filter when no scopeQuery is set (existing behaviour)", () => {
|
|
192
|
+
const out = buildChoices({});
|
|
193
|
+
const scopeFilters = out.captured.fieldQueries.filter((q) => q.field === "sys_scope");
|
|
194
|
+
expect(scopeFilters).toEqual([
|
|
195
|
+
{ field: "sys_scope", value: "5e9f5f8b87420250369f33373cbb3559" },
|
|
196
|
+
]);
|
|
197
|
+
});
|
|
198
|
+
it("still ANDs the plain `query` option on top of scopeQuery", () => {
|
|
199
|
+
const out = buildChoices({
|
|
200
|
+
scopeQuery: "nameSTARTSWITH{scope}_",
|
|
201
|
+
query: "language=en",
|
|
202
|
+
});
|
|
203
|
+
expect(out.captured.encodedQueries).toEqual([
|
|
204
|
+
"nameSTARTSWITHx_cadso_automate_",
|
|
205
|
+
"language=en",
|
|
206
|
+
]);
|
|
207
|
+
});
|
|
208
|
+
it("skips the sys_class_name query on a table that has no such column (sys_choice)", () => {
|
|
209
|
+
const out = buildChoices({ scopeQuery: "nameSTARTSWITH{scope}_" }, [
|
|
210
|
+
"name",
|
|
211
|
+
"element",
|
|
212
|
+
"value",
|
|
213
|
+
"label",
|
|
214
|
+
]);
|
|
215
|
+
const classFilters = out.captured.fieldQueries.filter((q) => q.field === "sys_class_name");
|
|
216
|
+
expect(classFilters).toHaveLength(0);
|
|
217
|
+
});
|
|
218
|
+
it("keeps the sys_class_name query on a table that has the column", () => {
|
|
219
|
+
const out = buildChoices({}, null);
|
|
220
|
+
const classFilters = out.captured.fieldQueries.filter((q) => q.field === "sys_class_name");
|
|
221
|
+
expect(classFilters).toEqual([
|
|
222
|
+
{ field: "sys_class_name", value: "sys_choice" },
|
|
223
|
+
]);
|
|
224
|
+
});
|
|
225
|
+
it("treats an empty scopeQuery as unset", () => {
|
|
226
|
+
const out = buildChoices({ scopeQuery: "" });
|
|
227
|
+
const scopeFilters = out.captured.fieldQueries.filter((q) => q.field === "sys_scope");
|
|
228
|
+
expect(scopeFilters).toHaveLength(1);
|
|
229
|
+
expect(out.captured.encodedQueries).toHaveLength(0);
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
describe("DovetailUtilsMS.generateRecordName — nameTemplate", () => {
|
|
233
|
+
it("names sys_choice folders {name}.{element}.{value} so same-label rows never collide", () => {
|
|
234
|
+
const out = buildChoices({ nameTemplate: "{name}.{element}.{value}" });
|
|
235
|
+
expect(Object.keys(out.records).sort()).toEqual([
|
|
236
|
+
"x_cadso_automate_message_batch.state.Failed",
|
|
237
|
+
"x_cadso_automate_message_batch_recipient.last_status.delivered",
|
|
238
|
+
"x_cadso_automate_message_batch_recipient.last_status.failed",
|
|
239
|
+
"x_cadso_automate_message_batch_recipient.state.Failed",
|
|
240
|
+
]);
|
|
241
|
+
expect(out.warnings).toHaveLength(0);
|
|
242
|
+
});
|
|
243
|
+
it("without a template, three 'Failed' labels collapse into the sys_id-suffixed collision set", () => {
|
|
244
|
+
const out = buildChoices({});
|
|
245
|
+
const keys = Object.keys(out.records).sort();
|
|
246
|
+
expect(keys).toEqual([
|
|
247
|
+
"Delivered",
|
|
248
|
+
"Failed (11327be5)",
|
|
249
|
+
"Failed (2e1f598c)",
|
|
250
|
+
"Failed (b94a7244)",
|
|
251
|
+
]);
|
|
252
|
+
});
|
|
253
|
+
it("keeps record.name identical to the map key", () => {
|
|
254
|
+
const out = buildChoices({ nameTemplate: "{name}.{element}.{value}" });
|
|
255
|
+
Object.keys(out.records).forEach((key) => {
|
|
256
|
+
expect(out.records[key].name).toBe(key);
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
it("drops an empty token together with the literal before it (sys_dictionary collection row)", () => {
|
|
260
|
+
const loaded = loadUtils({
|
|
261
|
+
rows: [
|
|
262
|
+
{
|
|
263
|
+
sys_id: "c85856cec3a44b10d4ddf1db05013158",
|
|
264
|
+
name: "x_cadso_automate_message_batch_recipient",
|
|
265
|
+
element: "last_status",
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
sys_id: "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a",
|
|
269
|
+
name: "x_cadso_automate_message_batch_recipient",
|
|
270
|
+
element: "",
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
sys_id: "1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b",
|
|
274
|
+
name: "x_cadso_automate_message_batch",
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
});
|
|
278
|
+
const result = loaded.utils.buildTableMap({
|
|
279
|
+
tableName: "sys_dictionary",
|
|
280
|
+
scopeId: "scope1",
|
|
281
|
+
scopeName: "x_cadso_automate",
|
|
282
|
+
getContents: false,
|
|
283
|
+
includes: { sys_dictionary: { column_label: { type: "txt" } } },
|
|
284
|
+
excludes: {},
|
|
285
|
+
tableOptions: { nameTemplate: "{name}.{element}" },
|
|
286
|
+
});
|
|
287
|
+
expect(Object.keys(result.records).sort()).toEqual([
|
|
288
|
+
"x_cadso_automate_message_batch",
|
|
289
|
+
"x_cadso_automate_message_batch_recipient",
|
|
290
|
+
"x_cadso_automate_message_batch_recipient.last_status",
|
|
291
|
+
]);
|
|
292
|
+
});
|
|
293
|
+
it("drops a leading empty token and its following literal", () => {
|
|
294
|
+
const loaded = loadUtils({
|
|
295
|
+
rows: [{ sys_id: "aaaaaaaa11111111", element: "state", value: "x" }],
|
|
296
|
+
});
|
|
297
|
+
const result = loaded.utils.buildTableMap({
|
|
298
|
+
tableName: "t",
|
|
299
|
+
scopeId: "s",
|
|
300
|
+
scopeName: "x",
|
|
301
|
+
getContents: false,
|
|
302
|
+
includes: { t: { value: { type: "txt" } } },
|
|
303
|
+
excludes: {},
|
|
304
|
+
tableOptions: { nameTemplate: "{name}.{element}.{value}" },
|
|
305
|
+
});
|
|
306
|
+
expect(Object.keys(result.records)).toEqual(["state.x"]);
|
|
307
|
+
});
|
|
308
|
+
it("falls back to sys_id when every token is empty", () => {
|
|
309
|
+
const loaded = loadUtils({ rows: [{ sys_id: "aaaaaaaa11111111" }] });
|
|
310
|
+
const result = loaded.utils.buildTableMap({
|
|
311
|
+
tableName: "t",
|
|
312
|
+
scopeId: "s",
|
|
313
|
+
scopeName: "x",
|
|
314
|
+
getContents: false,
|
|
315
|
+
includes: { t: { value: { type: "txt" } } },
|
|
316
|
+
excludes: {},
|
|
317
|
+
tableOptions: { nameTemplate: "{name}.{element}" },
|
|
318
|
+
});
|
|
319
|
+
expect(Object.keys(result.records)).toEqual(["aaaaaaaa11111111"]);
|
|
320
|
+
});
|
|
321
|
+
it("sanitizes path separators in template values", () => {
|
|
322
|
+
const loaded = loadUtils({
|
|
323
|
+
rows: [{ sys_id: "aaaaaaaa11111111", name: "t", value: "a/b\\c" }],
|
|
324
|
+
});
|
|
325
|
+
const result = loaded.utils.buildTableMap({
|
|
326
|
+
tableName: "t",
|
|
327
|
+
scopeId: "s",
|
|
328
|
+
scopeName: "x",
|
|
329
|
+
getContents: false,
|
|
330
|
+
includes: { t: { value: { type: "txt" } } },
|
|
331
|
+
excludes: {},
|
|
332
|
+
tableOptions: { nameTemplate: "{name}.{value}" },
|
|
333
|
+
});
|
|
334
|
+
expect(Object.keys(result.records)).toEqual(["t.a〳b〳c"]);
|
|
335
|
+
});
|
|
336
|
+
it("wins over displayField / differentiatorField when both are set", () => {
|
|
337
|
+
const out = buildChoices({
|
|
338
|
+
nameTemplate: "{element}.{value}",
|
|
339
|
+
displayField: "label",
|
|
340
|
+
differentiatorField: "sys_id",
|
|
341
|
+
});
|
|
342
|
+
expect(Object.keys(out.records).sort()).toEqual([
|
|
343
|
+
"last_status.delivered",
|
|
344
|
+
"last_status.failed",
|
|
345
|
+
"state.Failed (11327be5)",
|
|
346
|
+
"state.Failed (b94a7244)",
|
|
347
|
+
]);
|
|
348
|
+
// Two tables share element+value here — the collision guard still catches it.
|
|
349
|
+
expect(out.warnings).toHaveLength(2);
|
|
350
|
+
});
|
|
351
|
+
it("applies the template in processMissingFiles (bulkDownload) too", () => {
|
|
352
|
+
const loaded = loadUtils({ rows: CHOICE_ROWS });
|
|
353
|
+
const recordMap = {};
|
|
354
|
+
CHOICE_ROWS.forEach((r) => {
|
|
355
|
+
recordMap[r.sys_id] = [{ name: "label", type: "txt" }];
|
|
356
|
+
});
|
|
357
|
+
const result = loaded.utils.processMissingFiles({ sys_choice: recordMap }, { sys_choice: { nameTemplate: "{name}.{element}.{value}" } });
|
|
358
|
+
expect(Object.keys(result.sys_choice.records).sort()).toEqual([
|
|
359
|
+
"x_cadso_automate_message_batch.state.Failed",
|
|
360
|
+
"x_cadso_automate_message_batch_recipient.last_status.delivered",
|
|
361
|
+
"x_cadso_automate_message_batch_recipient.last_status.failed",
|
|
362
|
+
"x_cadso_automate_message_batch_recipient.state.Failed",
|
|
363
|
+
]);
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
describe("DovetailUtilsMS.getTableNames — scopeQuery tables are listed explicitly", () => {
|
|
367
|
+
it("adds a scopeQuery table that sys_metadata cannot surface", () => {
|
|
368
|
+
const loaded = loadUtils({
|
|
369
|
+
metadataClasses: ["sys_script_include", "sys_dictionary"],
|
|
370
|
+
});
|
|
371
|
+
const tables = loaded.utils.getTableNames({
|
|
372
|
+
scopeId: "scope1",
|
|
373
|
+
includes: { sys_choice: { label: { type: "txt" } } },
|
|
374
|
+
excludes: {},
|
|
375
|
+
tableOptions: { sys_choice: { scopeQuery: "nameSTARTSWITH{scope}_" } },
|
|
376
|
+
});
|
|
377
|
+
expect(tables).toEqual([
|
|
378
|
+
"sys_script_include",
|
|
379
|
+
"sys_dictionary",
|
|
380
|
+
"sys_choice",
|
|
381
|
+
]);
|
|
382
|
+
});
|
|
383
|
+
it("does not duplicate a table sys_metadata already surfaced", () => {
|
|
384
|
+
const loaded = loadUtils({ metadataClasses: ["sys_dictionary"] });
|
|
385
|
+
const tables = loaded.utils.getTableNames({
|
|
386
|
+
scopeId: "scope1",
|
|
387
|
+
includes: {},
|
|
388
|
+
excludes: {},
|
|
389
|
+
tableOptions: { sys_dictionary: { scopeQuery: "nameSTARTSWITHx_" } },
|
|
390
|
+
});
|
|
391
|
+
expect(tables).toEqual(["sys_dictionary"]);
|
|
392
|
+
});
|
|
393
|
+
it("respects excludes for scopeQuery tables", () => {
|
|
394
|
+
const loaded = loadUtils({ metadataClasses: [] });
|
|
395
|
+
const tables = loaded.utils.getTableNames({
|
|
396
|
+
scopeId: "scope1",
|
|
397
|
+
includes: {},
|
|
398
|
+
excludes: { sys_choice: true },
|
|
399
|
+
tableOptions: { sys_choice: { scopeQuery: "nameSTARTSWITH{scope}_" } },
|
|
400
|
+
});
|
|
401
|
+
expect(tables).toEqual([]);
|
|
402
|
+
});
|
|
403
|
+
it("ignores tableOptions without a scopeQuery (query / nameTemplate alone do not list a table)", () => {
|
|
404
|
+
const loaded = loadUtils({ metadataClasses: [] });
|
|
405
|
+
const tables = loaded.utils.getTableNames({
|
|
406
|
+
scopeId: "scope1",
|
|
407
|
+
includes: {},
|
|
408
|
+
excludes: {},
|
|
409
|
+
tableOptions: {
|
|
410
|
+
sys_choice: { nameTemplate: "{name}" },
|
|
411
|
+
sys_dictionary: { query: "a=b" },
|
|
412
|
+
},
|
|
413
|
+
});
|
|
414
|
+
expect(tables).toEqual([]);
|
|
415
|
+
});
|
|
416
|
+
it("tolerates a missing tableOptions argument (existing callers)", () => {
|
|
417
|
+
const loaded = loadUtils({ metadataClasses: ["sys_script"] });
|
|
418
|
+
const tables = loaded.utils.getTableNames({
|
|
419
|
+
scopeId: "scope1",
|
|
420
|
+
includes: {},
|
|
421
|
+
excludes: {},
|
|
422
|
+
});
|
|
423
|
+
expect(tables).toEqual(["sys_script"]);
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
describe("DovetailUtilsMS.getManifest — wiring", () => {
|
|
427
|
+
it("passes scopeName into buildTableMap so scopeQuery renders, and lists the scope-less table", () => {
|
|
428
|
+
const loaded = loadUtils({
|
|
429
|
+
// sys_app lookup row (getScopeId does appGR.get("scope", name)) + the choice rows
|
|
430
|
+
rows: [
|
|
431
|
+
{
|
|
432
|
+
sys_id: "5e9f5f8b87420250369f33373cbb3559",
|
|
433
|
+
scope: "x_cadso_automate",
|
|
434
|
+
},
|
|
435
|
+
].concat(CHOICE_ROWS),
|
|
436
|
+
metadataClasses: [],
|
|
437
|
+
validFields: ["name", "element", "value", "label", "scope"],
|
|
438
|
+
});
|
|
439
|
+
const manifest = loaded.utils.getManifest({
|
|
440
|
+
scopeName: "x_cadso_automate",
|
|
441
|
+
includes: { sys_choice: { label: { type: "txt" } } },
|
|
442
|
+
excludes: {},
|
|
443
|
+
tableOptions: {
|
|
444
|
+
sys_choice: {
|
|
445
|
+
scopeQuery: "nameSTARTSWITH{scope}_",
|
|
446
|
+
nameTemplate: "{name}.{element}.{value}",
|
|
447
|
+
},
|
|
448
|
+
},
|
|
449
|
+
getContents: false,
|
|
450
|
+
});
|
|
451
|
+
expect(loaded.captured.encodedQueries).toContain("nameSTARTSWITHx_cadso_automate_");
|
|
452
|
+
expect(Object.keys(manifest.tables)).toEqual(["sys_choice"]);
|
|
453
|
+
// The stub GlideRecord iterates every fixture row regardless of query, so the
|
|
454
|
+
// sys_app row shows up too (named by sys_id: no name/element/value). What matters
|
|
455
|
+
// here is that the four choice rows are present under their templated names.
|
|
456
|
+
const keys = Object.keys(manifest.tables.sys_choice.records);
|
|
457
|
+
expect(keys).toContain("x_cadso_automate_message_batch_recipient.last_status.delivered");
|
|
458
|
+
expect(keys).toContain("x_cadso_automate_message_batch.state.Failed");
|
|
459
|
+
});
|
|
460
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tenonhq/dovetail-core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.121",
|
|
4
4
|
"description": "Next-gen file syncer",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"node": ">=22"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@tenonhq/dovetail-types": "~0.0.
|
|
25
|
+
"@tenonhq/dovetail-types": "~0.0.22",
|
|
26
26
|
"@types/dotenv": "^6.1.1",
|
|
27
27
|
"@types/inquirer": "^8.2.10",
|
|
28
28
|
"@types/jest": "^29.5.5",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@tenonhq/dovetail-clickup": "~0.0.14",
|
|
42
|
-
"@tenonhq/dovetail-schema": "~0.0.
|
|
42
|
+
"@tenonhq/dovetail-schema": "~0.0.15",
|
|
43
43
|
"axios": "^1.20.0",
|
|
44
44
|
"axios-cookiejar-support": "^4.0.7",
|
|
45
45
|
"axios-rate-limit": "^1.3.0",
|
package/release-manifest.json
CHANGED
|
@@ -1,7 +1,316 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "dovetail-manifest/v1",
|
|
3
|
-
"generated_at": "2026-10-
|
|
3
|
+
"generated_at": "2026-10-02T17:40:24.896Z",
|
|
4
4
|
"events": [
|
|
5
|
+
{
|
|
6
|
+
"$schema": "dovetail-release-event/v1",
|
|
7
|
+
"event_id": "dovetail-gmail@0.0.13",
|
|
8
|
+
"package": "@tenonhq/dovetail-gmail",
|
|
9
|
+
"version": "0.0.13",
|
|
10
|
+
"prev_version": "0.0.12",
|
|
11
|
+
"published_at": "2026-10-02T17:40:24.884Z",
|
|
12
|
+
"git": {
|
|
13
|
+
"sha": "f4aaad6bcda58eb3fb5a9373b8a7cc69e00070b2",
|
|
14
|
+
"tag": "dovetail-gmail@0.0.13"
|
|
15
|
+
},
|
|
16
|
+
"semver_bump": "patch",
|
|
17
|
+
"commits": [
|
|
18
|
+
{
|
|
19
|
+
"sha": "f4aaad6bc",
|
|
20
|
+
"subject": "chore(deps): bump sanitize-html to 2.17.7 + raise gmail/mcp Node floor to 22.12 (#289)",
|
|
21
|
+
"pr": 289
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"sha": "b46e30a86",
|
|
25
|
+
"subject": "chore(release): publish 7 packages [skip ci]"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"sha": "8ca5124c1",
|
|
29
|
+
"subject": "chore(deps): bump sanitize-html from 2.17.4 to 2.17.7 (#268)",
|
|
30
|
+
"pr": 268
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"sha": "4bc78bc61",
|
|
34
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"sha": "c82439b30",
|
|
38
|
+
"subject": "chore(deps): bump js-yaml, jest and ts-jest (#183)",
|
|
39
|
+
"pr": 183
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"sha": "092e176fc",
|
|
43
|
+
"subject": "chore(release): publish 3 packages [skip ci]"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"sha": "82924d15c",
|
|
47
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"exports_delta": null,
|
|
51
|
+
"narrative": null
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"$schema": "dovetail-release-event/v1",
|
|
55
|
+
"event_id": "dovetail-mcp@0.0.45",
|
|
56
|
+
"package": "@tenonhq/dovetail-mcp",
|
|
57
|
+
"version": "0.0.45",
|
|
58
|
+
"prev_version": "0.0.44",
|
|
59
|
+
"published_at": "2026-10-02T17:40:24.884Z",
|
|
60
|
+
"git": {
|
|
61
|
+
"sha": "f4aaad6bcda58eb3fb5a9373b8a7cc69e00070b2",
|
|
62
|
+
"tag": "dovetail-mcp@0.0.45"
|
|
63
|
+
},
|
|
64
|
+
"semver_bump": "patch",
|
|
65
|
+
"commits": [
|
|
66
|
+
{
|
|
67
|
+
"sha": "f4aaad6bc",
|
|
68
|
+
"subject": "chore(deps): bump sanitize-html to 2.17.7 + raise gmail/mcp Node floor to 22.12 (#289)",
|
|
69
|
+
"pr": 289
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"sha": "b46e30a86",
|
|
73
|
+
"subject": "chore(release): publish 7 packages [skip ci]"
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"exports_delta": null,
|
|
77
|
+
"narrative": null
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"$schema": "dovetail-release-event/v1",
|
|
81
|
+
"event_id": "dovetail-clickup@0.0.14",
|
|
82
|
+
"package": "@tenonhq/dovetail-clickup",
|
|
83
|
+
"version": "0.0.14",
|
|
84
|
+
"prev_version": "0.0.13",
|
|
85
|
+
"published_at": "2026-10-01T17:10:38.339Z",
|
|
86
|
+
"git": {
|
|
87
|
+
"sha": "fb43357046e2207913dfb265730008d64b89b366",
|
|
88
|
+
"tag": "dovetail-clickup@0.0.14"
|
|
89
|
+
},
|
|
90
|
+
"semver_bump": "patch",
|
|
91
|
+
"commits": [
|
|
92
|
+
{
|
|
93
|
+
"sha": "fb4335704",
|
|
94
|
+
"subject": "chore(deps): bump axios from 1.16.0 to 1.20.0 (#238)",
|
|
95
|
+
"pr": 238
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"sha": "534f517e4",
|
|
99
|
+
"subject": "chore(release): publish 3 packages [skip ci]"
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"exports_delta": null,
|
|
103
|
+
"narrative": null
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"$schema": "dovetail-release-event/v1",
|
|
107
|
+
"event_id": "dovetail-schema@0.0.14",
|
|
108
|
+
"package": "@tenonhq/dovetail-schema",
|
|
109
|
+
"version": "0.0.14",
|
|
110
|
+
"prev_version": "0.0.13",
|
|
111
|
+
"published_at": "2026-10-01T17:10:38.339Z",
|
|
112
|
+
"git": {
|
|
113
|
+
"sha": "fb43357046e2207913dfb265730008d64b89b366",
|
|
114
|
+
"tag": "dovetail-schema@0.0.14"
|
|
115
|
+
},
|
|
116
|
+
"semver_bump": "patch",
|
|
117
|
+
"commits": [
|
|
118
|
+
{
|
|
119
|
+
"sha": "fb4335704",
|
|
120
|
+
"subject": "chore(deps): bump axios from 1.16.0 to 1.20.0 (#238)",
|
|
121
|
+
"pr": 238
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"sha": "4576c072f",
|
|
125
|
+
"subject": "chore(release): publish 15 packages [skip ci]"
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
"exports_delta": null,
|
|
129
|
+
"narrative": null
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"$schema": "dovetail-release-event/v1",
|
|
133
|
+
"event_id": "dovetail-core@0.0.120",
|
|
134
|
+
"package": "@tenonhq/dovetail-core",
|
|
135
|
+
"version": "0.0.120",
|
|
136
|
+
"prev_version": "0.0.119",
|
|
137
|
+
"published_at": "2026-10-01T17:10:38.339Z",
|
|
138
|
+
"git": {
|
|
139
|
+
"sha": "fb43357046e2207913dfb265730008d64b89b366",
|
|
140
|
+
"tag": "dovetail-core@0.0.120"
|
|
141
|
+
},
|
|
142
|
+
"semver_bump": "patch",
|
|
143
|
+
"commits": [
|
|
144
|
+
{
|
|
145
|
+
"sha": "fb4335704",
|
|
146
|
+
"subject": "chore(deps): bump axios from 1.16.0 to 1.20.0 (#238)",
|
|
147
|
+
"pr": 238
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"sha": "87831d6db",
|
|
151
|
+
"subject": "chore(release): @tenonhq/dovetail-dashboard@0.0.52 [skip ci]"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"sha": "6acaf3b81",
|
|
155
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"sha": "3ecabd113",
|
|
159
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"sha": "2fd584e31",
|
|
163
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"sha": "80c775d5f",
|
|
167
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"sha": "b402cc04f",
|
|
171
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"sha": "9e552389f",
|
|
175
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"sha": "a97389552",
|
|
179
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"sha": "db572ece7",
|
|
183
|
+
"subject": "chore(release): @tenonhq/dovetail-dashboard@0.0.51 [skip ci]"
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"sha": "a9abae9b8",
|
|
187
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"sha": "4f8b2c234",
|
|
191
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"sha": "83df94645",
|
|
195
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"sha": "4576c072f",
|
|
199
|
+
"subject": "chore(release): publish 15 packages [skip ci]"
|
|
200
|
+
}
|
|
201
|
+
],
|
|
202
|
+
"exports_delta": null,
|
|
203
|
+
"narrative": null
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"$schema": "dovetail-release-event/v1",
|
|
207
|
+
"event_id": "dovetail-dashboard@0.0.53",
|
|
208
|
+
"package": "@tenonhq/dovetail-dashboard",
|
|
209
|
+
"version": "0.0.53",
|
|
210
|
+
"prev_version": "0.0.52",
|
|
211
|
+
"published_at": "2026-10-01T17:10:38.339Z",
|
|
212
|
+
"git": {
|
|
213
|
+
"sha": "fb43357046e2207913dfb265730008d64b89b366",
|
|
214
|
+
"tag": "dovetail-dashboard@0.0.53"
|
|
215
|
+
},
|
|
216
|
+
"semver_bump": "patch",
|
|
217
|
+
"commits": [
|
|
218
|
+
{
|
|
219
|
+
"sha": "fb4335704",
|
|
220
|
+
"subject": "chore(deps): bump axios from 1.16.0 to 1.20.0 (#238)",
|
|
221
|
+
"pr": 238
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"sha": "87831d6db",
|
|
225
|
+
"subject": "chore(release): @tenonhq/dovetail-dashboard@0.0.52 [skip ci]"
|
|
226
|
+
}
|
|
227
|
+
],
|
|
228
|
+
"exports_delta": null,
|
|
229
|
+
"narrative": null
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"$schema": "dovetail-release-event/v1",
|
|
233
|
+
"event_id": "dovetail-servicenow@0.0.47",
|
|
234
|
+
"package": "@tenonhq/dovetail-servicenow",
|
|
235
|
+
"version": "0.0.47",
|
|
236
|
+
"prev_version": "0.0.46",
|
|
237
|
+
"published_at": "2026-10-01T17:10:38.339Z",
|
|
238
|
+
"git": {
|
|
239
|
+
"sha": "fb43357046e2207913dfb265730008d64b89b366",
|
|
240
|
+
"tag": "dovetail-servicenow@0.0.47"
|
|
241
|
+
},
|
|
242
|
+
"semver_bump": "patch",
|
|
243
|
+
"commits": [
|
|
244
|
+
{
|
|
245
|
+
"sha": "fb4335704",
|
|
246
|
+
"subject": "chore(deps): bump axios from 1.16.0 to 1.20.0 (#238)",
|
|
247
|
+
"pr": 238
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"sha": "359e12712",
|
|
251
|
+
"subject": "chore(deps): bump @hono/node-server and @modelcontextprotocol/sdk (#263)",
|
|
252
|
+
"pr": 263
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"sha": "6acaf3b81",
|
|
256
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
257
|
+
}
|
|
258
|
+
],
|
|
259
|
+
"exports_delta": null,
|
|
260
|
+
"narrative": null
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"$schema": "dovetail-release-event/v1",
|
|
264
|
+
"event_id": "dovetail-mcp@0.0.44",
|
|
265
|
+
"package": "@tenonhq/dovetail-mcp",
|
|
266
|
+
"version": "0.0.44",
|
|
267
|
+
"prev_version": "0.0.43",
|
|
268
|
+
"published_at": "2026-10-01T17:10:38.339Z",
|
|
269
|
+
"git": {
|
|
270
|
+
"sha": "fb43357046e2207913dfb265730008d64b89b366",
|
|
271
|
+
"tag": "dovetail-mcp@0.0.44"
|
|
272
|
+
},
|
|
273
|
+
"semver_bump": "patch",
|
|
274
|
+
"commits": [
|
|
275
|
+
{
|
|
276
|
+
"sha": "359e12712",
|
|
277
|
+
"subject": "chore(deps): bump @hono/node-server and @modelcontextprotocol/sdk (#263)",
|
|
278
|
+
"pr": 263
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"sha": "6acaf3b81",
|
|
282
|
+
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
283
|
+
}
|
|
284
|
+
],
|
|
285
|
+
"exports_delta": null,
|
|
286
|
+
"narrative": null
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"$schema": "dovetail-release-event/v1",
|
|
290
|
+
"event_id": "dovetail-sawmill@0.0.10",
|
|
291
|
+
"package": "@tenonhq/dovetail-sawmill",
|
|
292
|
+
"version": "0.0.10",
|
|
293
|
+
"prev_version": "0.0.9",
|
|
294
|
+
"published_at": "2026-10-01T17:10:38.339Z",
|
|
295
|
+
"git": {
|
|
296
|
+
"sha": "fb43357046e2207913dfb265730008d64b89b366",
|
|
297
|
+
"tag": "dovetail-sawmill@0.0.10"
|
|
298
|
+
},
|
|
299
|
+
"semver_bump": "patch",
|
|
300
|
+
"commits": [
|
|
301
|
+
{
|
|
302
|
+
"sha": "fb4335704",
|
|
303
|
+
"subject": "chore(deps): bump axios from 1.16.0 to 1.20.0 (#238)",
|
|
304
|
+
"pr": 238
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
"sha": "4576c072f",
|
|
308
|
+
"subject": "chore(release): publish 15 packages [skip ci]"
|
|
309
|
+
}
|
|
310
|
+
],
|
|
311
|
+
"exports_delta": null,
|
|
312
|
+
"narrative": null
|
|
313
|
+
},
|
|
5
314
|
{
|
|
6
315
|
"$schema": "dovetail-release-event/v1",
|
|
7
316
|
"event_id": "dovetail-dashboard@0.0.52",
|
|
@@ -1026,236 +1335,6 @@
|
|
|
1026
1335
|
],
|
|
1027
1336
|
"exports_delta": null,
|
|
1028
1337
|
"narrative": null
|
|
1029
|
-
},
|
|
1030
|
-
{
|
|
1031
|
-
"$schema": "dovetail-release-event/v1",
|
|
1032
|
-
"event_id": "dovetail-servicenow@0.0.34",
|
|
1033
|
-
"package": "@tenonhq/dovetail-servicenow",
|
|
1034
|
-
"version": "0.0.34",
|
|
1035
|
-
"prev_version": "0.0.33",
|
|
1036
|
-
"published_at": "2026-07-23T15:03:26.069Z",
|
|
1037
|
-
"git": {
|
|
1038
|
-
"sha": "864b065152544e200e09e3d5a726eed13d810d43",
|
|
1039
|
-
"tag": "dovetail-servicenow@0.0.34"
|
|
1040
|
-
},
|
|
1041
|
-
"semver_bump": "patch",
|
|
1042
|
-
"commits": [
|
|
1043
|
-
{
|
|
1044
|
-
"sha": "864b06515",
|
|
1045
|
-
"subject": "feat(servicenow): set-column overrides inherited columns per-child (DEV-509) (#235)",
|
|
1046
|
-
"pr": 235
|
|
1047
|
-
},
|
|
1048
|
-
{
|
|
1049
|
-
"sha": "8d886d43d",
|
|
1050
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1051
|
-
}
|
|
1052
|
-
],
|
|
1053
|
-
"exports_delta": null,
|
|
1054
|
-
"narrative": null
|
|
1055
|
-
},
|
|
1056
|
-
{
|
|
1057
|
-
"$schema": "dovetail-release-event/v1",
|
|
1058
|
-
"event_id": "dovetail-mcp@0.0.31",
|
|
1059
|
-
"package": "@tenonhq/dovetail-mcp",
|
|
1060
|
-
"version": "0.0.31",
|
|
1061
|
-
"prev_version": "0.0.30",
|
|
1062
|
-
"published_at": "2026-07-23T15:03:26.069Z",
|
|
1063
|
-
"git": {
|
|
1064
|
-
"sha": "864b065152544e200e09e3d5a726eed13d810d43",
|
|
1065
|
-
"tag": "dovetail-mcp@0.0.31"
|
|
1066
|
-
},
|
|
1067
|
-
"semver_bump": "patch",
|
|
1068
|
-
"commits": [
|
|
1069
|
-
{
|
|
1070
|
-
"sha": "8d886d43d",
|
|
1071
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1072
|
-
}
|
|
1073
|
-
],
|
|
1074
|
-
"exports_delta": null,
|
|
1075
|
-
"narrative": null
|
|
1076
|
-
},
|
|
1077
|
-
{
|
|
1078
|
-
"$schema": "dovetail-release-event/v1",
|
|
1079
|
-
"event_id": "dovetail-servicenow@0.0.33",
|
|
1080
|
-
"package": "@tenonhq/dovetail-servicenow",
|
|
1081
|
-
"version": "0.0.33",
|
|
1082
|
-
"prev_version": "0.0.32",
|
|
1083
|
-
"published_at": "2026-07-22T20:55:02.792Z",
|
|
1084
|
-
"git": {
|
|
1085
|
-
"sha": "0f9f2474767068386ada16a839ed7072688354be",
|
|
1086
|
-
"tag": "dovetail-servicenow@0.0.33"
|
|
1087
|
-
},
|
|
1088
|
-
"semver_bump": "patch",
|
|
1089
|
-
"commits": [
|
|
1090
|
-
{
|
|
1091
|
-
"sha": "0f9f24747",
|
|
1092
|
-
"subject": "fix(servicenow): flush stdout before exit + invoke-rest --out for large bodies (#234)",
|
|
1093
|
-
"pr": 234
|
|
1094
|
-
},
|
|
1095
|
-
{
|
|
1096
|
-
"sha": "b79555b25",
|
|
1097
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1098
|
-
}
|
|
1099
|
-
],
|
|
1100
|
-
"exports_delta": null,
|
|
1101
|
-
"narrative": null
|
|
1102
|
-
},
|
|
1103
|
-
{
|
|
1104
|
-
"$schema": "dovetail-release-event/v1",
|
|
1105
|
-
"event_id": "dovetail-mcp@0.0.30",
|
|
1106
|
-
"package": "@tenonhq/dovetail-mcp",
|
|
1107
|
-
"version": "0.0.30",
|
|
1108
|
-
"prev_version": "0.0.29",
|
|
1109
|
-
"published_at": "2026-07-22T20:55:02.792Z",
|
|
1110
|
-
"git": {
|
|
1111
|
-
"sha": "0f9f2474767068386ada16a839ed7072688354be",
|
|
1112
|
-
"tag": "dovetail-mcp@0.0.30"
|
|
1113
|
-
},
|
|
1114
|
-
"semver_bump": "patch",
|
|
1115
|
-
"commits": [
|
|
1116
|
-
{
|
|
1117
|
-
"sha": "b79555b25",
|
|
1118
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1119
|
-
}
|
|
1120
|
-
],
|
|
1121
|
-
"exports_delta": null,
|
|
1122
|
-
"narrative": null
|
|
1123
|
-
},
|
|
1124
|
-
{
|
|
1125
|
-
"$schema": "dovetail-release-event/v1",
|
|
1126
|
-
"event_id": "dovetail-servicenow@0.0.32",
|
|
1127
|
-
"package": "@tenonhq/dovetail-servicenow",
|
|
1128
|
-
"version": "0.0.32",
|
|
1129
|
-
"prev_version": "0.0.31",
|
|
1130
|
-
"published_at": "2026-07-22T01:37:29.651Z",
|
|
1131
|
-
"git": {
|
|
1132
|
-
"sha": "3801815f1a20e0ecb5d9d737bd0e373b3b42c06e",
|
|
1133
|
-
"tag": "dovetail-servicenow@0.0.32"
|
|
1134
|
-
},
|
|
1135
|
-
"semver_bump": "patch",
|
|
1136
|
-
"commits": [
|
|
1137
|
-
{
|
|
1138
|
-
"sha": "3801815f1",
|
|
1139
|
-
"subject": "feat: add set-table verb for table-level dictionary attributes (#236)",
|
|
1140
|
-
"pr": 236
|
|
1141
|
-
},
|
|
1142
|
-
{
|
|
1143
|
-
"sha": "02f562c32",
|
|
1144
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1145
|
-
}
|
|
1146
|
-
],
|
|
1147
|
-
"exports_delta": null,
|
|
1148
|
-
"narrative": null
|
|
1149
|
-
},
|
|
1150
|
-
{
|
|
1151
|
-
"$schema": "dovetail-release-event/v1",
|
|
1152
|
-
"event_id": "dovetail-mcp@0.0.29",
|
|
1153
|
-
"package": "@tenonhq/dovetail-mcp",
|
|
1154
|
-
"version": "0.0.29",
|
|
1155
|
-
"prev_version": "0.0.28",
|
|
1156
|
-
"published_at": "2026-07-22T01:37:29.651Z",
|
|
1157
|
-
"git": {
|
|
1158
|
-
"sha": "3801815f1a20e0ecb5d9d737bd0e373b3b42c06e",
|
|
1159
|
-
"tag": "dovetail-mcp@0.0.29"
|
|
1160
|
-
},
|
|
1161
|
-
"semver_bump": "patch",
|
|
1162
|
-
"commits": [
|
|
1163
|
-
{
|
|
1164
|
-
"sha": "02f562c32",
|
|
1165
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1166
|
-
}
|
|
1167
|
-
],
|
|
1168
|
-
"exports_delta": null,
|
|
1169
|
-
"narrative": null
|
|
1170
|
-
},
|
|
1171
|
-
{
|
|
1172
|
-
"$schema": "dovetail-release-event/v1",
|
|
1173
|
-
"event_id": "dovetail-servicenow@0.0.31",
|
|
1174
|
-
"package": "@tenonhq/dovetail-servicenow",
|
|
1175
|
-
"version": "0.0.31",
|
|
1176
|
-
"prev_version": "0.0.30",
|
|
1177
|
-
"published_at": "2026-07-16T10:03:53.596Z",
|
|
1178
|
-
"git": {
|
|
1179
|
-
"sha": "b5ed021f27e7787fcec2898fa310cb1854ae4711",
|
|
1180
|
-
"tag": "dovetail-servicenow@0.0.31"
|
|
1181
|
-
},
|
|
1182
|
-
"semver_bump": "patch",
|
|
1183
|
-
"commits": [
|
|
1184
|
-
{
|
|
1185
|
-
"sha": "b5ed021f2",
|
|
1186
|
-
"subject": "feat(servicenow): publish-app verb — Store + app-repo publish with progress polling (#232)",
|
|
1187
|
-
"pr": 232
|
|
1188
|
-
},
|
|
1189
|
-
{
|
|
1190
|
-
"sha": "0ab5a243b",
|
|
1191
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1192
|
-
}
|
|
1193
|
-
],
|
|
1194
|
-
"exports_delta": null,
|
|
1195
|
-
"narrative": null
|
|
1196
|
-
},
|
|
1197
|
-
{
|
|
1198
|
-
"$schema": "dovetail-release-event/v1",
|
|
1199
|
-
"event_id": "dovetail-mcp@0.0.28",
|
|
1200
|
-
"package": "@tenonhq/dovetail-mcp",
|
|
1201
|
-
"version": "0.0.28",
|
|
1202
|
-
"prev_version": "0.0.27",
|
|
1203
|
-
"published_at": "2026-07-16T10:03:53.596Z",
|
|
1204
|
-
"git": {
|
|
1205
|
-
"sha": "b5ed021f27e7787fcec2898fa310cb1854ae4711",
|
|
1206
|
-
"tag": "dovetail-mcp@0.0.28"
|
|
1207
|
-
},
|
|
1208
|
-
"semver_bump": "patch",
|
|
1209
|
-
"commits": [
|
|
1210
|
-
{
|
|
1211
|
-
"sha": "0ab5a243b",
|
|
1212
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1213
|
-
}
|
|
1214
|
-
],
|
|
1215
|
-
"exports_delta": null,
|
|
1216
|
-
"narrative": null
|
|
1217
|
-
},
|
|
1218
|
-
{
|
|
1219
|
-
"$schema": "dovetail-release-event/v1",
|
|
1220
|
-
"event_id": "dovetail-core@0.0.114",
|
|
1221
|
-
"package": "@tenonhq/dovetail-core",
|
|
1222
|
-
"version": "0.0.114",
|
|
1223
|
-
"prev_version": "0.0.113",
|
|
1224
|
-
"published_at": "2026-07-16T04:13:03.276Z",
|
|
1225
|
-
"git": {
|
|
1226
|
-
"sha": "25b61e955ec6c13a7e1444c1d866d7681aca1cd0",
|
|
1227
|
-
"tag": "dovetail-core@0.0.114"
|
|
1228
|
-
},
|
|
1229
|
-
"semver_bump": "patch",
|
|
1230
|
-
"commits": [
|
|
1231
|
-
{
|
|
1232
|
-
"sha": "25b61e955",
|
|
1233
|
-
"subject": "fix(core): scope dove create's round-trip to the new record (no whole-scope churn) (#229)",
|
|
1234
|
-
"pr": 229
|
|
1235
|
-
},
|
|
1236
|
-
{
|
|
1237
|
-
"sha": "0ab5a243b",
|
|
1238
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1239
|
-
},
|
|
1240
|
-
{
|
|
1241
|
-
"sha": "e0c350259",
|
|
1242
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1243
|
-
},
|
|
1244
|
-
{
|
|
1245
|
-
"sha": "6a4081d25",
|
|
1246
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1247
|
-
},
|
|
1248
|
-
{
|
|
1249
|
-
"sha": "b8967c79d",
|
|
1250
|
-
"subject": "chore(release): publish 2 packages [skip ci]"
|
|
1251
|
-
},
|
|
1252
|
-
{
|
|
1253
|
-
"sha": "ff7ced55a",
|
|
1254
|
-
"subject": "chore(release): @tenonhq/dovetail-core@0.0.113 [skip ci]"
|
|
1255
|
-
}
|
|
1256
|
-
],
|
|
1257
|
-
"exports_delta": null,
|
|
1258
|
-
"narrative": null
|
|
1259
1338
|
}
|
|
1260
1339
|
]
|
|
1261
1340
|
}
|