@tscircuit/parts-engine 0.0.21 → 0.0.23

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/index.js CHANGED
@@ -9191,13 +9191,14 @@ var handleHoleCutout = (hole, index) => {
9191
9191
  });
9192
9192
  };
9193
9193
  var handleVia = (via, index) => {
9194
+ const holeDiameter = via.holeRadius * 2;
9194
9195
  return pcb_via.parse({
9195
9196
  type: "pcb_via",
9196
9197
  pcb_via_id: `pcb_via_${index + 1}`,
9197
9198
  x: milx10(via.center.x),
9198
9199
  y: milx10(via.center.y),
9199
9200
  outer_diameter: milx10(via.outerDiameter),
9200
- hole_diameter: milx10(via.holeDiameter),
9201
+ hole_diameter: milx10(holeDiameter),
9201
9202
  layers: ["top", "bottom"]
9202
9203
  });
9203
9204
  };
@@ -9753,7 +9754,7 @@ var ViaSchema = BaseShapeSchema.extend({
9753
9754
  type: external_exports.literal("VIA"),
9754
9755
  center: PointSchema,
9755
9756
  outerDiameter: external_exports.number(),
9756
- holeDiameter: external_exports.number()
9757
+ holeRadius: external_exports.number()
9757
9758
  });
9758
9759
  var RectSchema = BaseShapeSchema.extend({
9759
9760
  type: external_exports.literal("RECT"),
@@ -9903,13 +9904,13 @@ var ShapeItemSchema = external_exports.object({
9903
9904
  });
9904
9905
  }
9905
9906
  case "VIA": {
9906
- const [x, y, outerDiameter, , holeDiameter, id] = shape.data.split("~");
9907
+ const [x, y, outerDiameter, , holeRadius, id] = shape.data.split("~");
9907
9908
  const center = [Number(x), Number(y)];
9908
9909
  return ViaSchema.parse({
9909
9910
  type: "VIA",
9910
9911
  center,
9911
9912
  outerDiameter: Number(outerDiameter),
9912
- holeDiameter: Number(holeDiameter),
9913
+ holeRadius: Number(holeRadius),
9913
9914
  id
9914
9915
  });
9915
9916
  }
@@ -10656,6 +10657,34 @@ var getFetchWithEasyEdaProxy = ({
10656
10657
  };
10657
10658
  };
10658
10659
 
10660
+ // lib/jlc-parts-engine/get-pin-header-search-params.ts
10661
+ var parseMillimeters = (value) => {
10662
+ if (typeof value === "number" && Number.isFinite(value)) return value;
10663
+ if (typeof value !== "string") return void 0;
10664
+ const match = value.trim().match(/^(\d+(?:\.\d+)?)(?:\s*mm)?$/i);
10665
+ if (!match) return void 0;
10666
+ return Number(match[1]);
10667
+ };
10668
+ var parsePinHeaderPitchFromFootprinterString = (footprinterString) => {
10669
+ const match = footprinterString?.match(
10670
+ /(?:^|_)p(\d+(?:\.\d+)?)(?:mm)?(?:_|$)/i
10671
+ );
10672
+ return match ? Number(match[1]) : void 0;
10673
+ };
10674
+ var isKnownPinHeaderGender = (gender) => gender === "male" || gender === "female";
10675
+ var getPinHeaderSearchParams = (sourceComponent, footprinterString) => {
10676
+ const pitch = parseMillimeters(sourceComponent.pitch) ?? parsePinHeaderPitchFromFootprinterString(footprinterString);
10677
+ const numPins = sourceComponent.pin_count ?? sourceComponent.pinCount ?? sourceComponent.num_pins;
10678
+ const gender = isKnownPinHeaderGender(sourceComponent.gender) ? sourceComponent.gender : void 0;
10679
+ const isRightAngle = sourceComponent.is_right_angle ?? sourceComponent.right_angle ?? sourceComponent.rightAngle;
10680
+ return {
10681
+ ...pitch ? { pitch } : {},
10682
+ ...typeof numPins === "number" ? { num_pins: numPins } : {},
10683
+ ...gender ? { gender } : {},
10684
+ ...typeof isRightAngle === "boolean" ? { is_right_angle: isRightAngle } : {}
10685
+ };
10686
+ };
10687
+
10659
10688
  // lib/jlc-parts-engine/jlc-parts-cache.ts
10660
10689
  var cache = /* @__PURE__ */ new Map();
10661
10690
  var getJlcPartsCached = async (name, params) => {
@@ -10681,6 +10710,7 @@ var withBasicPartPreference = (parts) => {
10681
10710
  };
10682
10711
 
10683
10712
  // lib/jlc-parts-engine/JlcPartsEngine.ts
10713
+ var normalizePartNumber = (partNumber) => typeof partNumber === "string" ? partNumber.trim().toLowerCase() : void 0;
10684
10714
  var JlcPcbPartsEngine = class {
10685
10715
  defaultPlatformFetch;
10686
10716
  easyEdaProxyConfig;
@@ -10724,20 +10754,9 @@ var JlcPcbPartsEngine = class {
10724
10754
  jlcpcb: withBasicPartPreference(capacitors).map((c) => `C${c.lcsc}`).slice(0, 3)
10725
10755
  };
10726
10756
  } else if (sourceComponent.type === "source_component" && sourceComponent.ftype === "simple_pin_header") {
10727
- let pitch;
10728
- if (footprinterString?.includes("_p")) {
10729
- pitch = Number(footprinterString.split("_p")[1]);
10730
- }
10731
10757
  const { headers } = await getJlcPartsCached(
10732
10758
  "headers",
10733
- pitch ? {
10734
- pitch,
10735
- num_pins: sourceComponent.pin_count,
10736
- gender: sourceComponent.gender
10737
- } : {
10738
- num_pins: sourceComponent.pin_count,
10739
- gender: sourceComponent.gender
10740
- }
10759
+ getPinHeaderSearchParams(sourceComponent, footprinterString)
10741
10760
  );
10742
10761
  return {
10743
10762
  jlcpcb: withBasicPartPreference(headers).map((h) => `C${h.lcsc}`).slice(0, 3)
@@ -10863,7 +10882,14 @@ var JlcPcbPartsEngine = class {
10863
10882
  const { components } = await getJlcPartsCached("components", {
10864
10883
  search: manufacturerPartNumber
10865
10884
  });
10866
- resolvedSupplierPartNumber = components?.[0] ? `C${components[0].lcsc}` : void 0;
10885
+ const normalizedManufacturerPartNumber = normalizePartNumber(
10886
+ manufacturerPartNumber
10887
+ );
10888
+ const exactManufacturerPartMatch = components?.find(
10889
+ (component) => normalizePartNumber(component.mfr) === normalizedManufacturerPartNumber
10890
+ );
10891
+ const componentMatch = exactManufacturerPartMatch ?? components?.[0];
10892
+ resolvedSupplierPartNumber = componentMatch ? `C${componentMatch.lcsc}` : void 0;
10867
10893
  }
10868
10894
  if (!resolvedSupplierPartNumber) return void 0;
10869
10895
  const rawEasyEdaJson = await fetchEasyEDAComponent(