@daghis/teamcity-mcp 1.10.6 → 1.10.7

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.
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "1.10.6"
2
+ ".": "1.10.7"
3
3
  }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.10.7](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v1.10.6...teamcity-mcp-v1.10.7) (2025-10-06)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **teamcity:** serialize snapshot dependencies as xml ([#235](https://github.com/Daghis/teamcity-mcp/issues/235)) ([#236](https://github.com/Daghis/teamcity-mcp/issues/236)) ([9cec149](https://github.com/Daghis/teamcity-mcp/commit/9cec14934783f135b408211fefa41ba6a38391c8))
9
+
3
10
  ## [1.10.6](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v1.10.5...teamcity-mcp-v1.10.6) (2025-10-04)
4
11
 
5
12
 
package/dist/index.js CHANGED
@@ -2321,6 +2321,12 @@ var JSON_HEADERS2 = {
2321
2321
  Accept: "application/json"
2322
2322
  }
2323
2323
  };
2324
+ var XML_HEADERS = {
2325
+ headers: {
2326
+ "Content-Type": "application/xml",
2327
+ Accept: "application/json"
2328
+ }
2329
+ };
2324
2330
  var JSON_GET_HEADERS2 = {
2325
2331
  headers: {
2326
2332
  Accept: "application/json"
@@ -2382,6 +2388,86 @@ var mergeRecords2 = (base, override) => {
2382
2388
  }
2383
2389
  return merged;
2384
2390
  };
2391
+ var escapeXml = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
2392
+ var attributesToString = (attributes) => {
2393
+ const parts = Object.entries(attributes).filter(([, value]) => value !== void 0).map(([key, value]) => `${key}="${escapeXml(value)}"`);
2394
+ return parts.length > 0 ? ` ${parts.join(" ")}` : "";
2395
+ };
2396
+ var propertiesToXml = (properties) => {
2397
+ if (!properties) {
2398
+ return void 0;
2399
+ }
2400
+ const entries = properties.property;
2401
+ const list = Array.isArray(entries) ? entries : entries != null ? [entries] : [];
2402
+ if (list.length === 0) {
2403
+ return void 0;
2404
+ }
2405
+ const nodes = list.filter((item) => item?.name).map((item) => {
2406
+ const name = item?.name ?? "";
2407
+ const value = item?.value != null ? String(item.value) : "";
2408
+ return `<property name="${escapeXml(name)}" value="${escapeXml(value)}"/>`;
2409
+ });
2410
+ if (nodes.length === 0) {
2411
+ return void 0;
2412
+ }
2413
+ return `<properties>${nodes.join("")}</properties>`;
2414
+ };
2415
+ var sourceBuildTypeToXml = (source) => {
2416
+ if (!source || typeof source !== "object") {
2417
+ return void 0;
2418
+ }
2419
+ const { id, name } = source;
2420
+ if (!id) {
2421
+ return void 0;
2422
+ }
2423
+ const attributes = {
2424
+ id,
2425
+ name
2426
+ };
2427
+ return `<source-buildType${attributesToString(attributes)}/>`;
2428
+ };
2429
+ var dependencyToXml = (dependencyType, payload) => {
2430
+ const root = dependencyType === "artifact" ? "artifact-dependency" : "snapshot-dependency";
2431
+ const normalizeTypeAttribute = (value) => {
2432
+ if (!value) {
2433
+ return void 0;
2434
+ }
2435
+ if (dependencyType === "snapshot" && value === "snapshotDependency") {
2436
+ return "snapshot_dependency";
2437
+ }
2438
+ if (dependencyType === "artifact" && value === "artifactDependency") {
2439
+ return "artifact_dependency";
2440
+ }
2441
+ return value;
2442
+ };
2443
+ const attributes = {
2444
+ id: typeof payload.id === "string" && payload.id.trim() !== "" ? payload.id : void 0,
2445
+ name: typeof payload.name === "string" && payload.name.trim() !== "" ? payload.name : void 0,
2446
+ type: typeof payload.type === "string" && payload.type.trim() !== "" ? normalizeTypeAttribute(payload.type) : void 0,
2447
+ disabled: typeof payload.disabled === "boolean" ? payload.disabled ? "true" : "false" : void 0,
2448
+ inherited: typeof payload.inherited === "boolean" ? payload.inherited ? "true" : "false" : void 0
2449
+ };
2450
+ const fragments = [];
2451
+ const sourceBuildTypeXml = sourceBuildTypeToXml(
2452
+ payload["source-buildType"]
2453
+ );
2454
+ if (sourceBuildTypeXml) {
2455
+ fragments.push(sourceBuildTypeXml);
2456
+ }
2457
+ const propertiesXml = propertiesToXml(payload.properties);
2458
+ if (propertiesXml) {
2459
+ fragments.push(propertiesXml);
2460
+ }
2461
+ return `<${root}${attributesToString(attributes)}>${fragments.join("")}</${root}>`;
2462
+ };
2463
+ var prepareArtifactRequest = (payload) => ({
2464
+ body: payload,
2465
+ headers: JSON_HEADERS2
2466
+ });
2467
+ var prepareSnapshotRequest = (payload) => ({
2468
+ body: dependencyToXml("snapshot", payload),
2469
+ headers: XML_HEADERS
2470
+ });
2385
2471
  var BuildDependencyManager = class {
2386
2472
  constructor(client) {
2387
2473
  this.client = client;
@@ -2436,36 +2522,40 @@ var BuildDependencyManager = class {
2436
2522
  }
2437
2523
  async createDependency(dependencyType, buildTypeId, payload) {
2438
2524
  if (dependencyType === "artifact") {
2525
+ const { body: body2, headers: headers2 } = prepareArtifactRequest(payload);
2439
2526
  return this.client.modules.buildTypes.addArtifactDependencyToBuildType(
2440
2527
  buildTypeId,
2441
2528
  void 0,
2442
- payload,
2443
- JSON_HEADERS2
2529
+ body2,
2530
+ headers2
2444
2531
  );
2445
2532
  }
2533
+ const { body, headers } = prepareSnapshotRequest(payload);
2446
2534
  return this.client.modules.buildTypes.addSnapshotDependencyToBuildType(
2447
2535
  buildTypeId,
2448
2536
  void 0,
2449
- payload,
2450
- JSON_HEADERS2
2537
+ body,
2538
+ headers
2451
2539
  );
2452
2540
  }
2453
2541
  async replaceDependency(dependencyType, buildTypeId, dependencyId, payload) {
2454
2542
  if (dependencyType === "artifact") {
2543
+ const { body: body2, headers: headers2 } = prepareArtifactRequest(payload);
2455
2544
  return this.client.modules.buildTypes.replaceArtifactDependency(
2456
2545
  buildTypeId,
2457
2546
  dependencyId,
2458
2547
  void 0,
2459
- payload,
2460
- JSON_HEADERS2
2548
+ body2,
2549
+ headers2
2461
2550
  );
2462
2551
  }
2552
+ const { body, headers } = prepareSnapshotRequest(payload);
2463
2553
  return this.client.modules.buildTypes.replaceSnapshotDependency(
2464
2554
  buildTypeId,
2465
2555
  dependencyId,
2466
2556
  void 0,
2467
- payload,
2468
- JSON_HEADERS2
2557
+ body,
2558
+ headers
2469
2559
  );
2470
2560
  }
2471
2561
  async fetchDependency(dependencyType, buildTypeId, dependencyId) {
@@ -38706,13 +38796,13 @@ var DEV_TOOLS = [
38706
38796
  buildRequest.properties = propertiesPayload;
38707
38797
  }
38708
38798
  const sendXmlFallback = async (error2) => {
38709
- const escapeXml = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
38710
- const branchPart = branchName ? `<branchName>${escapeXml(branchName)}</branchName>` : "";
38711
- const commentPart = commentText ? `<comment><text>${escapeXml(commentText)}</text></comment>` : "";
38799
+ const escapeXml2 = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
38800
+ const branchPart = branchName ? `<branchName>${escapeXml2(branchName)}</branchName>` : "";
38801
+ const commentPart = commentText ? `<comment><text>${escapeXml2(commentText)}</text></comment>` : "";
38712
38802
  const propertiesPart = propertiesPayload ? `<properties>${propertiesPayload.property.map(
38713
- (prop) => `<property name="${escapeXml(prop.name)}" value="${escapeXml(prop.value)}"/>`
38803
+ (prop) => `<property name="${escapeXml2(prop.name)}" value="${escapeXml2(prop.value)}"/>`
38714
38804
  ).join("")}</properties>` : "";
38715
- const xml = `<?xml version="1.0" encoding="UTF-8"?><build><buildType id="${escapeXml(
38805
+ const xml = `<?xml version="1.0" encoding="UTF-8"?><build><buildType id="${escapeXml2(
38716
38806
  typed.buildTypeId
38717
38807
  )}"/>${branchPart}${commentPart}${propertiesPart}</build>`;
38718
38808
  const response = await adapter.http.post("/app/rest/buildQueue", xml, {