easyeda 0.0.202 → 0.0.203

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
@@ -1328,7 +1328,6 @@ var checkModelObjUrlValidity = async (url) => {
1328
1328
  // lib/convert-easyeda-json-to-various-formats.ts
1329
1329
  import fs from "fs/promises";
1330
1330
  import * as path from "path";
1331
- import { normalizeManufacturerPartNumber as normalizeManufacturerPartNumber2 } from "lib";
1332
1331
  var convertEasyEdaJsonToVariousFormats = async ({
1333
1332
  jlcpcbPartNumberOrFilepath,
1334
1333
  outputFilename,
@@ -1354,7 +1353,7 @@ var convertEasyEdaJsonToVariousFormats = async ({
1354
1353
  }
1355
1354
  }
1356
1355
  } = rawEasyEdaJson;
1357
- filename = normalizeManufacturerPartNumber2(manufacturerPartNumber);
1356
+ filename = normalizeManufacturerPartNumber(manufacturerPartNumber);
1358
1357
  }
1359
1358
  outputFilename = `${filename}.${outputFormat}`;
1360
1359
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../lib/convert-easyeda-json-to-tscircuit-soup-json.ts","../lib/math/arc-utils.ts","../lib/utils/easyeda-unit-to-mm.ts","../lib/websafe/fetch-easyeda-json.ts","../lib/schemas/easy-eda-json-schema.ts","../lib/schemas/package-detail-shape-schema.ts","../lib/schemas/single-letter-shape-schema.ts","../lib/websafe/convert-to-typescript-component/index.tsx","../lib/websafe/generate-footprint-tsx.ts","../lib/websafe/convert-to-typescript-component/generate-typescript-component.ts","../lib/utils/normalize-manufacturer-part-number.ts","../lib/convert-easyeda-json-to-various-formats.ts"],"sourcesContent":["import type {\n PadSchema,\n TrackSchema,\n ArcSchema,\n SVGNodeSchema,\n HoleSchema,\n ViaSchema,\n SolidRegionSchema,\n} from \"./schemas/package-detail-shape-schema\"\nimport type { z } from \"zod\"\nimport type { BetterEasyEdaJson } from \"./schemas/easy-eda-json-schema\"\nimport type {\n AnyCircuitElement,\n PcbSmtPad,\n PcbViaInput,\n PcbComponentInput,\n} from \"circuit-json\"\nimport {\n any_source_component,\n pcb_smtpad,\n pcb_silkscreen_path,\n pcb_plated_hole,\n pcb_hole,\n pcb_via,\n} from \"circuit-json\"\nimport * as Soup from \"circuit-json\"\nimport { generateArcFromSweep, generateArcPathWithMid } from \"./math/arc-utils\"\nimport {\n findBoundsAndCenter,\n transformPCBElements,\n} from \"@tscircuit/circuit-json-util\"\nimport { compose, scale, translate, applyToPoint } from \"transformation-matrix\"\nimport { mm } from \"@tscircuit/mm\"\nimport { mil10ToMm } from \"./utils/easyeda-unit-to-mm\"\nimport { normalizePinLabels } from \"@tscircuit/core\"\n\nconst mil2mm = (mil: number | string) => {\n if (typeof mil === \"number\") return mm(`${mil}mil`)\n if (mil.match(/^\\d+$/)) return mm(`${mil}mil`)\n return mm(mil)\n}\n/**\n * Some components, like paths and \"HOLE\", seem to use mil*10 as\n * their unlabeled unit\n */\nconst milx10 = (mil10: number | string) => {\n if (typeof mil10 === \"number\") return mil2mm(mil10) * 10\n if (mil10.match(/^\\d+$/)) return mil2mm(mil10) * 10\n // If it has a unit, return the specified unit ignoring the multiplier\n return mil2mm(mil10)\n}\n\nconst handleSilkscreenPath = (\n track: z.infer<typeof TrackSchema>,\n index: number,\n) => {\n return pcb_silkscreen_path.parse({\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${index + 1}`,\n pcb_component_id: \"pcb_component_1\",\n layer: \"top\", // Assuming all silkscreen is on top layer\n route: track.points.map((point) => ({\n x: milx10(point.x),\n y: milx10(point.y),\n })),\n stroke_width: mil10ToMm(track.width),\n })\n}\n\nconst handleSilkscreenArc = (arc: z.infer<typeof ArcSchema>, index: number) => {\n const arcPath = generateArcFromSweep(\n arc.start.x,\n arc.start.y,\n arc.end.x,\n arc.end.y,\n arc.radiusX,\n arc.largeArc,\n arc.sweepDirection === \"CW\",\n )\n\n return pcb_silkscreen_path.parse({\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: `pcb_silkscreen_arc_${index + 1}`,\n pcb_component_id: \"pcb_component_1\",\n layer: \"top\", // Assuming all silkscreen is on top layer\n route: arcPath.map((p) => ({\n x: milx10(p.x),\n y: milx10(p.y),\n })),\n stroke_width: mil10ToMm(arc.width),\n } as Soup.PcbSilkscreenPathInput)\n}\n\nconst handleHole = (hole: z.infer<typeof HoleSchema>, index: number) => {\n return pcb_hole.parse({\n type: \"pcb_hole\",\n x: milx10(hole.center.x),\n y: milx10(hole.center.y),\n hole_diameter: milx10(hole.radius) * 2,\n hole_shape: \"circle\",\n pcb_hole_id: `pcb_hole_${index + 1}`,\n } as Soup.PcbHole)\n}\n\nconst handleHoleCutout = (hole: z.infer<typeof HoleSchema>, index: number) => {\n return Soup.pcb_cutout.parse({\n type: \"pcb_cutout\",\n pcb_cutout_id: `pcb_cutout_from_hole_${index + 1}`,\n shape: \"circle\",\n center: { x: milx10(hole.center.x), y: milx10(hole.center.y) },\n radius: milx10(hole.radius),\n } as Soup.PcbCutoutCircleInput)\n}\n\nconst handleVia = (via: z.infer<typeof ViaSchema>, index: number) => {\n return pcb_via.parse({\n type: \"pcb_via\",\n pcb_via_id: `pcb_via_${index + 1}`,\n x: milx10(via.center.x),\n y: milx10(via.center.y),\n outer_diameter: milx10(via.outerDiameter),\n hole_diameter: milx10(via.holeDiameter),\n layers: [\"top\", \"bottom\"],\n } as PcbViaInput)\n}\n\nconst handleCutout = (\n solidRegion: z.infer<typeof SolidRegionSchema>,\n index: number,\n) => {\n return Soup.pcb_cutout.parse({\n type: \"pcb_cutout\",\n pcb_cutout_id: `pcb_cutout_${index + 1}`,\n shape: \"polygon\",\n points: solidRegion.points.map((p) => ({\n x: milx10(p.x),\n y: milx10(p.y),\n })),\n } as Soup.PcbCutoutPolygonInput)\n}\n\ninterface Options {\n useModelCdn?: boolean\n shouldRecenter?: boolean\n}\n\nexport const convertEasyEdaJsonToCircuitJson = (\n easyEdaJson: BetterEasyEdaJson,\n { useModelCdn, shouldRecenter = true }: Options = {},\n): AnyCircuitElement[] => {\n const circuitElements: AnyCircuitElement[] = []\n\n // Add source component\n const source_component = any_source_component.parse({\n type: \"source_component\",\n source_component_id: \"source_component_1\",\n name: \"U1\",\n ftype: \"simple_chip\",\n })\n\n const pcb_component = Soup.pcb_component.parse({\n type: \"pcb_component\",\n pcb_component_id: \"pcb_component_1\",\n source_component_id: \"source_component_1\",\n name: \"U1\",\n ftype: \"simple_chip\",\n width: 0, // we update this at the end\n height: 0, // we update this at the end\n rotation: 0,\n center: { x: 0, y: 0 },\n layer: \"top\",\n } as PcbComponentInput)\n\n circuitElements.push(source_component, pcb_component)\n\n const pads = easyEdaJson.packageDetail.dataStr.shape.filter(\n (shape): shape is z.infer<typeof PadSchema> => shape.type === \"PAD\",\n )\n const pins = easyEdaJson.dataStr.shape.filter((shape) => shape.type === \"PIN\")\n\n // Prepare pin labels for normalization\n const pinLabelSets = pads.map((pad) => {\n const labels = []\n if (pad.number) labels.push(pad.number.toString())\n\n const pin = pins.find((p) => p.pinNumber === pad.number)\n if (pin) labels.push(pin.label)\n\n return labels\n })\n\n const normalizedPinLabels = normalizePinLabels(pinLabelSets)\n\n // Add source ports and pcb_smtpads\n pads.forEach((pad, index) => {\n const portHints = normalizedPinLabels[index]\n const pinNumber = Number.parseInt(\n portHints.find((hint) => hint.match(/pin\\d+/))!.replace(\"pin\", \"\"),\n )\n\n // Add source port\n circuitElements.push({\n type: \"source_port\",\n source_port_id: `source_port_${index + 1}`,\n source_component_id: \"source_component_1\",\n name: `pin${pinNumber}`,\n pin_number: pinNumber,\n port_hints: portHints.filter((hint) => hint !== `pin${pinNumber}`),\n })\n\n if (pad.holeRadius !== undefined && mil2mm(pad.holeRadius) !== 0) {\n // Add pcb_plated_hole\n const commonPlatedHoleProps = {\n type: \"pcb_plated_hole\",\n pcb_plated_hole_id: `pcb_plated_hole_${index + 1}`,\n x: mil2mm(pad.center.x),\n y: mil2mm(pad.center.y),\n layers: [\"top\"],\n port_hints: [`pin${pinNumber}`],\n pcb_component_id: \"pcb_component_1\",\n pcb_port_id: `pcb_port_${index + 1}`,\n }\n let additionalPlatedHoleProps: any\n\n if (pad.shape === \"OVAL\") {\n // A JLCPCB Oval is actually a Pill, and it's a bit tricky to compute\n // the correct dimensions, but we can use the following process:\n // 1. Find the smallest outer dimensions\n // 2. Use the holeRadius to determine the distanceFromOuterPlatingToHole\n // 3. Calculate the largest \"inner dimension\" (which is either the\n // holeWidth or holeHeight) by subtracting the distanceFromOuterPlatingToHole * 2\n // from the largest outer dimensions\n\n const largestOuterDimensionName: \"width\" | \"height\" =\n mil2mm(pad.width) > mil2mm(pad.height) ? \"width\" : \"height\"\n\n const smallestOuterDimension = Math.min(\n mil2mm(pad.width),\n mil2mm(pad.height),\n )\n const largestOuterDimension = Math.max(\n mil2mm(pad.width),\n mil2mm(pad.height),\n )\n\n const distanceFromOuterPlatingToHole =\n smallestOuterDimension / 2 - mil2mm(pad.holeRadius)\n\n const largestInnerDimension =\n largestOuterDimension - distanceFromOuterPlatingToHole * 2\n const smallestInnerDimension = mil2mm(pad.holeRadius) * 2\n\n const innerWidth =\n largestOuterDimensionName === \"width\"\n ? largestInnerDimension\n : smallestInnerDimension\n const innerHeight =\n largestOuterDimensionName === \"height\"\n ? largestInnerDimension\n : smallestInnerDimension\n\n additionalPlatedHoleProps = {\n shape: \"pill\",\n outer_width: mil2mm(pad.width),\n outer_height: mil2mm(pad.height),\n hole_width: innerWidth,\n hole_height: innerHeight,\n }\n } else {\n additionalPlatedHoleProps = {\n shape: \"circle\",\n hole_diameter: mil2mm(pad.holeRadius) * 2,\n outer_diameter: mil2mm(pad.width),\n radius: mil2mm(pad.holeRadius),\n }\n }\n\n circuitElements.push(\n pcb_plated_hole.parse({\n ...commonPlatedHoleProps,\n ...additionalPlatedHoleProps,\n }),\n )\n } else {\n // Add pcb_smtpad\n let soupShape: PcbSmtPad[\"shape\"] | undefined\n if (pad.shape === \"RECT\") {\n soupShape = \"rect\"\n } else if (pad.shape === \"ELLIPSE\") {\n // This is just a bug\n soupShape = \"rect\"\n } else if (pad.shape === \"OVAL\") {\n // OVAL is often a rect, especially when holeRadius is 0\n soupShape = \"rect\"\n }\n if (!soupShape) {\n throw new Error(`unknown pad.shape: \"${pad.shape}\"`)\n }\n\n const rectSize = { width: mil2mm(pad.width), height: mil2mm(pad.height) }\n if (pad.rotation === 90 || pad.rotation === 270) {\n // Swap width and height\n rectSize.width = mil2mm(pad.height)\n rectSize.height = mil2mm(pad.width)\n }\n\n const parsedPcbSmtpad = pcb_smtpad.parse({\n type: \"pcb_smtpad\",\n pcb_smtpad_id: `pcb_smtpad_${index + 1}`,\n shape: soupShape,\n x: mil2mm(pad.center.x),\n y: mil2mm(pad.center.y),\n ...(soupShape === \"rect\"\n ? rectSize\n : { radius: Math.min(mil2mm(pad.width), mil2mm(pad.height)) / 2 }),\n layer: \"top\",\n port_hints: [`pin${pinNumber}`],\n pcb_component_id: \"pcb_component_1\",\n pcb_port_id: `pcb_port_${index + 1}`,\n } as PcbSmtPad)\n circuitElements.push(parsedPcbSmtpad)\n }\n })\n\n // Add holes\n easyEdaJson.packageDetail.dataStr.shape\n .filter(\n (shape): shape is z.infer<typeof HoleSchema> => shape.type === \"HOLE\",\n )\n .forEach((h, index) => {\n circuitElements.push(handleHole(h, index))\n circuitElements.push(handleHoleCutout(h, index))\n })\n\n // Add vias\n easyEdaJson.packageDetail.dataStr.shape\n .filter((shape): shape is z.infer<typeof ViaSchema> => shape.type === \"VIA\")\n .forEach((v, index) => {\n circuitElements.push(handleVia(v, index))\n })\n\n // Add pcb cutouts from solid regions marked as cutout\n easyEdaJson.packageDetail.dataStr.shape\n .filter(\n (shape): shape is z.infer<typeof SolidRegionSchema> =>\n shape.type === \"SOLIDREGION\" && shape.fillStyle === \"cutout\",\n )\n .forEach((sr, index) => {\n circuitElements.push(handleCutout(sr, index))\n })\n\n // Add silkscreen paths, arcs and text\n easyEdaJson.packageDetail.dataStr.shape.forEach((shape, index) => {\n if (shape.type === \"TRACK\") {\n circuitElements.push(handleSilkscreenPath(shape, index))\n } else if (shape.type === \"ARC\") {\n circuitElements.push(handleSilkscreenArc(shape, index))\n } else if (shape.type === \"TEXT\") {\n circuitElements.push(\n Soup.pcb_silkscreen_text.parse({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pcb_silkscreen_text_${index + 1}`,\n pcb_component_id: \"pcb_component_1\",\n text: shape.text,\n anchor_position: {\n x: mil2mm(shape.x),\n y: mil2mm(shape.y),\n },\n anchor_alignment: {\n L: \"bottom_left\",\n C: \"center\",\n R: \"bottom_right\",\n }[shape.textAnchor ?? \"L\"],\n font_size: shape.size_mm ? shape.size_mm : undefined,\n layer: \"top\",\n } as Soup.PcbSilkscreenTextInput),\n )\n }\n })\n\n // TODO Change pcb_component width & height\n\n // TODO compute pcb center based on all elements and transform elements such\n // that the center is (0,0)\n\n // Add 3d component\n const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(\n (a): a is z.infer<typeof SVGNodeSchema> =>\n Boolean(a.type === \"SVGNODE\" && a.svgData.attrs?.uuid),\n )\n const objFileUuid = svgNode?.svgData?.attrs?.uuid\n\n const objFileUrl = objFileUuid\n ? useModelCdn\n ? `https://modelcdn.tscircuit.com/easyeda_models/download?uuid=${objFileUuid}&pn=${easyEdaJson.lcsc.number}`\n : `https://modules.easyeda.com/3dmodel/${objFileUuid}`\n : undefined\n\n if (objFileUrl !== undefined) {\n const [rx, ry, rz] = (svgNode?.svgData.attrs?.c_rotation ?? \"0,0,0\")\n .split(\",\")\n .map(Number)\n circuitElements.push(\n Soup.cad_component.parse({\n type: \"cad_component\",\n cad_component_id: \"cad_component_1\",\n source_component_id: \"source_component_1\",\n pcb_component_id: \"pcb_component_1\",\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: rx, y: ry, z: rz },\n model_obj_url: objFileUrl,\n } as Soup.CadComponentInput),\n )\n }\n\n if (shouldRecenter) {\n const bounds = findBoundsAndCenter(\n // exclude the pcb_component because it's center is currently incorrect,\n // we set it to (0,0)\n circuitElements.filter((e) => e.type !== \"pcb_component\"),\n )\n const matrix = compose(\n translate(-bounds.center.x, bounds.center.y),\n scale(1, -1),\n )\n transformPCBElements(circuitElements, matrix)\n for (const e of circuitElements) {\n if (e.type === \"pcb_cutout\") {\n if (e.shape === \"polygon\") {\n e.points = e.points.map((p) => applyToPoint(matrix, p))\n } else {\n e.center = applyToPoint(matrix, e.center)\n }\n }\n }\n pcb_component.center = { x: 0, y: 0 }\n }\n\n return circuitElements\n}\n\n/** @deprecated Use `convertEasyEdaJsonToCircuitJson` instead. */\nexport const convertEasyEdaJsonToTscircuitSoupJson =\n convertEasyEdaJsonToCircuitJson\n","export interface Point {\n x: number\n y: number\n}\n\nexport function calculateCenter(start: Point, mid: Point, end: Point): Point {\n const mid1 = { x: (start.x + mid.x) / 2, y: (start.y + mid.y) / 2 }\n const mid2 = { x: (mid.x + end.x) / 2, y: (mid.y + end.y) / 2 }\n\n const slope1 = -(start.x - mid.x) / (start.y - mid.y)\n const slope2 = -(mid.x - end.x) / (mid.y - end.y)\n\n const centerX =\n (mid1.y - mid2.y + slope2 * mid2.x - slope1 * mid1.x) / (slope2 - slope1)\n const centerY = mid1.y + slope1 * (centerX - mid1.x)\n\n return { x: centerX, y: centerY }\n}\n\nfunction calculateRadius(center: Point, point: Point): number {\n return Math.sqrt((center.x - point.x) ** 2 + (center.y - point.y) ** 2)\n}\n\nfunction calculateAngle(center: Point, point: Point): number {\n return Math.atan2(point.y - center.y, point.x - center.x)\n}\n\nexport const getArcLength = (start: Point, mid: Point, end: Point) => {\n const center = calculateCenter(start, mid, end)\n const radius = calculateRadius(center, start)\n\n const angleStart = calculateAngle(center, start)\n const angleEnd = calculateAngle(center, end)\n\n let angleDelta = angleEnd - angleStart\n if (angleDelta < 0) {\n angleDelta += 2 * Math.PI\n }\n\n return radius * angleDelta\n}\n\nexport function generateArcPathWithMid(\n start: Point,\n mid: Point,\n end: Point,\n numPoints: number,\n): Point[] {\n const center = calculateCenter(start, mid, end)\n const radius = calculateRadius(center, start)\n\n const angleStart = calculateAngle(center, start)\n const angleEnd = calculateAngle(center, end)\n\n let angleDelta = angleEnd - angleStart\n if (angleDelta < 0) {\n angleDelta += 2 * Math.PI\n }\n\n const path: Point[] = []\n\n for (let i = 0; i <= numPoints; i++) {\n const angle = angleStart + (i / numPoints) * angleDelta\n const x = center.x + radius * Math.cos(angle)\n const y = center.y + radius * Math.sin(angle)\n // Check for NaN or Infinity values\n if (!isNaN(x) && isFinite(x) && !isNaN(y) && isFinite(y)) {\n path.push({ x, y })\n }\n }\n\n // If the path is empty, add the start and end points\n if (path.length === 0) {\n path.push(start, end)\n }\n\n return path\n}\n\n/**\nThis syntax describes an SVG path command for drawing an arc. Let's break down each part:\n\n1. \"M 3923.0512 2968.5197\": \n - M: Move to\n - 3923.0512: X-coordinate\n - 2968.5197: Y-coordinate\n\n2. \"A 2.5 2.5 0 0 0 3923.0512 2963.5197\":\n - A: Arc command\n - 2.5: X-radius of the ellipse\n - 2.5: Y-radius of the ellipse\n - 0: X-axis rotation (in degrees)\n - 0: Large arc flag (0 for small arc, 1 for large arc)\n - 0: Sweep flag (0 for counterclockwise, 1 for clockwise)\n - 3923.0512: End X-coordinate\n - 2963.5197: End Y-coordinate\n\nThis command draws an arc starting at (3923.0512, 2968.5197) and ending at (3923.0512, 2963.5197), using a circular path with a radius of 2.5 units.\n */\nexport function generateArcFromSweep(\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n radius: number,\n largeArcFlag: boolean,\n sweepFlag: boolean,\n): Point[] {\n const start: Point = { x: startX, y: startY }\n const end: Point = { x: endX, y: endY }\n\n // Calculate the midpoint between start and end\n const midX = (startX + endX) / 2\n const midY = (startY + endY) / 2\n\n // Calculate the distance between start and end\n const dx = endX - startX\n const dy = endY - startY\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n // If the distance is zero or the radius is too small, return a straight line\n if (distance === 0 || radius < distance / 2) {\n return [start, end]\n }\n\n // Calculate the center of the arc\n const h = Math.sqrt(radius * radius - (distance * distance) / 4)\n const angle = Math.atan2(dy, dx)\n const centerX = midX + h * Math.sin(angle) * (sweepFlag ? -1 : 1)\n const centerY = midY - h * Math.cos(angle) * (sweepFlag ? -1 : 1)\n\n // Calculate start and end angles\n const startAngle = Math.atan2(startY - centerY, startX - centerX)\n let endAngle = Math.atan2(endY - centerY, endX - centerX)\n\n // Adjust end angle based on sweep and large arc flags\n if (sweepFlag && endAngle > startAngle) {\n endAngle -= 2 * Math.PI\n } else if (!sweepFlag && endAngle < startAngle) {\n endAngle += 2 * Math.PI\n }\n\n if (\n (!largeArcFlag && Math.abs(endAngle - startAngle) > Math.PI) ||\n (largeArcFlag && Math.abs(endAngle - startAngle) < Math.PI)\n ) {\n if (endAngle > startAngle) {\n endAngle -= 2 * Math.PI\n } else {\n endAngle += 2 * Math.PI\n }\n }\n\n // Generate points along the arc\n const numPoints = Math.max(\n 2,\n Math.ceil(Math.abs(endAngle - startAngle) * radius),\n )\n const path: Point[] = []\n\n for (let i = 0; i <= numPoints; i++) {\n const t = i / numPoints\n const angle = startAngle + t * (endAngle - startAngle)\n const x = centerX + radius * Math.cos(angle)\n const y = centerY + radius * Math.sin(angle)\n path.push({ x, y })\n }\n\n return path\n}\n","/**\n * EasyEDA takes 10 mil as a basic factor, when a stroke width is 1, we can take it as 1*10mil = 10mil, is 2, we can take it as 2*10mil = 20mil,\n * Ref: https://docs.easyeda.com/en/DocumentFormat/3-EasyEDA-PCB-File-Format/#unit\n *\n * 1 mil = 0.001 inch\n * 1 inch = 25.4 mm\n * 1 mil = 25.4/1000 = 0.0254 mm\n */\nexport const mil10ToMm = (value: number): number => value * 10 * 0.0254\n","import type { RawEasyEdaJson } from \"../schemas/easy-eda-json-schema\"\n\nexport async function fetchEasyEDAComponent(\n jlcpcbPartNumber: string,\n { fetch = globalThis.fetch }: { fetch?: typeof globalThis.fetch } = {},\n): Promise<RawEasyEdaJson> {\n const searchUrl = \"https://easyeda.com/api/components/search\"\n const componentUrl = (uuid: string) =>\n `https://easyeda.com/api/components/${uuid}?version=6.4.7&uuid=${uuid}&datastrid=`\n\n const searchHeaders = {\n authority: \"easyeda.com\",\n pragma: \"no-cache\",\n \"cache-control\": \"no-cache\",\n accept: \"application/json, text/javascript, */*; q=0.01\",\n \"x-requested-with\": \"XMLHttpRequest\",\n \"user-agent\":\n \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36\",\n \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n origin: \"https://easyeda.com\",\n \"sec-fetch-site\": \"same-origin\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n referer: \"https://easyeda.com/editor\",\n \"accept-language\": \"cs,en;q=0.9,sk;q=0.8,en-GB;q=0.7\",\n cookie: \"<PUT your cookies here>\",\n }\n\n const searchData = `type=3&doctype%5B%5D=2&uid=0819f05c4eef4c71ace90d822a990e87&returnListStyle=classifyarr&wd=${jlcpcbPartNumber}&version=6.4.7`\n\n // Perform the search request\n const searchResponse = await fetch(searchUrl, {\n method: \"POST\",\n headers: searchHeaders,\n body: searchData,\n })\n\n if (!searchResponse.ok) {\n throw new Error(\"Failed to search for the component\")\n }\n\n const searchResult = await searchResponse.json()\n if (!searchResult.success || !searchResult.result.lists.lcsc.length) {\n throw new Error(\"Component not found\")\n }\n\n const bestMatchComponent =\n searchResult.result.lists.lcsc.find(\n (component: any) =>\n component.dataStr.head.c_para[\"Supplier Part\"] === jlcpcbPartNumber,\n ) ?? searchResult.result.lists.lcsc[0]\n\n const componentUUID = bestMatchComponent.uuid\n\n // Perform the component fetch request\n const componentResponse = await fetch(componentUrl(componentUUID), {\n method: \"GET\",\n headers: {\n ...searchHeaders,\n referer: `https://easyeda.com/editor?uuid=${componentUUID}`,\n },\n })\n\n if (!componentResponse.ok) {\n throw new Error(\"Failed to fetch the component details\")\n }\n\n const componentResult = await componentResponse.json()\n return componentResult.result\n}\n\n// Usage example\n// fetchEasyEDAComponent(\"C558438\")\n// .then((component) => console.log(component))\n// .catch((error) => console.error(error))\n","import { z } from \"zod\"\nimport {\n PackageDetailShapeSchema,\n ShapeItemSchema,\n} from \"./package-detail-shape-schema\"\nimport { SingleLetterShapeSchema } from \"./single-letter-shape-schema\"\n\nexport const maybeNumber = z\n .any()\n .transform((k) => (k === \"nan\" || Number.isNaN(k) ? null : k))\n .pipe(z.number().nullable().optional())\n\nexport const SzlcscSchema = z.object({\n id: z.number(),\n number: z.string(),\n step: z.number().optional(),\n min: z.number().optional(),\n price: z.number().optional(),\n stock: z.number().optional(),\n url: z.string().url().optional(),\n image: z.string().optional().optional(),\n})\n\nexport const LcscSchema = z.object({\n id: z.number(),\n number: z.string(),\n step: z.number().optional(),\n min: z.number().optional(),\n price: z.number().optional(),\n stock: z.number().optional(),\n url: z.string().url().optional(),\n})\n\nexport const OwnerSchema = z.object({\n uuid: z.string(),\n username: z.string(),\n nickname: z.string(),\n avatar: z.string(),\n})\n\nexport const HeadSchema = z.object({\n docType: z.preprocess((val) => (val == null ? val : String(val)), z.string()),\n editorVersion: z.string(),\n c_para: z.record(z.string(), z.string().nullable()),\n x: z.number(),\n y: z.number(),\n puuid: z.string().optional(),\n uuid: z.string(),\n utime: z.preprocess((val) => {\n if (val === \"\") return 0\n if (typeof val === \"string\") return Number(val)\n return val\n }, z.number()),\n importFlag: z.number().optional(),\n c_spiceCmd: z.any().optional(),\n hasIdFlag: z.boolean(),\n})\n\nexport const BBoxSchema = z.object({\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n})\n\nexport const LayerItemSchema = z.object({\n name: z.string(),\n color: z.string(),\n visible: z.boolean(),\n active: z.boolean(),\n config: z.boolean(),\n transparency: z.boolean(),\n})\n\nexport const ObjectItemSchema = z.object({\n name: z.string(),\n visible: z.boolean(),\n locked: z.boolean(),\n})\n\nexport const DataStrSchema = z.object({\n head: HeadSchema,\n canvas: z.string(),\n shape: z.array(SingleLetterShapeSchema),\n BBox: BBoxSchema,\n colors: z.array(z.unknown()),\n})\n\nexport const PackageDetailDataStrSchema = z.object({\n head: HeadSchema,\n canvas: z.string(),\n shape: z\n .array(z.string())\n .transform((shapes) =>\n shapes.map((shape) => {\n const [type, ...data] = shape.split(\"~\")\n return ShapeItemSchema.parse({ type, data: data.join(\"~\") })\n }),\n )\n .pipe(z.array(PackageDetailShapeSchema)),\n layers: z.array(z.string()).transform((layers) =>\n layers.map((layer) => {\n const [name, color, visible, active, config, transparency] =\n layer.split(\"~\")\n return LayerItemSchema.parse({\n name,\n color,\n visible: visible === \"true\",\n active: active === \"true\",\n config: config === \"true\",\n transparency: transparency === \"true\",\n })\n }),\n ),\n objects: z.array(z.string()).transform((objects) =>\n objects.map((obj) => {\n const [name, visible, locked] = obj.split(\"~\")\n return ObjectItemSchema.parse({\n name,\n visible: visible === \"true\",\n locked: locked === \"true\",\n })\n }),\n ),\n BBox: BBoxSchema,\n netColors: z.array(z.unknown()).optional(),\n})\n\nexport const PackageDetailSchema = z.object({\n uuid: z.string(),\n title: z.string(),\n docType: z.number(),\n updateTime: z.number(),\n owner: OwnerSchema,\n datastrid: z.string(),\n writable: z.boolean(),\n dataStr: PackageDetailDataStrSchema,\n})\n\nexport const EasyEdaJsonSchema = z.object({\n uuid: z.string(),\n title: z.string(),\n description: z.string(),\n docType: z.number(),\n type: z.number(),\n szlcsc: SzlcscSchema,\n lcsc: LcscSchema,\n owner: OwnerSchema,\n tags: z.array(z.string()),\n updateTime: z.number(),\n updated_at: z.string(),\n dataStr: DataStrSchema,\n verify: z.boolean(),\n SMT: z.boolean().optional(),\n datastrid: z.string(),\n jlcOnSale: z.number().optional(),\n writable: z.boolean(),\n isFavorite: z.boolean(),\n packageDetail: PackageDetailSchema,\n})\n\nexport type RawEasyEdaJson = z.input<typeof EasyEdaJsonSchema>\nexport type BetterEasyEdaJson = z.infer<typeof EasyEdaJsonSchema>\n","import { z } from \"zod\"\n\nconst tenthmil = z\n .union([z.number(), z.string()])\n .optional()\n .transform((n) =>\n typeof n === \"string\" && n.endsWith(\"mil\")\n ? n\n : `${Number.parseFloat(n as string) * 10}mil`,\n )\n .pipe(z.string())\n\nexport const PointSchema = z\n .any()\n .transform((p) => {\n if (Array.isArray(p)) {\n const [x, y] = p\n return { x, y }\n }\n if (typeof p === \"object\") {\n return p\n }\n throw new Error(`Invalid point: ${p}`)\n })\n .pipe(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n )\n\nexport const BaseShapeSchema = z.object({\n type: z.string(),\n id: z.string().optional(),\n layer: z.coerce.number().optional(),\n})\n\nexport const TrackSchema = BaseShapeSchema.extend({\n type: z.literal(\"TRACK\"),\n width: z.coerce.number(),\n points: z.array(PointSchema),\n})\n\nexport const PadSchema = BaseShapeSchema.extend({\n type: z.literal(\"PAD\"),\n shape: z.enum([\"RECT\", \"ELLIPSE\", \"OVAL\"]),\n center: z.object({\n x: tenthmil,\n y: tenthmil,\n }),\n width: tenthmil,\n height: tenthmil,\n layermask: z.number(),\n net: z.union([z.string(), z.number()]).optional(),\n number: z.union([z.string(), z.number()]),\n holeRadius: tenthmil,\n points: z.array(PointSchema).optional(),\n rotation: z.number().optional(),\n plated: z.boolean(),\n})\n\n// TODO this should be in \"arc sweep\" format with the following fields:\n// start, end, radius, largeArc, sweepDirection\nexport const ArcSchema = BaseShapeSchema.extend({\n type: z.literal(\"ARC\"),\n width: z.number(),\n start: PointSchema,\n end: PointSchema,\n radiusX: z.number(),\n radiusY: z.number(),\n largeArc: z.boolean(),\n sweepDirection: z.enum([\"CW\", \"CCW\"]),\n})\n\nexport const CircleSchema = BaseShapeSchema.extend({\n type: z.literal(\"CIRCLE\"),\n center: PointSchema,\n radius: z.number(),\n width: z.number(),\n})\n\nexport const SolidRegionSchema = BaseShapeSchema.extend({\n type: z.literal(\"SOLIDREGION\"),\n layermask: z.number(),\n points: z.array(PointSchema),\n fillStyle: z.string(),\n})\n\nexport const SVGNodeSchema = BaseShapeSchema.extend({\n type: z.literal(\"SVGNODE\"),\n svgData: z.object({\n gId: z.string(),\n nodeName: z.string(),\n nodeType: z.number(),\n layerid: z.string(),\n attrs: z.record(z.string(), z.string()),\n childNodes: z.array(z.unknown()),\n }),\n})\n\n// e.g. \"HOLE~3999.449~3004.213~1.378~gge152~0\"\nexport const HoleSchema = BaseShapeSchema.extend({\n type: z.literal(\"HOLE\"),\n center: PointSchema,\n radius: z.number(),\n})\n\nexport const ViaSchema = BaseShapeSchema.extend({\n type: z.literal(\"VIA\"),\n center: PointSchema,\n outerDiameter: z.number(),\n holeDiameter: z.number(),\n})\n\nexport const RectSchema = BaseShapeSchema.extend({\n type: z.literal(\"RECT\"),\n x: tenthmil,\n y: tenthmil,\n width: tenthmil,\n height: tenthmil,\n lineWidth: z.number(),\n fillStyle: z.string(),\n rotation: z.number().optional(),\n})\n\nexport const TextSchema = BaseShapeSchema.extend({\n type: z.literal(\"TEXT\"),\n text: z.string(),\n x: tenthmil,\n y: tenthmil,\n size_mm: z.number(),\n rotation: z.number().optional(),\n layer: z.number().optional(),\n textAnchor: z\n .enum([\"L\", \"C\", \"R\", \"\"])\n .optional()\n .transform((val) => (val === \"\" ? undefined : val)),\n font: z.string().optional(),\n})\n\nexport const PackageDetailShapeSchema = z.discriminatedUnion(\"type\", [\n TrackSchema,\n PadSchema,\n ArcSchema,\n CircleSchema,\n SolidRegionSchema,\n SVGNodeSchema,\n HoleSchema,\n ViaSchema,\n RectSchema,\n TextSchema,\n])\n\nconst pairs = <T>(arr: T[]): [T, T][] => {\n const pairs: [T, T][] = []\n for (let i = 0; i < arr.length; i += 2) {\n pairs.push([arr[i], arr[i + 1]])\n }\n return pairs\n}\n\nconst parsePoints = (pointsStr: string): number[][] =>\n pairs(\n pointsStr\n .trim()\n .split(\" \")\n .map((n) => Number(n)),\n )\n\nexport const ShapeItemSchema = z\n .object({\n type: z.string(),\n data: z.string(),\n })\n .transform((shape) => {\n switch (shape.type) {\n case \"TRACK\": {\n const [width, layer, _, pointsStr, id, _n] = shape.data.split(\"~\")\n const points = parsePoints(pointsStr)\n return TrackSchema.parse({ type: \"TRACK\", width, layer, points, id })\n }\n case \"PAD\": {\n const [padShape, ...params] = shape.data.split(\"~\")\n const [\n centerX,\n centerY,\n width,\n height,\n layermask,\n net,\n number,\n holeRadius,\n ...rest\n ] = params.map((p) => (Number.isNaN(Number(p)) ? p : Number(p)))\n const center = { x: centerX, y: centerY }\n let points: number[][] | undefined\n\n if (padShape === \"RECT\") {\n points = parsePoints(rest[0] as any)\n }\n\n // Extract rotation for all pad types from position 11 (rest[1])\n const r = Number(rest[1])\n const rotation = Number.isNaN(r) ? undefined : r\n\n const padInputParams = {\n type: \"PAD\",\n shape: padShape,\n center,\n width,\n height,\n layermask,\n net,\n number,\n holeRadius,\n points,\n rotation,\n plated: rest.includes(\"Y\"),\n }\n const pad = PadSchema.parse(padInputParams)\n return pad\n }\n case \"ARC\": {\n const [width, layer, , arcData] = shape.data.split(\"~\")\n // A rx ry x-axis-rotation large-arc-flag sweep-flag x y\n // A rx ry x-axis-rotation large-arc-flag sweep-flag dx dy\n const match = arcData.match(\n /M\\s*([\\d.-]+)(?:\\s*,\\s*|\\s+)([\\d.-]+)\\s*A\\s*([\\d.-]+)(?:\\s*,\\s*|\\s+)([\\d.-]+)\\s*([\\d.-]+)\\s*([\\d.-]+)\\s*([\\d.-]+)\\s*([\\d.-]+)(?:\\s*,\\s*|\\s+)([\\d.-]+)/,\n )\n\n if (!match) {\n throw new Error(`Invalid arc data: ${arcData}`)\n }\n\n const [\n ,\n startX,\n startY,\n radiusX,\n radiusY,\n xAxisRotation,\n largeArcFlag,\n sweepFlag,\n endX,\n endY,\n ] = match\n const start: [number, number] = [Number(startX), Number(startY)]\n const end: [number, number] = [Number(endX), Number(endY)]\n return ArcSchema.parse({\n type: \"ARC\",\n width: Number(width),\n layer: Number(layer),\n start,\n end,\n radiusX: Number(radiusX),\n radiusY: Number(radiusY),\n largeArc: largeArcFlag === \"1\",\n // sweepFlag=1 means clockwise (CW), sweepFlag=0 means counter-clockwise (CCW)\n sweepDirection: sweepFlag === \"1\" ? \"CW\" : \"CCW\",\n })\n }\n case \"CIRCLE\": {\n const [centerX, centerY, radius, width, layer, id] =\n shape.data.split(\"~\")\n const center: [number, number] = [Number(centerX), Number(centerY)]\n return CircleSchema.parse({\n type: \"CIRCLE\",\n center,\n radius: Number(radius),\n width: Number(width),\n layer: Number(layer),\n id,\n })\n }\n case \"HOLE\": {\n const [centerX, centerY, radius, id] = shape.data.split(\"~\")\n const center: [number, number] = [Number(centerX), Number(centerY)]\n return HoleSchema.parse({\n type: \"HOLE\",\n center,\n radius: Number(radius),\n id,\n })\n }\n case \"VIA\": {\n const [x, y, outerDiameter, , holeDiameter, id] = shape.data.split(\"~\")\n const center: [number, number] = [Number(x), Number(y)]\n return ViaSchema.parse({\n type: \"VIA\",\n center,\n outerDiameter: Number(outerDiameter),\n holeDiameter: Number(holeDiameter),\n id,\n })\n }\n case \"SOLIDREGION\": {\n const [layermask, , pathData, fillStyle, id] = shape.data.split(\"~\")\n const points =\n pathData.match(/[ML] ?(-?[\\d.]+)[ ,](-?[\\d.]+)/g)?.map((point) => {\n const [, x, y] =\n point.match(/[ML]? ?(-?[\\d.]+)[ ,](-?[\\d.]+)/) || []\n return [Number(x), Number(y)]\n }) || []\n return SolidRegionSchema.parse({\n type: \"SOLIDREGION\",\n layermask: Number(layermask),\n points,\n fillStyle,\n id,\n })\n }\n case \"SVGNODE\": {\n const svgData = JSON.parse(shape.data)\n return SVGNodeSchema.parse({ type: \"SVGNODE\", svgData })\n }\n case \"RECT\": {\n const [x, y, width, height, lineWidth, id, rotation, layer, fillStyle] =\n shape.data.split(\"~\")\n const r = rotation ? Number(rotation) : undefined\n return RectSchema.parse({\n type: \"RECT\",\n x,\n y,\n width,\n height,\n lineWidth: Number(lineWidth),\n id,\n rotation: Number.isNaN(r as number) ? undefined : r,\n layer: layer ? Number(layer) : undefined,\n fillStyle: fillStyle || undefined,\n })\n }\n case \"TEXT\": {\n const [textAnchor, x, y, size, layer, id, rotation, , font, text] =\n shape.data.split(\"~\")\n const r = rotation ? Number(rotation) : undefined\n return TextSchema.parse({\n type: \"TEXT\",\n text,\n x,\n y,\n size_mm: Number(size) * 2.54, // empirically this seems to match, C5248081 is a good test case\n layer: layer ? Number(layer) : undefined,\n id,\n rotation: Number.isNaN(r as number) ? undefined : r,\n textAnchor: textAnchor as \"L\" | \"C\" | \"R\" | undefined,\n font: font || undefined,\n })\n }\n\n default:\n throw new Error(`Unknown shape type: ${shape.type}`)\n }\n })\n .pipe(PackageDetailShapeSchema)\n\nexport const ShapesArraySchema = z.array(ShapeItemSchema)\n","import { z } from \"zod\"\nimport { mil10ToMm } from \"lib/utils/easyeda-unit-to-mm\"\n\n/**\n I'll break down the elements in the `dataStr.head.shape` array and explain what they represent. This array contains instructions for drawing the schematic symbol of the component.\n1. `\"R~365~275~2~2~70~50~#880000~1~0~none~gge1~0~\"`\n This represents a rectangle:\n - Starting position: (365, 275)\n - Width: 70\n - Height: 50\n - Color: #880000 (dark red)\n - Line width: 1\n - Other parameters are for internal use\n2. `\"E~370~280~1.5~1.5~#880000~1~0~#880000~gge2~0\"`\n This draws an ellipse:\n - Center: (370, 280)\n - Radius X: 1.5\n - Radius Y: 1.5\n - Color: #880000 (dark red)\n - Line width: 1\n3-10. `\"P~show~0~1~355~285~180~gge5~0^^355~285^^M355,285h10~#000000^^1~368.7~289~0~GND~start~~~#000000^^1~364.5~284~0~1~end~~~#000000^^0~362~285^^0~M 365 288 L 368 285 L 365 282\"`\n These represent pins of the component. Each pin has:\n - Pin number\n - Position\n - Orientation\n - Label (e.g., GND, TRIG, OUT)\n - Color\n - Drawing instructions for the pin shape\n4. `\"A~M x1 y1 A radius radius 0 1 0 x2 y2\"`\n This represents an arc:\n - Start point: (x1, y1)\n - End point: (x2, y2)\n - Radius\n - Direction (CW or CCW)\n - Color\n - Line width\n - ID\nTo parse this data:\n1. Split the string by `~` to get individual parameters.\n2. For rectangles (R), use parameters 2-7 for position, size, and color.\n3. For ellipses (E), use parameters 2-5 for position and size, and 6 for color.\n4. For pins (P), split further by `^^` to get different sections:\n - First section: general pin properties\n - Second section: pin position\n - Third section: line drawing instruction\n - Fourth and Fifth sections: label position and text\n - Sixth section: additional drawing instruction for pin shape\n5. For arcs (A), split by `~M ` to get the path data.\n - Format: A~M x1 y1 A radius radius 0 1 0 x2 y2\n - Parse the start and end points, radius, direction, color, line width, and ID.\nThis data structure allows for a compact representation of the schematic symbol, which can be rendered by CAD software to display the component in circuit diagrams.\n */\n// Examples\n// \"R~365~275~2~2~70~50~#880000~1~0~none~gge1~0~\",\n// \"E~370~280~1.5~1.5~#880000~1~0~#880000~gge2~0\",\n// \"P~show~0~1~355~285~180~gge5~0^^355~285^^M355,285h10~#000000^^1~368.7~289~0~GND~start~~~#000000^^1~364.5~284~0~1~end~~~#000000^^0~362~285^^0~M 365 288 L 368 285 L 365 282\",\n// \"P~show~0~2~355~295~180~gge6~0^^355~295^^M355,295h10~#880000^^1~368.7~299~0~TRIG~start~~~#0000FF^^1~364.5~294~0~2~end~~~#0000FF^^0~362~295^^0~M 365 298 L 368 295 L 365 292\",\n// \"P~show~0~3~355~305~180~gge7~0^^355~305^^M355,305h10~#880000^^1~368.7~309~0~OUT~start~~~#0000FF^^1~364.5~304~0~3~end~~~#0000FF^^0~362~305^^0~M 365 308 L 368 305 L 365 302\",\n// \"P~show~0~4~355~315~180~gge8~0^^355~315^^M355,315h10~#880000^^1~368.7~319~0~RESET~start~~~#0000FF^^1~364.5~314~0~4~end~~~#0000FF^^0~362~315^^0~M 365 318 L 368 315 L 365 312\",\n// \"P~show~0~5~445~315~0~gge9~0^^445~315^^M445,315h-10~#880000^^1~431.3~319~0~CONT~end~~~#0000FF^^1~435.5~314~0~5~start~~~#0000FF^^0~438~315^^0~M 435 312 L 432 315 L 435 318\",\n// \"P~show~0~6~445~305~0~gge10~0^^445~305^^M445,305h-10~#880000^^1~431.3~309~0~THRES~end~~~#0000FF^^1~435.5~304~0~6~start~~~#0000FF^^0~438~305^^0~M 435 302 L 432 305 L 435 308\",\n// \"P~show~0~7~445~295~0~gge11~0^^445~295^^M445,295h-10~#880000^^1~431.3~299~0~DISCH~end~~~#0000FF^^1~435.5~294~0~7~start~~~#0000FF^^0~438~295^^0~M 435 292 L 432 295 L 435 298\",\n// \"P~show~0~8~445~285~0~gge12~0^^445~285^^M445,285h-10~#FF0000^^1~431.3~289~0~VCC~end~~~#FF0000^^1~435.5~284~0~8~start~~~#FF0000^^0~438~285^^0~M 435 282 L 432 285 L 435 288\",\n// \"A~M x1 y1 A radius radius 0 1 0 x2 y2\"\n\nconst PointSchema = z.object({\n x: z.number(),\n y: z.number(),\n})\n\nconst RectangleShapeOutputSchema = z.object({\n type: z.literal(\"RECTANGLE\"),\n position: PointSchema,\n width: z.number(),\n height: z.number(),\n color: z.string(),\n lineWidth: z.number(),\n id: z.string(),\n})\n\nconst parseRectangle = (\n str: string,\n): z.infer<typeof RectangleShapeOutputSchema> => {\n const [, x, y, , , width, height, color, lineWidth, , , id] = str.split(\"~\")\n return {\n type: \"RECTANGLE\",\n position: { x: Number(x), y: Number(y) },\n width: Number(width),\n height: Number(height),\n color,\n lineWidth: Number(lineWidth),\n id,\n }\n}\n\nexport const RectangleShapeSchema = z\n .string()\n .startsWith(\"R~\")\n .transform(parseRectangle)\n .pipe(RectangleShapeOutputSchema)\n\nconst EllipseShapeOutputSchema = z.object({\n type: z.literal(\"ELLIPSE\"),\n center: PointSchema,\n radiusX: z.number(),\n radiusY: z.number(),\n color: z.string(),\n lineWidth: z.number(),\n id: z.string(),\n})\n\nconst parseEllipse = (\n str: string,\n): z.infer<typeof EllipseShapeOutputSchema> => {\n const [, x, y, radiusX, radiusY, color, lineWidth, , , id] = str.split(\"~\")\n return {\n type: \"ELLIPSE\",\n center: { x: Number(x), y: Number(y) },\n radiusX: Number(radiusX),\n radiusY: Number(radiusY),\n color,\n lineWidth: Number(lineWidth),\n id,\n }\n}\n\nexport const EllipseShapeSchema = z\n .string()\n .startsWith(\"E~\")\n .transform(parseEllipse)\n .pipe(EllipseShapeOutputSchema)\n\nconst ArcShapeOutputSchema = z.object({\n type: z.literal(\"ARC\"),\n start: PointSchema,\n end: PointSchema,\n radius: z.number(),\n sweepFlag: z.boolean(),\n color: z.string(),\n lineWidth: z.number(),\n id: z.string(),\n})\n\nconst parseArc = (str: string): z.infer<typeof ArcShapeOutputSchema> => {\n // Format: A~M x1 y1 A radius radius 0 1 0 x2 y2~#880000~1~0~none~gge49~0\n const [, pathData, color, lineWidth, , , id] = str.split(\"~\")\n const parts = pathData.split(\" \")\n\n // Handle potential NaN values by defaulting to 0\n const x1 = Number(parts[1]) || 0\n const y1 = Number(parts[2]) || 0\n const radius = Number(parts[4]) || 0\n const sweepFlag = parts[7] === \"1\" // The sweep flag is the 8th parameter\n const x2 = Number(parts[8]) || 0\n const y2 = Number(parts[9]) || 0\n\n // Handle empty or invalid line width\n const parsedLineWidth = Number(lineWidth)\n const finalLineWidth = Number.isNaN(parsedLineWidth) ? 1 : parsedLineWidth\n\n return {\n type: \"ARC\",\n start: { x: x1, y: y1 },\n end: { x: x2, y: y2 },\n radius,\n sweepFlag,\n color: color || \"#880000\", // Default color\n lineWidth: finalLineWidth,\n id: id || \"gge1\",\n }\n}\n\nexport const ArcShapeSchema = z\n .string()\n .startsWith(\"A~\")\n .transform(parseArc)\n .pipe(ArcShapeOutputSchema)\n\nconst PinShapeOutputSchema = z.object({\n type: z.literal(\"PIN\"),\n visibility: z.enum([\"show\", \"hide\"]),\n pinNumber: z.union([z.string(), z.number()]),\n x: z.number(),\n y: z.number(),\n rotation: z.number(),\n id: z.string(),\n label: z.string(),\n labelColor: z.string(),\n path: z.string(),\n arrow: z.string(),\n})\n\nconst parsePin = (pinString: string): z.infer<typeof PinShapeOutputSchema> => {\n const parts = pinString.split(\"~\")\n const [, visibility, , pinNumber, x, y, rotation, id] = parts\n\n const nameMatch = pinString.match(/~(\\w+)~(start|end)~/)\n const label = nameMatch ? nameMatch[1] : \"\"\n\n const colorMatch = pinString.match(/#[0-9A-F]{6}/)\n const labelColor = colorMatch ? colorMatch[0] : \"\"\n\n const pathMatch = pinString.match(/\\^\\^([^~]+)/)\n const path = pathMatch ? pathMatch[1] : \"\"\n\n const arrowMatch = pinString.match(/\\^\\^0~(.+)$/)\n const arrow = arrowMatch ? arrowMatch[1] : \"\"\n\n const r = Number.parseFloat(rotation)\n return {\n type: \"PIN\",\n visibility: visibility as \"show\" | \"hide\",\n id,\n pinNumber: Number.isNaN(Number(pinNumber)) ? pinNumber : Number(pinNumber),\n x: Number.parseFloat(x),\n y: Number.parseFloat(y),\n rotation: Number.isNaN(r) ? 0 : r,\n label,\n labelColor,\n path,\n arrow,\n }\n}\n\nexport const PinShapeSchema = z\n .string()\n .startsWith(\"P~\")\n .transform(parsePin)\n .pipe(PinShapeOutputSchema)\n\nconst PolylineShapeOutputSchema = z.object({\n type: z.literal(\"POLYLINE\"),\n points: z.array(PointSchema),\n color: z.string(),\n lineWidth: z.number(),\n id: z.string(),\n})\n\nconst parsePoints = (pointsStr: string): Array<{ x: number; y: number }> => {\n return pointsStr\n .split(\" \")\n .reduce<Array<{ x: number; y: number }>>((acc, value, index) => {\n if (index % 2 === 0) {\n acc.push({ x: Number(value), y: 0 })\n } else {\n acc[acc.length - 1].y = Number(value)\n }\n return acc\n }, [])\n}\n\nconst parsePolyline = (\n str: string,\n): z.infer<typeof PolylineShapeOutputSchema> => {\n const [, ...rest] = str.split(\"~\")\n const [pointsStr, color, lineWidth, , , id] = rest\n\n return {\n type: \"POLYLINE\",\n points: parsePoints(pointsStr),\n color,\n lineWidth: Number(lineWidth),\n id,\n }\n}\n\nexport const PolylineShapeSchema = z\n .string()\n .startsWith(\"PL~\")\n .transform(parsePolyline)\n .pipe(PolylineShapeOutputSchema)\n\nconst PolygonShapeOutputSchema = z.object({\n type: z.literal(\"POLYGON\"),\n points: z.array(PointSchema),\n fillColor: z.string(),\n lineWidth: z.number(),\n lineColor: z.string(),\n id: z.string(),\n})\n\nconst parsePolygon = (\n str: string,\n): z.infer<typeof PolygonShapeOutputSchema> => {\n const [, ...rest] = str.split(\"~\")\n const [pointsStr, fillColor, lineWidth, lineColor, , id] = rest\n\n return {\n type: \"POLYGON\",\n points: parsePoints(pointsStr),\n fillColor,\n lineWidth: Number(lineWidth),\n lineColor,\n id,\n }\n}\n\nexport const PolygonShapeSchema = z\n .string()\n .startsWith(\"PG~\")\n .transform(parsePolygon)\n .pipe(PolygonShapeOutputSchema)\n\nconst PathShapeOutputSchema = z.object({\n type: z.literal(\"PATH\"),\n pathData: z.string(),\n fillColor: z.string(),\n strokeWidth: z.number(),\n strokeColor: z.string(),\n id: z.string(),\n})\n\nconst parsePath = (str: string): z.infer<typeof PathShapeOutputSchema> => {\n const [, pathData, fillColor, strokeWidth, strokeColor, , id] = str.split(\"~\")\n return {\n type: \"PATH\",\n pathData,\n fillColor,\n strokeWidth: mil10ToMm(Number(strokeWidth)),\n strokeColor,\n id,\n }\n}\n\nexport const PathShapeSchema = z\n .string()\n .startsWith(\"PT~\")\n .transform(parsePath)\n .pipe(PathShapeOutputSchema)\n\nconst TextShapeOutputSchema = z.object({\n type: z.literal(\"TEXT\"),\n alignment: z.enum([\"L\", \"C\", \"R\"]),\n x: z.number(),\n y: z.number(),\n rotation: z.number(),\n fontColor: z.string(),\n backgroundColor: z.string().optional(),\n fontSize: z.string(),\n fontWeight: z.enum([\"normal\", \"bold\"]).optional().default(\"normal\"),\n fontStyle: z.enum([\"normal\", \"italic\"]).optional().default(\"normal\"),\n fontDecoration: z.enum([\"\", \"underline\"]),\n content: z.string(),\n textType: z.string(),\n visibility: z.enum([\"0\", \"1\"]),\n mirror: z.string(),\n id: z.string(),\n})\n\nconst parseText = (str: string): z.infer<typeof TextShapeOutputSchema> => {\n const [\n ,\n alignment,\n x,\n y,\n rotation,\n fontColor,\n backgroundColor,\n fontSize,\n fontWeight,\n fontStyle,\n fontDecoration,\n content,\n textType,\n visibility,\n mirror,\n id,\n ] = str.split(\"~\")\n return {\n type: \"TEXT\",\n alignment: alignment as \"L\" | \"C\" | \"R\",\n x: Number(x),\n y: Number(y),\n rotation: Number(rotation),\n fontColor,\n backgroundColor: backgroundColor || undefined,\n fontSize,\n fontWeight: (fontWeight || \"normal\") as \"normal\" | \"bold\",\n fontStyle: (fontStyle || \"normal\") as \"normal\" | \"italic\",\n fontDecoration: fontDecoration as \"\" | \"underline\",\n content,\n textType,\n visibility: visibility as \"0\" | \"1\",\n mirror,\n id,\n }\n}\n\nexport const TextShapeSchema = z\n .string()\n .startsWith(\"T~\")\n .transform(parseText)\n .pipe(TextShapeOutputSchema)\n\nexport const SingleLetterShapeSchema = z\n .string()\n .transform((x) => {\n // We do some discrimination here for better errors\n if (x.startsWith(\"R~\")) return RectangleShapeSchema.parse(x)\n if (x.startsWith(\"E~\")) return EllipseShapeSchema.parse(x)\n if (x.startsWith(\"P~\")) return PinShapeSchema.parse(x)\n if (x.startsWith(\"PL~\")) return PolylineShapeSchema.parse(x)\n if (x.startsWith(\"PG~\")) return PolygonShapeSchema.parse(x)\n if (x.startsWith(\"PT~\")) return PathShapeSchema.parse(x)\n if (x.startsWith(\"T~\")) return TextShapeSchema.parse(x)\n if (x.startsWith(\"A~\")) return ArcShapeSchema.parse(x)\n throw new Error(`Invalid shape type: ${x}`)\n })\n .pipe(\n z.union([\n RectangleShapeOutputSchema,\n EllipseShapeOutputSchema,\n PinShapeOutputSchema,\n PolylineShapeOutputSchema,\n PolygonShapeOutputSchema,\n PathShapeOutputSchema,\n TextShapeOutputSchema,\n ArcShapeOutputSchema,\n ]),\n )\n\nexport type SingleLetterShape = z.infer<typeof SingleLetterShapeSchema>\n","import {\n EasyEdaJsonSchema,\n type BetterEasyEdaJson,\n} from \"lib/schemas/easy-eda-json-schema\"\nimport { su } from \"@tscircuit/circuit-json-util\"\nimport { generateTypescriptComponent } from \"./generate-typescript-component\"\nimport { convertEasyEdaJsonToCircuitJson } from \"lib/convert-easyeda-json-to-tscircuit-soup-json\"\nimport { normalizeManufacturerPartNumber } from \"lib/utils/normalize-manufacturer-part-number\"\n\nexport const convertRawEasyToTsx = async (rawEasy: any) => {\n const betterEasy = EasyEdaJsonSchema.parse(rawEasy)\n const result = await convertBetterEasyToTsx({\n betterEasy,\n })\n return result\n}\n\nexport const convertBetterEasyToTsx = async ({\n betterEasy,\n}: {\n betterEasy: BetterEasyEdaJson\n}): Promise<string> => {\n const circuitJson = convertEasyEdaJsonToCircuitJson(betterEasy, {\n useModelCdn: true,\n shouldRecenter: true,\n })\n const rawPn = betterEasy.dataStr.head.c_para[\"Manufacturer Part\"]\n const pn = rawPn ? normalizeManufacturerPartNumber(rawPn) : \"unknown\"\n const sourcePorts = su(circuitJson).source_port.list()\n\n const pinLabels: Record<string, string[]> = {}\n const sortedPorts = sourcePorts.sort((a, b) => {\n const aNum = Number.parseInt(a.name.replace(\"pin\", \"\"))\n const bNum = Number.parseInt(b.name.replace(\"pin\", \"\"))\n return aNum - bNum\n })\n for (const sourcePort of sortedPorts) {\n pinLabels[sourcePort.name] = [\n sourcePort.name,\n ...(sourcePort.port_hints ?? []),\n ]\n }\n\n const [cadComponent] = su(circuitJson).cad_component.list()\n let modelObjUrl: string | undefined\n if (cadComponent?.model_obj_url) {\n const isValidUrl = await checkModelObjUrlValidity(\n cadComponent.model_obj_url,\n )\n if (isValidUrl) {\n modelObjUrl = cadComponent.model_obj_url\n }\n }\n\n const supplierPartNumbers: Record<string, string[]> = {\n jlcpcb: [betterEasy.lcsc.number],\n }\n\n return generateTypescriptComponent({\n componentName: pn,\n manufacturerPartNumber: pn,\n pinLabels,\n\n objUrl: modelObjUrl,\n circuitJson,\n supplierPartNumbers,\n })\n}\n\nconst checkModelObjUrlValidity = async (url: string): Promise<boolean> => {\n try {\n const response = await fetch(url, { method: \"HEAD\" })\n return response.status === 200\n } catch (error) {\n console.error(`Error checking model object URL ${url}:`, error)\n return false\n }\n}\n","import { mmStr } from \"@tscircuit/mm\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport { su } from \"@tscircuit/circuit-json-util\"\n\nexport const generateFootprintTsx = (\n circuitJson: AnyCircuitElement[],\n): string => {\n const holes = su(circuitJson).pcb_hole.list()\n const platedHoles = su(circuitJson).pcb_plated_hole.list()\n const smtPads = su(circuitJson).pcb_smtpad.list()\n const vias = su(circuitJson).pcb_via.list()\n const silkscreenPaths = su(circuitJson).pcb_silkscreen_path.list()\n const silkscreenTexts = su(circuitJson).pcb_silkscreen_text.list()\n\n const elementStrings: string[] = []\n\n for (const hole of holes) {\n if (hole.hole_shape === \"circle\") {\n elementStrings.push(\n `<hole pcbX=\"${mmStr(hole.x)}\" pcbY=\"${mmStr(hole.y)}\" diameter=\"${mmStr(hole.hole_diameter)}\" />`,\n )\n } else if (hole.hole_shape === \"oval\") {\n console.warn(\"Unhandled oval hole in conversion (needs implementation)\")\n }\n }\n\n for (const platedHole of platedHoles) {\n if (platedHole.shape === \"oval\" || platedHole.shape === \"pill\") {\n elementStrings.push(\n `<platedhole portHints={${JSON.stringify(platedHole.port_hints)}} pcbX=\"${mmStr(platedHole.x)}\" pcbY=\"${mmStr(platedHole.y)}\" outerHeight=\"${mmStr(platedHole.outer_height)}\" outerWidth=\"${mmStr(platedHole.outer_width)}\" holeHeight=\"${mmStr(platedHole.hole_height)}\" holeWidth=\"${mmStr(platedHole.hole_width)}\" shape=\"${platedHole.shape}\" />`,\n )\n } else if (platedHole.shape === \"circle\") {\n elementStrings.push(\n `<platedhole portHints={${JSON.stringify(platedHole.port_hints)}} pcbX=\"${mmStr(platedHole.x)}\" pcbY=\"${mmStr(platedHole.y)}\" outerDiameter=\"${mmStr(platedHole.outer_diameter)}\" holeDiameter=\"${mmStr(platedHole.hole_diameter)}\" shape=\"circle\" />`,\n )\n }\n }\n\n for (const smtPad of smtPads) {\n if (smtPad.shape === \"circle\") {\n elementStrings.push(\n `<smtpad portHints={${JSON.stringify(smtPad.port_hints)}} pcbX=\"${mmStr(smtPad.x)}\" pcbY=\"${mmStr(smtPad.y)}\" radius=\"${mmStr(smtPad.radius)}\" shape=\"circle\" />`,\n )\n } else if (smtPad.shape === \"rect\") {\n elementStrings.push(\n `<smtpad portHints={${JSON.stringify(smtPad.port_hints)}} pcbX=\"${mmStr(smtPad.x)}\" pcbY=\"${mmStr(smtPad.y)}\" width=\"${mmStr(smtPad.width)}\" height=\"${mmStr(smtPad.height)}\" shape=\"rect\" />`,\n )\n }\n }\n\n for (const via of vias) {\n elementStrings.push(\n `<via pcbX=\"${mmStr(via.x)}\" pcbY=\"${mmStr(via.y)}\" outerDiameter=\"${mmStr(via.outer_diameter)}\" holeDiameter=\"${mmStr(via.hole_diameter)}\" layers={${JSON.stringify(via.layers)}} />`,\n )\n }\n\n for (const silkscreenPath of silkscreenPaths) {\n elementStrings.push(\n `<silkscreenpath route={${JSON.stringify(silkscreenPath.route)}} />`,\n )\n }\n\n for (const silkscreenText of silkscreenTexts) {\n elementStrings.push(\n `<silkscreentext text=\"${silkscreenText.text}\" pcbX=\"${mmStr(silkscreenText.anchor_position.x)}\" pcbY=\"${mmStr(silkscreenText.anchor_position.y)}\" anchorAlignment=\"${silkscreenText.anchor_alignment}\" ${silkscreenText.font_size ? `fontSize=\"${mmStr(silkscreenText.font_size)}\"` : \"\"} />`,\n )\n }\n\n return `\n <footprint>\n ${elementStrings.join(\"\\n\")}\n </footprint>\n `.trim()\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport type { ChipProps } from \"@tscircuit/props\"\nimport { generateFootprintTsx } from \"../generate-footprint-tsx\"\n\ninterface Params {\n pinLabels: ChipProps[\"pinLabels\"]\n componentName: string\n objUrl?: string\n circuitJson: AnyCircuitElement[]\n supplierPartNumbers: ChipProps[\"supplierPartNumbers\"]\n manufacturerPartNumber: string\n}\n\nexport const generateTypescriptComponent = ({\n pinLabels,\n componentName,\n objUrl,\n circuitJson,\n supplierPartNumbers,\n manufacturerPartNumber,\n}: Params) => {\n // Ensure pinLabels is defined\n const safePinLabels = pinLabels ?? {}\n const cadComponent = circuitJson.find((item) => item.type === \"cad_component\")\n const footprintTsx = generateFootprintTsx(circuitJson)\n\n // Simplify pin labels to include only the second element\n const simplifiedPinLabels = Object.fromEntries(\n Object.entries(safePinLabels).map(([pin, labels]) => {\n // Ensure labels is an array and has a second element\n if (Array.isArray(labels) && labels.length > 1) {\n return [pin, [labels[1]]]\n }\n return [pin, labels] // Fallback to original if not an array or missing second element\n }),\n )\n\n const pinLabelsString = Object.entries(simplifiedPinLabels)\n .map(([pin, labels]) => ` ${pin}: ${JSON.stringify(labels)}`)\n .join(\",\\n\")\n\n return `\nimport type { ChipProps } from \"@tscircuit/props\"\n\nconst pinLabels = {\n${pinLabelsString}\n} as const\n\nexport const ${componentName} = (props: ChipProps<typeof pinLabels>) => {\n return (\n <chip\n pinLabels={pinLabels}\n supplierPartNumbers={${JSON.stringify(supplierPartNumbers, null, \" \")}}\n manufacturerPartNumber=\"${manufacturerPartNumber}\"\n footprint={${footprintTsx}}\n ${\n objUrl\n ? `cadModel={{\n objUrl: \"${objUrl}\",\n rotationOffset: { x: 0, y: 0, z: ${cadComponent?.rotation?.z ?? 0} },\n positionOffset: { x: 0, y: 0, z: 0 },\n }}`\n : \"\"\n }\n {...props}\n />\n )\n}\n`.trim()\n}\n","export function normalizeManufacturerPartNumber(partNumber: string): string {\n // Step 1: Replace dashes and invalid symbols with underscores\n let normalized = partNumber\n .replace(/[-]/g, \"_\")\n .replace(/[^a-zA-Z0-9_$]/g, \"_\")\n\n // Step 2: If the string starts with a number, prepend 'A_'\n if (/^\\d/.test(normalized)) {\n normalized = \"A_\" + normalized\n }\n\n return normalized\n}\n","import { fetchEasyEDAComponent } from \"./websafe/fetch-easyeda-json\"\nimport { convertEasyEdaJsonToTscircuitSoupJson } from \"../lib/convert-easyeda-json-to-tscircuit-soup-json\"\nimport fs from \"fs/promises\"\nimport { EasyEdaJsonSchema } from \"lib/schemas/easy-eda-json-schema\"\nimport { convertRawEasyToTsx } from \"lib/websafe/convert-to-typescript-component\"\nimport * as path from \"path\"\nimport { normalizeManufacturerPartNumber } from \"lib\"\n\nexport const convertEasyEdaJsonToVariousFormats = async ({\n jlcpcbPartNumberOrFilepath,\n outputFilename,\n outputFormat,\n}: {\n jlcpcbPartNumberOrFilepath: string\n outputFilename: string\n outputFormat: string\n}) => {\n let rawEasyEdaJson\n if (\n jlcpcbPartNumberOrFilepath.includes(\".\") ||\n jlcpcbPartNumberOrFilepath.includes(\"/\")\n ) {\n rawEasyEdaJson = JSON.parse(\n await fs.readFile(jlcpcbPartNumberOrFilepath, \"utf-8\"),\n )\n } else {\n rawEasyEdaJson = await fetchEasyEDAComponent(jlcpcbPartNumberOrFilepath)\n }\n\n const tsxExtension = \"tsx\"\n if (outputFormat === \"ts\") outputFormat = tsxExtension\n\n if (!outputFilename && outputFormat) {\n let filename = path.basename(jlcpcbPartNumberOrFilepath).split(\".\")[0]\n\n if (outputFormat === tsxExtension) {\n const {\n dataStr: {\n head: {\n c_para: { \"Manufacturer Part\": manufacturerPartNumber },\n },\n },\n } = rawEasyEdaJson\n\n filename = normalizeManufacturerPartNumber(manufacturerPartNumber)\n }\n\n outputFilename = `${filename}.${outputFormat}`\n }\n\n if (!outputFilename) {\n console.log(\"specify --output file (-o) or --output-format\")\n process.exit(1)\n }\n\n if (outputFilename.endsWith(\".raweasy.json\")) {\n await fs.writeFile(outputFilename, JSON.stringify(rawEasyEdaJson, null, 2))\n console.log(`Saved raw EasyEDA JSON: ${outputFilename}`)\n return\n }\n\n try {\n const betterEasy = EasyEdaJsonSchema.parse(rawEasyEdaJson)\n const tscircuitSoup = convertEasyEdaJsonToTscircuitSoupJson(betterEasy)\n\n if (\n outputFilename.endsWith(\".soup.json\") ||\n outputFilename.endsWith(\".circuit.json\")\n ) {\n await fs.writeFile(outputFilename, JSON.stringify(tscircuitSoup, null, 2))\n console.log(\n `[${jlcpcbPartNumberOrFilepath}] Converted to circuit json: ${outputFilename}`,\n )\n } else if (outputFilename.endsWith(\".kicad_mod\")) {\n // TODO: Implement conversion to KiCad footprint\n console.log(\"Conversion to KiCad footprint not yet implemented\")\n } else if (outputFilename.endsWith(\".bettereasy.json\")) {\n await fs.writeFile(outputFilename, JSON.stringify(betterEasy, null, 2))\n console.log(\n `[${jlcpcbPartNumberOrFilepath}] Saved better EasyEDA JSON: ${outputFilename}`,\n )\n } else if (\n outputFilename.endsWith(\".tsx\") ||\n outputFilename.endsWith(\".ts\")\n ) {\n const tsComp = await convertRawEasyToTsx(rawEasyEdaJson)\n await fs.writeFile(outputFilename, tsComp)\n console.log(\n `[${jlcpcbPartNumberOrFilepath}] Saved TypeScript component: ${outputFilename}`,\n )\n } else {\n console.error(\"Unsupported output format\")\n }\n } catch (error: any) {\n console.error(\"Error:\", error.message)\n throw error\n }\n}\n"],"mappings":"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","names":["path","angle","pcb_component","fetch","z","pairs","z","PointSchema","z","path","parsePoints","z","su","su","normalizeManufacturerPartNumber"]}
1
+ {"version":3,"sources":["../lib/convert-easyeda-json-to-tscircuit-soup-json.ts","../lib/math/arc-utils.ts","../lib/utils/easyeda-unit-to-mm.ts","../lib/websafe/fetch-easyeda-json.ts","../lib/schemas/easy-eda-json-schema.ts","../lib/schemas/package-detail-shape-schema.ts","../lib/schemas/single-letter-shape-schema.ts","../lib/websafe/convert-to-typescript-component/index.tsx","../lib/websafe/generate-footprint-tsx.ts","../lib/websafe/convert-to-typescript-component/generate-typescript-component.ts","../lib/utils/normalize-manufacturer-part-number.ts","../lib/convert-easyeda-json-to-various-formats.ts"],"sourcesContent":["import type {\n PadSchema,\n TrackSchema,\n ArcSchema,\n SVGNodeSchema,\n HoleSchema,\n ViaSchema,\n SolidRegionSchema,\n} from \"./schemas/package-detail-shape-schema\"\nimport type { z } from \"zod\"\nimport type { BetterEasyEdaJson } from \"./schemas/easy-eda-json-schema\"\nimport type {\n AnyCircuitElement,\n PcbSmtPad,\n PcbViaInput,\n PcbComponentInput,\n} from \"circuit-json\"\nimport {\n any_source_component,\n pcb_smtpad,\n pcb_silkscreen_path,\n pcb_plated_hole,\n pcb_hole,\n pcb_via,\n} from \"circuit-json\"\nimport * as Soup from \"circuit-json\"\nimport { generateArcFromSweep, generateArcPathWithMid } from \"./math/arc-utils\"\nimport {\n findBoundsAndCenter,\n transformPCBElements,\n} from \"@tscircuit/circuit-json-util\"\nimport { compose, scale, translate, applyToPoint } from \"transformation-matrix\"\nimport { mm } from \"@tscircuit/mm\"\nimport { mil10ToMm } from \"./utils/easyeda-unit-to-mm\"\nimport { normalizePinLabels } from \"@tscircuit/core\"\n\nconst mil2mm = (mil: number | string) => {\n if (typeof mil === \"number\") return mm(`${mil}mil`)\n if (mil.match(/^\\d+$/)) return mm(`${mil}mil`)\n return mm(mil)\n}\n/**\n * Some components, like paths and \"HOLE\", seem to use mil*10 as\n * their unlabeled unit\n */\nconst milx10 = (mil10: number | string) => {\n if (typeof mil10 === \"number\") return mil2mm(mil10) * 10\n if (mil10.match(/^\\d+$/)) return mil2mm(mil10) * 10\n // If it has a unit, return the specified unit ignoring the multiplier\n return mil2mm(mil10)\n}\n\nconst handleSilkscreenPath = (\n track: z.infer<typeof TrackSchema>,\n index: number,\n) => {\n return pcb_silkscreen_path.parse({\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${index + 1}`,\n pcb_component_id: \"pcb_component_1\",\n layer: \"top\", // Assuming all silkscreen is on top layer\n route: track.points.map((point) => ({\n x: milx10(point.x),\n y: milx10(point.y),\n })),\n stroke_width: mil10ToMm(track.width),\n })\n}\n\nconst handleSilkscreenArc = (arc: z.infer<typeof ArcSchema>, index: number) => {\n const arcPath = generateArcFromSweep(\n arc.start.x,\n arc.start.y,\n arc.end.x,\n arc.end.y,\n arc.radiusX,\n arc.largeArc,\n arc.sweepDirection === \"CW\",\n )\n\n return pcb_silkscreen_path.parse({\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: `pcb_silkscreen_arc_${index + 1}`,\n pcb_component_id: \"pcb_component_1\",\n layer: \"top\", // Assuming all silkscreen is on top layer\n route: arcPath.map((p) => ({\n x: milx10(p.x),\n y: milx10(p.y),\n })),\n stroke_width: mil10ToMm(arc.width),\n } as Soup.PcbSilkscreenPathInput)\n}\n\nconst handleHole = (hole: z.infer<typeof HoleSchema>, index: number) => {\n return pcb_hole.parse({\n type: \"pcb_hole\",\n x: milx10(hole.center.x),\n y: milx10(hole.center.y),\n hole_diameter: milx10(hole.radius) * 2,\n hole_shape: \"circle\",\n pcb_hole_id: `pcb_hole_${index + 1}`,\n } as Soup.PcbHole)\n}\n\nconst handleHoleCutout = (hole: z.infer<typeof HoleSchema>, index: number) => {\n return Soup.pcb_cutout.parse({\n type: \"pcb_cutout\",\n pcb_cutout_id: `pcb_cutout_from_hole_${index + 1}`,\n shape: \"circle\",\n center: { x: milx10(hole.center.x), y: milx10(hole.center.y) },\n radius: milx10(hole.radius),\n } as Soup.PcbCutoutCircleInput)\n}\n\nconst handleVia = (via: z.infer<typeof ViaSchema>, index: number) => {\n return pcb_via.parse({\n type: \"pcb_via\",\n pcb_via_id: `pcb_via_${index + 1}`,\n x: milx10(via.center.x),\n y: milx10(via.center.y),\n outer_diameter: milx10(via.outerDiameter),\n hole_diameter: milx10(via.holeDiameter),\n layers: [\"top\", \"bottom\"],\n } as PcbViaInput)\n}\n\nconst handleCutout = (\n solidRegion: z.infer<typeof SolidRegionSchema>,\n index: number,\n) => {\n return Soup.pcb_cutout.parse({\n type: \"pcb_cutout\",\n pcb_cutout_id: `pcb_cutout_${index + 1}`,\n shape: \"polygon\",\n points: solidRegion.points.map((p) => ({\n x: milx10(p.x),\n y: milx10(p.y),\n })),\n } as Soup.PcbCutoutPolygonInput)\n}\n\ninterface Options {\n useModelCdn?: boolean\n shouldRecenter?: boolean\n}\n\nexport const convertEasyEdaJsonToCircuitJson = (\n easyEdaJson: BetterEasyEdaJson,\n { useModelCdn, shouldRecenter = true }: Options = {},\n): AnyCircuitElement[] => {\n const circuitElements: AnyCircuitElement[] = []\n\n // Add source component\n const source_component = any_source_component.parse({\n type: \"source_component\",\n source_component_id: \"source_component_1\",\n name: \"U1\",\n ftype: \"simple_chip\",\n })\n\n const pcb_component = Soup.pcb_component.parse({\n type: \"pcb_component\",\n pcb_component_id: \"pcb_component_1\",\n source_component_id: \"source_component_1\",\n name: \"U1\",\n ftype: \"simple_chip\",\n width: 0, // we update this at the end\n height: 0, // we update this at the end\n rotation: 0,\n center: { x: 0, y: 0 },\n layer: \"top\",\n } as PcbComponentInput)\n\n circuitElements.push(source_component, pcb_component)\n\n const pads = easyEdaJson.packageDetail.dataStr.shape.filter(\n (shape): shape is z.infer<typeof PadSchema> => shape.type === \"PAD\",\n )\n const pins = easyEdaJson.dataStr.shape.filter((shape) => shape.type === \"PIN\")\n\n // Prepare pin labels for normalization\n const pinLabelSets = pads.map((pad) => {\n const labels = []\n if (pad.number) labels.push(pad.number.toString())\n\n const pin = pins.find((p) => p.pinNumber === pad.number)\n if (pin) labels.push(pin.label)\n\n return labels\n })\n\n const normalizedPinLabels = normalizePinLabels(pinLabelSets)\n\n // Add source ports and pcb_smtpads\n pads.forEach((pad, index) => {\n const portHints = normalizedPinLabels[index]\n const pinNumber = Number.parseInt(\n portHints.find((hint) => hint.match(/pin\\d+/))!.replace(\"pin\", \"\"),\n )\n\n // Add source port\n circuitElements.push({\n type: \"source_port\",\n source_port_id: `source_port_${index + 1}`,\n source_component_id: \"source_component_1\",\n name: `pin${pinNumber}`,\n pin_number: pinNumber,\n port_hints: portHints.filter((hint) => hint !== `pin${pinNumber}`),\n })\n\n if (pad.holeRadius !== undefined && mil2mm(pad.holeRadius) !== 0) {\n // Add pcb_plated_hole\n const commonPlatedHoleProps = {\n type: \"pcb_plated_hole\",\n pcb_plated_hole_id: `pcb_plated_hole_${index + 1}`,\n x: mil2mm(pad.center.x),\n y: mil2mm(pad.center.y),\n layers: [\"top\"],\n port_hints: [`pin${pinNumber}`],\n pcb_component_id: \"pcb_component_1\",\n pcb_port_id: `pcb_port_${index + 1}`,\n }\n let additionalPlatedHoleProps: any\n\n if (pad.shape === \"OVAL\") {\n // A JLCPCB Oval is actually a Pill, and it's a bit tricky to compute\n // the correct dimensions, but we can use the following process:\n // 1. Find the smallest outer dimensions\n // 2. Use the holeRadius to determine the distanceFromOuterPlatingToHole\n // 3. Calculate the largest \"inner dimension\" (which is either the\n // holeWidth or holeHeight) by subtracting the distanceFromOuterPlatingToHole * 2\n // from the largest outer dimensions\n\n const largestOuterDimensionName: \"width\" | \"height\" =\n mil2mm(pad.width) > mil2mm(pad.height) ? \"width\" : \"height\"\n\n const smallestOuterDimension = Math.min(\n mil2mm(pad.width),\n mil2mm(pad.height),\n )\n const largestOuterDimension = Math.max(\n mil2mm(pad.width),\n mil2mm(pad.height),\n )\n\n const distanceFromOuterPlatingToHole =\n smallestOuterDimension / 2 - mil2mm(pad.holeRadius)\n\n const largestInnerDimension =\n largestOuterDimension - distanceFromOuterPlatingToHole * 2\n const smallestInnerDimension = mil2mm(pad.holeRadius) * 2\n\n const innerWidth =\n largestOuterDimensionName === \"width\"\n ? largestInnerDimension\n : smallestInnerDimension\n const innerHeight =\n largestOuterDimensionName === \"height\"\n ? largestInnerDimension\n : smallestInnerDimension\n\n additionalPlatedHoleProps = {\n shape: \"pill\",\n outer_width: mil2mm(pad.width),\n outer_height: mil2mm(pad.height),\n hole_width: innerWidth,\n hole_height: innerHeight,\n }\n } else {\n additionalPlatedHoleProps = {\n shape: \"circle\",\n hole_diameter: mil2mm(pad.holeRadius) * 2,\n outer_diameter: mil2mm(pad.width),\n radius: mil2mm(pad.holeRadius),\n }\n }\n\n circuitElements.push(\n pcb_plated_hole.parse({\n ...commonPlatedHoleProps,\n ...additionalPlatedHoleProps,\n }),\n )\n } else {\n // Add pcb_smtpad\n let soupShape: PcbSmtPad[\"shape\"] | undefined\n if (pad.shape === \"RECT\") {\n soupShape = \"rect\"\n } else if (pad.shape === \"ELLIPSE\") {\n // This is just a bug\n soupShape = \"rect\"\n } else if (pad.shape === \"OVAL\") {\n // OVAL is often a rect, especially when holeRadius is 0\n soupShape = \"rect\"\n }\n if (!soupShape) {\n throw new Error(`unknown pad.shape: \"${pad.shape}\"`)\n }\n\n const rectSize = { width: mil2mm(pad.width), height: mil2mm(pad.height) }\n if (pad.rotation === 90 || pad.rotation === 270) {\n // Swap width and height\n rectSize.width = mil2mm(pad.height)\n rectSize.height = mil2mm(pad.width)\n }\n\n const parsedPcbSmtpad = pcb_smtpad.parse({\n type: \"pcb_smtpad\",\n pcb_smtpad_id: `pcb_smtpad_${index + 1}`,\n shape: soupShape,\n x: mil2mm(pad.center.x),\n y: mil2mm(pad.center.y),\n ...(soupShape === \"rect\"\n ? rectSize\n : { radius: Math.min(mil2mm(pad.width), mil2mm(pad.height)) / 2 }),\n layer: \"top\",\n port_hints: [`pin${pinNumber}`],\n pcb_component_id: \"pcb_component_1\",\n pcb_port_id: `pcb_port_${index + 1}`,\n } as PcbSmtPad)\n circuitElements.push(parsedPcbSmtpad)\n }\n })\n\n // Add holes\n easyEdaJson.packageDetail.dataStr.shape\n .filter(\n (shape): shape is z.infer<typeof HoleSchema> => shape.type === \"HOLE\",\n )\n .forEach((h, index) => {\n circuitElements.push(handleHole(h, index))\n circuitElements.push(handleHoleCutout(h, index))\n })\n\n // Add vias\n easyEdaJson.packageDetail.dataStr.shape\n .filter((shape): shape is z.infer<typeof ViaSchema> => shape.type === \"VIA\")\n .forEach((v, index) => {\n circuitElements.push(handleVia(v, index))\n })\n\n // Add pcb cutouts from solid regions marked as cutout\n easyEdaJson.packageDetail.dataStr.shape\n .filter(\n (shape): shape is z.infer<typeof SolidRegionSchema> =>\n shape.type === \"SOLIDREGION\" && shape.fillStyle === \"cutout\",\n )\n .forEach((sr, index) => {\n circuitElements.push(handleCutout(sr, index))\n })\n\n // Add silkscreen paths, arcs and text\n easyEdaJson.packageDetail.dataStr.shape.forEach((shape, index) => {\n if (shape.type === \"TRACK\") {\n circuitElements.push(handleSilkscreenPath(shape, index))\n } else if (shape.type === \"ARC\") {\n circuitElements.push(handleSilkscreenArc(shape, index))\n } else if (shape.type === \"TEXT\") {\n circuitElements.push(\n Soup.pcb_silkscreen_text.parse({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pcb_silkscreen_text_${index + 1}`,\n pcb_component_id: \"pcb_component_1\",\n text: shape.text,\n anchor_position: {\n x: mil2mm(shape.x),\n y: mil2mm(shape.y),\n },\n anchor_alignment: {\n L: \"bottom_left\",\n C: \"center\",\n R: \"bottom_right\",\n }[shape.textAnchor ?? \"L\"],\n font_size: shape.size_mm ? shape.size_mm : undefined,\n layer: \"top\",\n } as Soup.PcbSilkscreenTextInput),\n )\n }\n })\n\n // TODO Change pcb_component width & height\n\n // TODO compute pcb center based on all elements and transform elements such\n // that the center is (0,0)\n\n // Add 3d component\n const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(\n (a): a is z.infer<typeof SVGNodeSchema> =>\n Boolean(a.type === \"SVGNODE\" && a.svgData.attrs?.uuid),\n )\n const objFileUuid = svgNode?.svgData?.attrs?.uuid\n\n const objFileUrl = objFileUuid\n ? useModelCdn\n ? `https://modelcdn.tscircuit.com/easyeda_models/download?uuid=${objFileUuid}&pn=${easyEdaJson.lcsc.number}`\n : `https://modules.easyeda.com/3dmodel/${objFileUuid}`\n : undefined\n\n if (objFileUrl !== undefined) {\n const [rx, ry, rz] = (svgNode?.svgData.attrs?.c_rotation ?? \"0,0,0\")\n .split(\",\")\n .map(Number)\n circuitElements.push(\n Soup.cad_component.parse({\n type: \"cad_component\",\n cad_component_id: \"cad_component_1\",\n source_component_id: \"source_component_1\",\n pcb_component_id: \"pcb_component_1\",\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: rx, y: ry, z: rz },\n model_obj_url: objFileUrl,\n } as Soup.CadComponentInput),\n )\n }\n\n if (shouldRecenter) {\n const bounds = findBoundsAndCenter(\n // exclude the pcb_component because it's center is currently incorrect,\n // we set it to (0,0)\n circuitElements.filter((e) => e.type !== \"pcb_component\"),\n )\n const matrix = compose(\n translate(-bounds.center.x, bounds.center.y),\n scale(1, -1),\n )\n transformPCBElements(circuitElements, matrix)\n for (const e of circuitElements) {\n if (e.type === \"pcb_cutout\") {\n if (e.shape === \"polygon\") {\n e.points = e.points.map((p) => applyToPoint(matrix, p))\n } else {\n e.center = applyToPoint(matrix, e.center)\n }\n }\n }\n pcb_component.center = { x: 0, y: 0 }\n }\n\n return circuitElements\n}\n\n/** @deprecated Use `convertEasyEdaJsonToCircuitJson` instead. */\nexport const convertEasyEdaJsonToTscircuitSoupJson =\n convertEasyEdaJsonToCircuitJson\n","export interface Point {\n x: number\n y: number\n}\n\nexport function calculateCenter(start: Point, mid: Point, end: Point): Point {\n const mid1 = { x: (start.x + mid.x) / 2, y: (start.y + mid.y) / 2 }\n const mid2 = { x: (mid.x + end.x) / 2, y: (mid.y + end.y) / 2 }\n\n const slope1 = -(start.x - mid.x) / (start.y - mid.y)\n const slope2 = -(mid.x - end.x) / (mid.y - end.y)\n\n const centerX =\n (mid1.y - mid2.y + slope2 * mid2.x - slope1 * mid1.x) / (slope2 - slope1)\n const centerY = mid1.y + slope1 * (centerX - mid1.x)\n\n return { x: centerX, y: centerY }\n}\n\nfunction calculateRadius(center: Point, point: Point): number {\n return Math.sqrt((center.x - point.x) ** 2 + (center.y - point.y) ** 2)\n}\n\nfunction calculateAngle(center: Point, point: Point): number {\n return Math.atan2(point.y - center.y, point.x - center.x)\n}\n\nexport const getArcLength = (start: Point, mid: Point, end: Point) => {\n const center = calculateCenter(start, mid, end)\n const radius = calculateRadius(center, start)\n\n const angleStart = calculateAngle(center, start)\n const angleEnd = calculateAngle(center, end)\n\n let angleDelta = angleEnd - angleStart\n if (angleDelta < 0) {\n angleDelta += 2 * Math.PI\n }\n\n return radius * angleDelta\n}\n\nexport function generateArcPathWithMid(\n start: Point,\n mid: Point,\n end: Point,\n numPoints: number,\n): Point[] {\n const center = calculateCenter(start, mid, end)\n const radius = calculateRadius(center, start)\n\n const angleStart = calculateAngle(center, start)\n const angleEnd = calculateAngle(center, end)\n\n let angleDelta = angleEnd - angleStart\n if (angleDelta < 0) {\n angleDelta += 2 * Math.PI\n }\n\n const path: Point[] = []\n\n for (let i = 0; i <= numPoints; i++) {\n const angle = angleStart + (i / numPoints) * angleDelta\n const x = center.x + radius * Math.cos(angle)\n const y = center.y + radius * Math.sin(angle)\n // Check for NaN or Infinity values\n if (!isNaN(x) && isFinite(x) && !isNaN(y) && isFinite(y)) {\n path.push({ x, y })\n }\n }\n\n // If the path is empty, add the start and end points\n if (path.length === 0) {\n path.push(start, end)\n }\n\n return path\n}\n\n/**\nThis syntax describes an SVG path command for drawing an arc. Let's break down each part:\n\n1. \"M 3923.0512 2968.5197\": \n - M: Move to\n - 3923.0512: X-coordinate\n - 2968.5197: Y-coordinate\n\n2. \"A 2.5 2.5 0 0 0 3923.0512 2963.5197\":\n - A: Arc command\n - 2.5: X-radius of the ellipse\n - 2.5: Y-radius of the ellipse\n - 0: X-axis rotation (in degrees)\n - 0: Large arc flag (0 for small arc, 1 for large arc)\n - 0: Sweep flag (0 for counterclockwise, 1 for clockwise)\n - 3923.0512: End X-coordinate\n - 2963.5197: End Y-coordinate\n\nThis command draws an arc starting at (3923.0512, 2968.5197) and ending at (3923.0512, 2963.5197), using a circular path with a radius of 2.5 units.\n */\nexport function generateArcFromSweep(\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n radius: number,\n largeArcFlag: boolean,\n sweepFlag: boolean,\n): Point[] {\n const start: Point = { x: startX, y: startY }\n const end: Point = { x: endX, y: endY }\n\n // Calculate the midpoint between start and end\n const midX = (startX + endX) / 2\n const midY = (startY + endY) / 2\n\n // Calculate the distance between start and end\n const dx = endX - startX\n const dy = endY - startY\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n // If the distance is zero or the radius is too small, return a straight line\n if (distance === 0 || radius < distance / 2) {\n return [start, end]\n }\n\n // Calculate the center of the arc\n const h = Math.sqrt(radius * radius - (distance * distance) / 4)\n const angle = Math.atan2(dy, dx)\n const centerX = midX + h * Math.sin(angle) * (sweepFlag ? -1 : 1)\n const centerY = midY - h * Math.cos(angle) * (sweepFlag ? -1 : 1)\n\n // Calculate start and end angles\n const startAngle = Math.atan2(startY - centerY, startX - centerX)\n let endAngle = Math.atan2(endY - centerY, endX - centerX)\n\n // Adjust end angle based on sweep and large arc flags\n if (sweepFlag && endAngle > startAngle) {\n endAngle -= 2 * Math.PI\n } else if (!sweepFlag && endAngle < startAngle) {\n endAngle += 2 * Math.PI\n }\n\n if (\n (!largeArcFlag && Math.abs(endAngle - startAngle) > Math.PI) ||\n (largeArcFlag && Math.abs(endAngle - startAngle) < Math.PI)\n ) {\n if (endAngle > startAngle) {\n endAngle -= 2 * Math.PI\n } else {\n endAngle += 2 * Math.PI\n }\n }\n\n // Generate points along the arc\n const numPoints = Math.max(\n 2,\n Math.ceil(Math.abs(endAngle - startAngle) * radius),\n )\n const path: Point[] = []\n\n for (let i = 0; i <= numPoints; i++) {\n const t = i / numPoints\n const angle = startAngle + t * (endAngle - startAngle)\n const x = centerX + radius * Math.cos(angle)\n const y = centerY + radius * Math.sin(angle)\n path.push({ x, y })\n }\n\n return path\n}\n","/**\n * EasyEDA takes 10 mil as a basic factor, when a stroke width is 1, we can take it as 1*10mil = 10mil, is 2, we can take it as 2*10mil = 20mil,\n * Ref: https://docs.easyeda.com/en/DocumentFormat/3-EasyEDA-PCB-File-Format/#unit\n *\n * 1 mil = 0.001 inch\n * 1 inch = 25.4 mm\n * 1 mil = 25.4/1000 = 0.0254 mm\n */\nexport const mil10ToMm = (value: number): number => value * 10 * 0.0254\n","import type { RawEasyEdaJson } from \"../schemas/easy-eda-json-schema\"\n\nexport async function fetchEasyEDAComponent(\n jlcpcbPartNumber: string,\n { fetch = globalThis.fetch }: { fetch?: typeof globalThis.fetch } = {},\n): Promise<RawEasyEdaJson> {\n const searchUrl = \"https://easyeda.com/api/components/search\"\n const componentUrl = (uuid: string) =>\n `https://easyeda.com/api/components/${uuid}?version=6.4.7&uuid=${uuid}&datastrid=`\n\n const searchHeaders = {\n authority: \"easyeda.com\",\n pragma: \"no-cache\",\n \"cache-control\": \"no-cache\",\n accept: \"application/json, text/javascript, */*; q=0.01\",\n \"x-requested-with\": \"XMLHttpRequest\",\n \"user-agent\":\n \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36\",\n \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n origin: \"https://easyeda.com\",\n \"sec-fetch-site\": \"same-origin\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n referer: \"https://easyeda.com/editor\",\n \"accept-language\": \"cs,en;q=0.9,sk;q=0.8,en-GB;q=0.7\",\n cookie: \"<PUT your cookies here>\",\n }\n\n const searchData = `type=3&doctype%5B%5D=2&uid=0819f05c4eef4c71ace90d822a990e87&returnListStyle=classifyarr&wd=${jlcpcbPartNumber}&version=6.4.7`\n\n // Perform the search request\n const searchResponse = await fetch(searchUrl, {\n method: \"POST\",\n headers: searchHeaders,\n body: searchData,\n })\n\n if (!searchResponse.ok) {\n throw new Error(\"Failed to search for the component\")\n }\n\n const searchResult = await searchResponse.json()\n if (!searchResult.success || !searchResult.result.lists.lcsc.length) {\n throw new Error(\"Component not found\")\n }\n\n const bestMatchComponent =\n searchResult.result.lists.lcsc.find(\n (component: any) =>\n component.dataStr.head.c_para[\"Supplier Part\"] === jlcpcbPartNumber,\n ) ?? searchResult.result.lists.lcsc[0]\n\n const componentUUID = bestMatchComponent.uuid\n\n // Perform the component fetch request\n const componentResponse = await fetch(componentUrl(componentUUID), {\n method: \"GET\",\n headers: {\n ...searchHeaders,\n referer: `https://easyeda.com/editor?uuid=${componentUUID}`,\n },\n })\n\n if (!componentResponse.ok) {\n throw new Error(\"Failed to fetch the component details\")\n }\n\n const componentResult = await componentResponse.json()\n return componentResult.result\n}\n\n// Usage example\n// fetchEasyEDAComponent(\"C558438\")\n// .then((component) => console.log(component))\n// .catch((error) => console.error(error))\n","import { z } from \"zod\"\nimport {\n PackageDetailShapeSchema,\n ShapeItemSchema,\n} from \"./package-detail-shape-schema\"\nimport { SingleLetterShapeSchema } from \"./single-letter-shape-schema\"\n\nexport const maybeNumber = z\n .any()\n .transform((k) => (k === \"nan\" || Number.isNaN(k) ? null : k))\n .pipe(z.number().nullable().optional())\n\nexport const SzlcscSchema = z.object({\n id: z.number(),\n number: z.string(),\n step: z.number().optional(),\n min: z.number().optional(),\n price: z.number().optional(),\n stock: z.number().optional(),\n url: z.string().url().optional(),\n image: z.string().optional().optional(),\n})\n\nexport const LcscSchema = z.object({\n id: z.number(),\n number: z.string(),\n step: z.number().optional(),\n min: z.number().optional(),\n price: z.number().optional(),\n stock: z.number().optional(),\n url: z.string().url().optional(),\n})\n\nexport const OwnerSchema = z.object({\n uuid: z.string(),\n username: z.string(),\n nickname: z.string(),\n avatar: z.string(),\n})\n\nexport const HeadSchema = z.object({\n docType: z.preprocess((val) => (val == null ? val : String(val)), z.string()),\n editorVersion: z.string(),\n c_para: z.record(z.string(), z.string().nullable()),\n x: z.number(),\n y: z.number(),\n puuid: z.string().optional(),\n uuid: z.string(),\n utime: z.preprocess((val) => {\n if (val === \"\") return 0\n if (typeof val === \"string\") return Number(val)\n return val\n }, z.number()),\n importFlag: z.number().optional(),\n c_spiceCmd: z.any().optional(),\n hasIdFlag: z.boolean(),\n})\n\nexport const BBoxSchema = z.object({\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n})\n\nexport const LayerItemSchema = z.object({\n name: z.string(),\n color: z.string(),\n visible: z.boolean(),\n active: z.boolean(),\n config: z.boolean(),\n transparency: z.boolean(),\n})\n\nexport const ObjectItemSchema = z.object({\n name: z.string(),\n visible: z.boolean(),\n locked: z.boolean(),\n})\n\nexport const DataStrSchema = z.object({\n head: HeadSchema,\n canvas: z.string(),\n shape: z.array(SingleLetterShapeSchema),\n BBox: BBoxSchema,\n colors: z.array(z.unknown()),\n})\n\nexport const PackageDetailDataStrSchema = z.object({\n head: HeadSchema,\n canvas: z.string(),\n shape: z\n .array(z.string())\n .transform((shapes) =>\n shapes.map((shape) => {\n const [type, ...data] = shape.split(\"~\")\n return ShapeItemSchema.parse({ type, data: data.join(\"~\") })\n }),\n )\n .pipe(z.array(PackageDetailShapeSchema)),\n layers: z.array(z.string()).transform((layers) =>\n layers.map((layer) => {\n const [name, color, visible, active, config, transparency] =\n layer.split(\"~\")\n return LayerItemSchema.parse({\n name,\n color,\n visible: visible === \"true\",\n active: active === \"true\",\n config: config === \"true\",\n transparency: transparency === \"true\",\n })\n }),\n ),\n objects: z.array(z.string()).transform((objects) =>\n objects.map((obj) => {\n const [name, visible, locked] = obj.split(\"~\")\n return ObjectItemSchema.parse({\n name,\n visible: visible === \"true\",\n locked: locked === \"true\",\n })\n }),\n ),\n BBox: BBoxSchema,\n netColors: z.array(z.unknown()).optional(),\n})\n\nexport const PackageDetailSchema = z.object({\n uuid: z.string(),\n title: z.string(),\n docType: z.number(),\n updateTime: z.number(),\n owner: OwnerSchema,\n datastrid: z.string(),\n writable: z.boolean(),\n dataStr: PackageDetailDataStrSchema,\n})\n\nexport const EasyEdaJsonSchema = z.object({\n uuid: z.string(),\n title: z.string(),\n description: z.string(),\n docType: z.number(),\n type: z.number(),\n szlcsc: SzlcscSchema,\n lcsc: LcscSchema,\n owner: OwnerSchema,\n tags: z.array(z.string()),\n updateTime: z.number(),\n updated_at: z.string(),\n dataStr: DataStrSchema,\n verify: z.boolean(),\n SMT: z.boolean().optional(),\n datastrid: z.string(),\n jlcOnSale: z.number().optional(),\n writable: z.boolean(),\n isFavorite: z.boolean(),\n packageDetail: PackageDetailSchema,\n})\n\nexport type RawEasyEdaJson = z.input<typeof EasyEdaJsonSchema>\nexport type BetterEasyEdaJson = z.infer<typeof EasyEdaJsonSchema>\n","import { z } from \"zod\"\n\nconst tenthmil = z\n .union([z.number(), z.string()])\n .optional()\n .transform((n) =>\n typeof n === \"string\" && n.endsWith(\"mil\")\n ? n\n : `${Number.parseFloat(n as string) * 10}mil`,\n )\n .pipe(z.string())\n\nexport const PointSchema = z\n .any()\n .transform((p) => {\n if (Array.isArray(p)) {\n const [x, y] = p\n return { x, y }\n }\n if (typeof p === \"object\") {\n return p\n }\n throw new Error(`Invalid point: ${p}`)\n })\n .pipe(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n )\n\nexport const BaseShapeSchema = z.object({\n type: z.string(),\n id: z.string().optional(),\n layer: z.coerce.number().optional(),\n})\n\nexport const TrackSchema = BaseShapeSchema.extend({\n type: z.literal(\"TRACK\"),\n width: z.coerce.number(),\n points: z.array(PointSchema),\n})\n\nexport const PadSchema = BaseShapeSchema.extend({\n type: z.literal(\"PAD\"),\n shape: z.enum([\"RECT\", \"ELLIPSE\", \"OVAL\"]),\n center: z.object({\n x: tenthmil,\n y: tenthmil,\n }),\n width: tenthmil,\n height: tenthmil,\n layermask: z.number(),\n net: z.union([z.string(), z.number()]).optional(),\n number: z.union([z.string(), z.number()]),\n holeRadius: tenthmil,\n points: z.array(PointSchema).optional(),\n rotation: z.number().optional(),\n plated: z.boolean(),\n})\n\n// TODO this should be in \"arc sweep\" format with the following fields:\n// start, end, radius, largeArc, sweepDirection\nexport const ArcSchema = BaseShapeSchema.extend({\n type: z.literal(\"ARC\"),\n width: z.number(),\n start: PointSchema,\n end: PointSchema,\n radiusX: z.number(),\n radiusY: z.number(),\n largeArc: z.boolean(),\n sweepDirection: z.enum([\"CW\", \"CCW\"]),\n})\n\nexport const CircleSchema = BaseShapeSchema.extend({\n type: z.literal(\"CIRCLE\"),\n center: PointSchema,\n radius: z.number(),\n width: z.number(),\n})\n\nexport const SolidRegionSchema = BaseShapeSchema.extend({\n type: z.literal(\"SOLIDREGION\"),\n layermask: z.number(),\n points: z.array(PointSchema),\n fillStyle: z.string(),\n})\n\nexport const SVGNodeSchema = BaseShapeSchema.extend({\n type: z.literal(\"SVGNODE\"),\n svgData: z.object({\n gId: z.string(),\n nodeName: z.string(),\n nodeType: z.number(),\n layerid: z.string(),\n attrs: z.record(z.string(), z.string()),\n childNodes: z.array(z.unknown()),\n }),\n})\n\n// e.g. \"HOLE~3999.449~3004.213~1.378~gge152~0\"\nexport const HoleSchema = BaseShapeSchema.extend({\n type: z.literal(\"HOLE\"),\n center: PointSchema,\n radius: z.number(),\n})\n\nexport const ViaSchema = BaseShapeSchema.extend({\n type: z.literal(\"VIA\"),\n center: PointSchema,\n outerDiameter: z.number(),\n holeDiameter: z.number(),\n})\n\nexport const RectSchema = BaseShapeSchema.extend({\n type: z.literal(\"RECT\"),\n x: tenthmil,\n y: tenthmil,\n width: tenthmil,\n height: tenthmil,\n lineWidth: z.number(),\n fillStyle: z.string(),\n rotation: z.number().optional(),\n})\n\nexport const TextSchema = BaseShapeSchema.extend({\n type: z.literal(\"TEXT\"),\n text: z.string(),\n x: tenthmil,\n y: tenthmil,\n size_mm: z.number(),\n rotation: z.number().optional(),\n layer: z.number().optional(),\n textAnchor: z\n .enum([\"L\", \"C\", \"R\", \"\"])\n .optional()\n .transform((val) => (val === \"\" ? undefined : val)),\n font: z.string().optional(),\n})\n\nexport const PackageDetailShapeSchema = z.discriminatedUnion(\"type\", [\n TrackSchema,\n PadSchema,\n ArcSchema,\n CircleSchema,\n SolidRegionSchema,\n SVGNodeSchema,\n HoleSchema,\n ViaSchema,\n RectSchema,\n TextSchema,\n])\n\nconst pairs = <T>(arr: T[]): [T, T][] => {\n const pairs: [T, T][] = []\n for (let i = 0; i < arr.length; i += 2) {\n pairs.push([arr[i], arr[i + 1]])\n }\n return pairs\n}\n\nconst parsePoints = (pointsStr: string): number[][] =>\n pairs(\n pointsStr\n .trim()\n .split(\" \")\n .map((n) => Number(n)),\n )\n\nexport const ShapeItemSchema = z\n .object({\n type: z.string(),\n data: z.string(),\n })\n .transform((shape) => {\n switch (shape.type) {\n case \"TRACK\": {\n const [width, layer, _, pointsStr, id, _n] = shape.data.split(\"~\")\n const points = parsePoints(pointsStr)\n return TrackSchema.parse({ type: \"TRACK\", width, layer, points, id })\n }\n case \"PAD\": {\n const [padShape, ...params] = shape.data.split(\"~\")\n const [\n centerX,\n centerY,\n width,\n height,\n layermask,\n net,\n number,\n holeRadius,\n ...rest\n ] = params.map((p) => (Number.isNaN(Number(p)) ? p : Number(p)))\n const center = { x: centerX, y: centerY }\n let points: number[][] | undefined\n\n if (padShape === \"RECT\") {\n points = parsePoints(rest[0] as any)\n }\n\n // Extract rotation for all pad types from position 11 (rest[1])\n const r = Number(rest[1])\n const rotation = Number.isNaN(r) ? undefined : r\n\n const padInputParams = {\n type: \"PAD\",\n shape: padShape,\n center,\n width,\n height,\n layermask,\n net,\n number,\n holeRadius,\n points,\n rotation,\n plated: rest.includes(\"Y\"),\n }\n const pad = PadSchema.parse(padInputParams)\n return pad\n }\n case \"ARC\": {\n const [width, layer, , arcData] = shape.data.split(\"~\")\n // A rx ry x-axis-rotation large-arc-flag sweep-flag x y\n // A rx ry x-axis-rotation large-arc-flag sweep-flag dx dy\n const match = arcData.match(\n /M\\s*([\\d.-]+)(?:\\s*,\\s*|\\s+)([\\d.-]+)\\s*A\\s*([\\d.-]+)(?:\\s*,\\s*|\\s+)([\\d.-]+)\\s*([\\d.-]+)\\s*([\\d.-]+)\\s*([\\d.-]+)\\s*([\\d.-]+)(?:\\s*,\\s*|\\s+)([\\d.-]+)/,\n )\n\n if (!match) {\n throw new Error(`Invalid arc data: ${arcData}`)\n }\n\n const [\n ,\n startX,\n startY,\n radiusX,\n radiusY,\n xAxisRotation,\n largeArcFlag,\n sweepFlag,\n endX,\n endY,\n ] = match\n const start: [number, number] = [Number(startX), Number(startY)]\n const end: [number, number] = [Number(endX), Number(endY)]\n return ArcSchema.parse({\n type: \"ARC\",\n width: Number(width),\n layer: Number(layer),\n start,\n end,\n radiusX: Number(radiusX),\n radiusY: Number(radiusY),\n largeArc: largeArcFlag === \"1\",\n // sweepFlag=1 means clockwise (CW), sweepFlag=0 means counter-clockwise (CCW)\n sweepDirection: sweepFlag === \"1\" ? \"CW\" : \"CCW\",\n })\n }\n case \"CIRCLE\": {\n const [centerX, centerY, radius, width, layer, id] =\n shape.data.split(\"~\")\n const center: [number, number] = [Number(centerX), Number(centerY)]\n return CircleSchema.parse({\n type: \"CIRCLE\",\n center,\n radius: Number(radius),\n width: Number(width),\n layer: Number(layer),\n id,\n })\n }\n case \"HOLE\": {\n const [centerX, centerY, radius, id] = shape.data.split(\"~\")\n const center: [number, number] = [Number(centerX), Number(centerY)]\n return HoleSchema.parse({\n type: \"HOLE\",\n center,\n radius: Number(radius),\n id,\n })\n }\n case \"VIA\": {\n const [x, y, outerDiameter, , holeDiameter, id] = shape.data.split(\"~\")\n const center: [number, number] = [Number(x), Number(y)]\n return ViaSchema.parse({\n type: \"VIA\",\n center,\n outerDiameter: Number(outerDiameter),\n holeDiameter: Number(holeDiameter),\n id,\n })\n }\n case \"SOLIDREGION\": {\n const [layermask, , pathData, fillStyle, id] = shape.data.split(\"~\")\n const points =\n pathData.match(/[ML] ?(-?[\\d.]+)[ ,](-?[\\d.]+)/g)?.map((point) => {\n const [, x, y] =\n point.match(/[ML]? ?(-?[\\d.]+)[ ,](-?[\\d.]+)/) || []\n return [Number(x), Number(y)]\n }) || []\n return SolidRegionSchema.parse({\n type: \"SOLIDREGION\",\n layermask: Number(layermask),\n points,\n fillStyle,\n id,\n })\n }\n case \"SVGNODE\": {\n const svgData = JSON.parse(shape.data)\n return SVGNodeSchema.parse({ type: \"SVGNODE\", svgData })\n }\n case \"RECT\": {\n const [x, y, width, height, lineWidth, id, rotation, layer, fillStyle] =\n shape.data.split(\"~\")\n const r = rotation ? Number(rotation) : undefined\n return RectSchema.parse({\n type: \"RECT\",\n x,\n y,\n width,\n height,\n lineWidth: Number(lineWidth),\n id,\n rotation: Number.isNaN(r as number) ? undefined : r,\n layer: layer ? Number(layer) : undefined,\n fillStyle: fillStyle || undefined,\n })\n }\n case \"TEXT\": {\n const [textAnchor, x, y, size, layer, id, rotation, , font, text] =\n shape.data.split(\"~\")\n const r = rotation ? Number(rotation) : undefined\n return TextSchema.parse({\n type: \"TEXT\",\n text,\n x,\n y,\n size_mm: Number(size) * 2.54, // empirically this seems to match, C5248081 is a good test case\n layer: layer ? Number(layer) : undefined,\n id,\n rotation: Number.isNaN(r as number) ? undefined : r,\n textAnchor: textAnchor as \"L\" | \"C\" | \"R\" | undefined,\n font: font || undefined,\n })\n }\n\n default:\n throw new Error(`Unknown shape type: ${shape.type}`)\n }\n })\n .pipe(PackageDetailShapeSchema)\n\nexport const ShapesArraySchema = z.array(ShapeItemSchema)\n","import { z } from \"zod\"\nimport { mil10ToMm } from \"lib/utils/easyeda-unit-to-mm\"\n\n/**\n I'll break down the elements in the `dataStr.head.shape` array and explain what they represent. This array contains instructions for drawing the schematic symbol of the component.\n1. `\"R~365~275~2~2~70~50~#880000~1~0~none~gge1~0~\"`\n This represents a rectangle:\n - Starting position: (365, 275)\n - Width: 70\n - Height: 50\n - Color: #880000 (dark red)\n - Line width: 1\n - Other parameters are for internal use\n2. `\"E~370~280~1.5~1.5~#880000~1~0~#880000~gge2~0\"`\n This draws an ellipse:\n - Center: (370, 280)\n - Radius X: 1.5\n - Radius Y: 1.5\n - Color: #880000 (dark red)\n - Line width: 1\n3-10. `\"P~show~0~1~355~285~180~gge5~0^^355~285^^M355,285h10~#000000^^1~368.7~289~0~GND~start~~~#000000^^1~364.5~284~0~1~end~~~#000000^^0~362~285^^0~M 365 288 L 368 285 L 365 282\"`\n These represent pins of the component. Each pin has:\n - Pin number\n - Position\n - Orientation\n - Label (e.g., GND, TRIG, OUT)\n - Color\n - Drawing instructions for the pin shape\n4. `\"A~M x1 y1 A radius radius 0 1 0 x2 y2\"`\n This represents an arc:\n - Start point: (x1, y1)\n - End point: (x2, y2)\n - Radius\n - Direction (CW or CCW)\n - Color\n - Line width\n - ID\nTo parse this data:\n1. Split the string by `~` to get individual parameters.\n2. For rectangles (R), use parameters 2-7 for position, size, and color.\n3. For ellipses (E), use parameters 2-5 for position and size, and 6 for color.\n4. For pins (P), split further by `^^` to get different sections:\n - First section: general pin properties\n - Second section: pin position\n - Third section: line drawing instruction\n - Fourth and Fifth sections: label position and text\n - Sixth section: additional drawing instruction for pin shape\n5. For arcs (A), split by `~M ` to get the path data.\n - Format: A~M x1 y1 A radius radius 0 1 0 x2 y2\n - Parse the start and end points, radius, direction, color, line width, and ID.\nThis data structure allows for a compact representation of the schematic symbol, which can be rendered by CAD software to display the component in circuit diagrams.\n */\n// Examples\n// \"R~365~275~2~2~70~50~#880000~1~0~none~gge1~0~\",\n// \"E~370~280~1.5~1.5~#880000~1~0~#880000~gge2~0\",\n// \"P~show~0~1~355~285~180~gge5~0^^355~285^^M355,285h10~#000000^^1~368.7~289~0~GND~start~~~#000000^^1~364.5~284~0~1~end~~~#000000^^0~362~285^^0~M 365 288 L 368 285 L 365 282\",\n// \"P~show~0~2~355~295~180~gge6~0^^355~295^^M355,295h10~#880000^^1~368.7~299~0~TRIG~start~~~#0000FF^^1~364.5~294~0~2~end~~~#0000FF^^0~362~295^^0~M 365 298 L 368 295 L 365 292\",\n// \"P~show~0~3~355~305~180~gge7~0^^355~305^^M355,305h10~#880000^^1~368.7~309~0~OUT~start~~~#0000FF^^1~364.5~304~0~3~end~~~#0000FF^^0~362~305^^0~M 365 308 L 368 305 L 365 302\",\n// \"P~show~0~4~355~315~180~gge8~0^^355~315^^M355,315h10~#880000^^1~368.7~319~0~RESET~start~~~#0000FF^^1~364.5~314~0~4~end~~~#0000FF^^0~362~315^^0~M 365 318 L 368 315 L 365 312\",\n// \"P~show~0~5~445~315~0~gge9~0^^445~315^^M445,315h-10~#880000^^1~431.3~319~0~CONT~end~~~#0000FF^^1~435.5~314~0~5~start~~~#0000FF^^0~438~315^^0~M 435 312 L 432 315 L 435 318\",\n// \"P~show~0~6~445~305~0~gge10~0^^445~305^^M445,305h-10~#880000^^1~431.3~309~0~THRES~end~~~#0000FF^^1~435.5~304~0~6~start~~~#0000FF^^0~438~305^^0~M 435 302 L 432 305 L 435 308\",\n// \"P~show~0~7~445~295~0~gge11~0^^445~295^^M445,295h-10~#880000^^1~431.3~299~0~DISCH~end~~~#0000FF^^1~435.5~294~0~7~start~~~#0000FF^^0~438~295^^0~M 435 292 L 432 295 L 435 298\",\n// \"P~show~0~8~445~285~0~gge12~0^^445~285^^M445,285h-10~#FF0000^^1~431.3~289~0~VCC~end~~~#FF0000^^1~435.5~284~0~8~start~~~#FF0000^^0~438~285^^0~M 435 282 L 432 285 L 435 288\",\n// \"A~M x1 y1 A radius radius 0 1 0 x2 y2\"\n\nconst PointSchema = z.object({\n x: z.number(),\n y: z.number(),\n})\n\nconst RectangleShapeOutputSchema = z.object({\n type: z.literal(\"RECTANGLE\"),\n position: PointSchema,\n width: z.number(),\n height: z.number(),\n color: z.string(),\n lineWidth: z.number(),\n id: z.string(),\n})\n\nconst parseRectangle = (\n str: string,\n): z.infer<typeof RectangleShapeOutputSchema> => {\n const [, x, y, , , width, height, color, lineWidth, , , id] = str.split(\"~\")\n return {\n type: \"RECTANGLE\",\n position: { x: Number(x), y: Number(y) },\n width: Number(width),\n height: Number(height),\n color,\n lineWidth: Number(lineWidth),\n id,\n }\n}\n\nexport const RectangleShapeSchema = z\n .string()\n .startsWith(\"R~\")\n .transform(parseRectangle)\n .pipe(RectangleShapeOutputSchema)\n\nconst EllipseShapeOutputSchema = z.object({\n type: z.literal(\"ELLIPSE\"),\n center: PointSchema,\n radiusX: z.number(),\n radiusY: z.number(),\n color: z.string(),\n lineWidth: z.number(),\n id: z.string(),\n})\n\nconst parseEllipse = (\n str: string,\n): z.infer<typeof EllipseShapeOutputSchema> => {\n const [, x, y, radiusX, radiusY, color, lineWidth, , , id] = str.split(\"~\")\n return {\n type: \"ELLIPSE\",\n center: { x: Number(x), y: Number(y) },\n radiusX: Number(radiusX),\n radiusY: Number(radiusY),\n color,\n lineWidth: Number(lineWidth),\n id,\n }\n}\n\nexport const EllipseShapeSchema = z\n .string()\n .startsWith(\"E~\")\n .transform(parseEllipse)\n .pipe(EllipseShapeOutputSchema)\n\nconst ArcShapeOutputSchema = z.object({\n type: z.literal(\"ARC\"),\n start: PointSchema,\n end: PointSchema,\n radius: z.number(),\n sweepFlag: z.boolean(),\n color: z.string(),\n lineWidth: z.number(),\n id: z.string(),\n})\n\nconst parseArc = (str: string): z.infer<typeof ArcShapeOutputSchema> => {\n // Format: A~M x1 y1 A radius radius 0 1 0 x2 y2~#880000~1~0~none~gge49~0\n const [, pathData, color, lineWidth, , , id] = str.split(\"~\")\n const parts = pathData.split(\" \")\n\n // Handle potential NaN values by defaulting to 0\n const x1 = Number(parts[1]) || 0\n const y1 = Number(parts[2]) || 0\n const radius = Number(parts[4]) || 0\n const sweepFlag = parts[7] === \"1\" // The sweep flag is the 8th parameter\n const x2 = Number(parts[8]) || 0\n const y2 = Number(parts[9]) || 0\n\n // Handle empty or invalid line width\n const parsedLineWidth = Number(lineWidth)\n const finalLineWidth = Number.isNaN(parsedLineWidth) ? 1 : parsedLineWidth\n\n return {\n type: \"ARC\",\n start: { x: x1, y: y1 },\n end: { x: x2, y: y2 },\n radius,\n sweepFlag,\n color: color || \"#880000\", // Default color\n lineWidth: finalLineWidth,\n id: id || \"gge1\",\n }\n}\n\nexport const ArcShapeSchema = z\n .string()\n .startsWith(\"A~\")\n .transform(parseArc)\n .pipe(ArcShapeOutputSchema)\n\nconst PinShapeOutputSchema = z.object({\n type: z.literal(\"PIN\"),\n visibility: z.enum([\"show\", \"hide\"]),\n pinNumber: z.union([z.string(), z.number()]),\n x: z.number(),\n y: z.number(),\n rotation: z.number(),\n id: z.string(),\n label: z.string(),\n labelColor: z.string(),\n path: z.string(),\n arrow: z.string(),\n})\n\nconst parsePin = (pinString: string): z.infer<typeof PinShapeOutputSchema> => {\n const parts = pinString.split(\"~\")\n const [, visibility, , pinNumber, x, y, rotation, id] = parts\n\n const nameMatch = pinString.match(/~(\\w+)~(start|end)~/)\n const label = nameMatch ? nameMatch[1] : \"\"\n\n const colorMatch = pinString.match(/#[0-9A-F]{6}/)\n const labelColor = colorMatch ? colorMatch[0] : \"\"\n\n const pathMatch = pinString.match(/\\^\\^([^~]+)/)\n const path = pathMatch ? pathMatch[1] : \"\"\n\n const arrowMatch = pinString.match(/\\^\\^0~(.+)$/)\n const arrow = arrowMatch ? arrowMatch[1] : \"\"\n\n const r = Number.parseFloat(rotation)\n return {\n type: \"PIN\",\n visibility: visibility as \"show\" | \"hide\",\n id,\n pinNumber: Number.isNaN(Number(pinNumber)) ? pinNumber : Number(pinNumber),\n x: Number.parseFloat(x),\n y: Number.parseFloat(y),\n rotation: Number.isNaN(r) ? 0 : r,\n label,\n labelColor,\n path,\n arrow,\n }\n}\n\nexport const PinShapeSchema = z\n .string()\n .startsWith(\"P~\")\n .transform(parsePin)\n .pipe(PinShapeOutputSchema)\n\nconst PolylineShapeOutputSchema = z.object({\n type: z.literal(\"POLYLINE\"),\n points: z.array(PointSchema),\n color: z.string(),\n lineWidth: z.number(),\n id: z.string(),\n})\n\nconst parsePoints = (pointsStr: string): Array<{ x: number; y: number }> => {\n return pointsStr\n .split(\" \")\n .reduce<Array<{ x: number; y: number }>>((acc, value, index) => {\n if (index % 2 === 0) {\n acc.push({ x: Number(value), y: 0 })\n } else {\n acc[acc.length - 1].y = Number(value)\n }\n return acc\n }, [])\n}\n\nconst parsePolyline = (\n str: string,\n): z.infer<typeof PolylineShapeOutputSchema> => {\n const [, ...rest] = str.split(\"~\")\n const [pointsStr, color, lineWidth, , , id] = rest\n\n return {\n type: \"POLYLINE\",\n points: parsePoints(pointsStr),\n color,\n lineWidth: Number(lineWidth),\n id,\n }\n}\n\nexport const PolylineShapeSchema = z\n .string()\n .startsWith(\"PL~\")\n .transform(parsePolyline)\n .pipe(PolylineShapeOutputSchema)\n\nconst PolygonShapeOutputSchema = z.object({\n type: z.literal(\"POLYGON\"),\n points: z.array(PointSchema),\n fillColor: z.string(),\n lineWidth: z.number(),\n lineColor: z.string(),\n id: z.string(),\n})\n\nconst parsePolygon = (\n str: string,\n): z.infer<typeof PolygonShapeOutputSchema> => {\n const [, ...rest] = str.split(\"~\")\n const [pointsStr, fillColor, lineWidth, lineColor, , id] = rest\n\n return {\n type: \"POLYGON\",\n points: parsePoints(pointsStr),\n fillColor,\n lineWidth: Number(lineWidth),\n lineColor,\n id,\n }\n}\n\nexport const PolygonShapeSchema = z\n .string()\n .startsWith(\"PG~\")\n .transform(parsePolygon)\n .pipe(PolygonShapeOutputSchema)\n\nconst PathShapeOutputSchema = z.object({\n type: z.literal(\"PATH\"),\n pathData: z.string(),\n fillColor: z.string(),\n strokeWidth: z.number(),\n strokeColor: z.string(),\n id: z.string(),\n})\n\nconst parsePath = (str: string): z.infer<typeof PathShapeOutputSchema> => {\n const [, pathData, fillColor, strokeWidth, strokeColor, , id] = str.split(\"~\")\n return {\n type: \"PATH\",\n pathData,\n fillColor,\n strokeWidth: mil10ToMm(Number(strokeWidth)),\n strokeColor,\n id,\n }\n}\n\nexport const PathShapeSchema = z\n .string()\n .startsWith(\"PT~\")\n .transform(parsePath)\n .pipe(PathShapeOutputSchema)\n\nconst TextShapeOutputSchema = z.object({\n type: z.literal(\"TEXT\"),\n alignment: z.enum([\"L\", \"C\", \"R\"]),\n x: z.number(),\n y: z.number(),\n rotation: z.number(),\n fontColor: z.string(),\n backgroundColor: z.string().optional(),\n fontSize: z.string(),\n fontWeight: z.enum([\"normal\", \"bold\"]).optional().default(\"normal\"),\n fontStyle: z.enum([\"normal\", \"italic\"]).optional().default(\"normal\"),\n fontDecoration: z.enum([\"\", \"underline\"]),\n content: z.string(),\n textType: z.string(),\n visibility: z.enum([\"0\", \"1\"]),\n mirror: z.string(),\n id: z.string(),\n})\n\nconst parseText = (str: string): z.infer<typeof TextShapeOutputSchema> => {\n const [\n ,\n alignment,\n x,\n y,\n rotation,\n fontColor,\n backgroundColor,\n fontSize,\n fontWeight,\n fontStyle,\n fontDecoration,\n content,\n textType,\n visibility,\n mirror,\n id,\n ] = str.split(\"~\")\n return {\n type: \"TEXT\",\n alignment: alignment as \"L\" | \"C\" | \"R\",\n x: Number(x),\n y: Number(y),\n rotation: Number(rotation),\n fontColor,\n backgroundColor: backgroundColor || undefined,\n fontSize,\n fontWeight: (fontWeight || \"normal\") as \"normal\" | \"bold\",\n fontStyle: (fontStyle || \"normal\") as \"normal\" | \"italic\",\n fontDecoration: fontDecoration as \"\" | \"underline\",\n content,\n textType,\n visibility: visibility as \"0\" | \"1\",\n mirror,\n id,\n }\n}\n\nexport const TextShapeSchema = z\n .string()\n .startsWith(\"T~\")\n .transform(parseText)\n .pipe(TextShapeOutputSchema)\n\nexport const SingleLetterShapeSchema = z\n .string()\n .transform((x) => {\n // We do some discrimination here for better errors\n if (x.startsWith(\"R~\")) return RectangleShapeSchema.parse(x)\n if (x.startsWith(\"E~\")) return EllipseShapeSchema.parse(x)\n if (x.startsWith(\"P~\")) return PinShapeSchema.parse(x)\n if (x.startsWith(\"PL~\")) return PolylineShapeSchema.parse(x)\n if (x.startsWith(\"PG~\")) return PolygonShapeSchema.parse(x)\n if (x.startsWith(\"PT~\")) return PathShapeSchema.parse(x)\n if (x.startsWith(\"T~\")) return TextShapeSchema.parse(x)\n if (x.startsWith(\"A~\")) return ArcShapeSchema.parse(x)\n throw new Error(`Invalid shape type: ${x}`)\n })\n .pipe(\n z.union([\n RectangleShapeOutputSchema,\n EllipseShapeOutputSchema,\n PinShapeOutputSchema,\n PolylineShapeOutputSchema,\n PolygonShapeOutputSchema,\n PathShapeOutputSchema,\n TextShapeOutputSchema,\n ArcShapeOutputSchema,\n ]),\n )\n\nexport type SingleLetterShape = z.infer<typeof SingleLetterShapeSchema>\n","import {\n EasyEdaJsonSchema,\n type BetterEasyEdaJson,\n} from \"lib/schemas/easy-eda-json-schema\"\nimport { su } from \"@tscircuit/circuit-json-util\"\nimport { generateTypescriptComponent } from \"./generate-typescript-component\"\nimport { convertEasyEdaJsonToCircuitJson } from \"lib/convert-easyeda-json-to-tscircuit-soup-json\"\nimport { normalizeManufacturerPartNumber } from \"lib/utils/normalize-manufacturer-part-number\"\n\nexport const convertRawEasyToTsx = async (rawEasy: any) => {\n const betterEasy = EasyEdaJsonSchema.parse(rawEasy)\n const result = await convertBetterEasyToTsx({\n betterEasy,\n })\n return result\n}\n\nexport const convertBetterEasyToTsx = async ({\n betterEasy,\n}: {\n betterEasy: BetterEasyEdaJson\n}): Promise<string> => {\n const circuitJson = convertEasyEdaJsonToCircuitJson(betterEasy, {\n useModelCdn: true,\n shouldRecenter: true,\n })\n const rawPn = betterEasy.dataStr.head.c_para[\"Manufacturer Part\"]\n const pn = rawPn ? normalizeManufacturerPartNumber(rawPn) : \"unknown\"\n const sourcePorts = su(circuitJson).source_port.list()\n\n const pinLabels: Record<string, string[]> = {}\n const sortedPorts = sourcePorts.sort((a, b) => {\n const aNum = Number.parseInt(a.name.replace(\"pin\", \"\"))\n const bNum = Number.parseInt(b.name.replace(\"pin\", \"\"))\n return aNum - bNum\n })\n for (const sourcePort of sortedPorts) {\n pinLabels[sourcePort.name] = [\n sourcePort.name,\n ...(sourcePort.port_hints ?? []),\n ]\n }\n\n const [cadComponent] = su(circuitJson).cad_component.list()\n let modelObjUrl: string | undefined\n if (cadComponent?.model_obj_url) {\n const isValidUrl = await checkModelObjUrlValidity(\n cadComponent.model_obj_url,\n )\n if (isValidUrl) {\n modelObjUrl = cadComponent.model_obj_url\n }\n }\n\n const supplierPartNumbers: Record<string, string[]> = {\n jlcpcb: [betterEasy.lcsc.number],\n }\n\n return generateTypescriptComponent({\n componentName: pn,\n manufacturerPartNumber: pn,\n pinLabels,\n\n objUrl: modelObjUrl,\n circuitJson,\n supplierPartNumbers,\n })\n}\n\nconst checkModelObjUrlValidity = async (url: string): Promise<boolean> => {\n try {\n const response = await fetch(url, { method: \"HEAD\" })\n return response.status === 200\n } catch (error) {\n console.error(`Error checking model object URL ${url}:`, error)\n return false\n }\n}\n","import { mmStr } from \"@tscircuit/mm\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport { su } from \"@tscircuit/circuit-json-util\"\n\nexport const generateFootprintTsx = (\n circuitJson: AnyCircuitElement[],\n): string => {\n const holes = su(circuitJson).pcb_hole.list()\n const platedHoles = su(circuitJson).pcb_plated_hole.list()\n const smtPads = su(circuitJson).pcb_smtpad.list()\n const vias = su(circuitJson).pcb_via.list()\n const silkscreenPaths = su(circuitJson).pcb_silkscreen_path.list()\n const silkscreenTexts = su(circuitJson).pcb_silkscreen_text.list()\n\n const elementStrings: string[] = []\n\n for (const hole of holes) {\n if (hole.hole_shape === \"circle\") {\n elementStrings.push(\n `<hole pcbX=\"${mmStr(hole.x)}\" pcbY=\"${mmStr(hole.y)}\" diameter=\"${mmStr(hole.hole_diameter)}\" />`,\n )\n } else if (hole.hole_shape === \"oval\") {\n console.warn(\"Unhandled oval hole in conversion (needs implementation)\")\n }\n }\n\n for (const platedHole of platedHoles) {\n if (platedHole.shape === \"oval\" || platedHole.shape === \"pill\") {\n elementStrings.push(\n `<platedhole portHints={${JSON.stringify(platedHole.port_hints)}} pcbX=\"${mmStr(platedHole.x)}\" pcbY=\"${mmStr(platedHole.y)}\" outerHeight=\"${mmStr(platedHole.outer_height)}\" outerWidth=\"${mmStr(platedHole.outer_width)}\" holeHeight=\"${mmStr(platedHole.hole_height)}\" holeWidth=\"${mmStr(platedHole.hole_width)}\" shape=\"${platedHole.shape}\" />`,\n )\n } else if (platedHole.shape === \"circle\") {\n elementStrings.push(\n `<platedhole portHints={${JSON.stringify(platedHole.port_hints)}} pcbX=\"${mmStr(platedHole.x)}\" pcbY=\"${mmStr(platedHole.y)}\" outerDiameter=\"${mmStr(platedHole.outer_diameter)}\" holeDiameter=\"${mmStr(platedHole.hole_diameter)}\" shape=\"circle\" />`,\n )\n }\n }\n\n for (const smtPad of smtPads) {\n if (smtPad.shape === \"circle\") {\n elementStrings.push(\n `<smtpad portHints={${JSON.stringify(smtPad.port_hints)}} pcbX=\"${mmStr(smtPad.x)}\" pcbY=\"${mmStr(smtPad.y)}\" radius=\"${mmStr(smtPad.radius)}\" shape=\"circle\" />`,\n )\n } else if (smtPad.shape === \"rect\") {\n elementStrings.push(\n `<smtpad portHints={${JSON.stringify(smtPad.port_hints)}} pcbX=\"${mmStr(smtPad.x)}\" pcbY=\"${mmStr(smtPad.y)}\" width=\"${mmStr(smtPad.width)}\" height=\"${mmStr(smtPad.height)}\" shape=\"rect\" />`,\n )\n }\n }\n\n for (const via of vias) {\n elementStrings.push(\n `<via pcbX=\"${mmStr(via.x)}\" pcbY=\"${mmStr(via.y)}\" outerDiameter=\"${mmStr(via.outer_diameter)}\" holeDiameter=\"${mmStr(via.hole_diameter)}\" layers={${JSON.stringify(via.layers)}} />`,\n )\n }\n\n for (const silkscreenPath of silkscreenPaths) {\n elementStrings.push(\n `<silkscreenpath route={${JSON.stringify(silkscreenPath.route)}} />`,\n )\n }\n\n for (const silkscreenText of silkscreenTexts) {\n elementStrings.push(\n `<silkscreentext text=\"${silkscreenText.text}\" pcbX=\"${mmStr(silkscreenText.anchor_position.x)}\" pcbY=\"${mmStr(silkscreenText.anchor_position.y)}\" anchorAlignment=\"${silkscreenText.anchor_alignment}\" ${silkscreenText.font_size ? `fontSize=\"${mmStr(silkscreenText.font_size)}\"` : \"\"} />`,\n )\n }\n\n return `\n <footprint>\n ${elementStrings.join(\"\\n\")}\n </footprint>\n `.trim()\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport type { ChipProps } from \"@tscircuit/props\"\nimport { generateFootprintTsx } from \"../generate-footprint-tsx\"\n\ninterface Params {\n pinLabels: ChipProps[\"pinLabels\"]\n componentName: string\n objUrl?: string\n circuitJson: AnyCircuitElement[]\n supplierPartNumbers: ChipProps[\"supplierPartNumbers\"]\n manufacturerPartNumber: string\n}\n\nexport const generateTypescriptComponent = ({\n pinLabels,\n componentName,\n objUrl,\n circuitJson,\n supplierPartNumbers,\n manufacturerPartNumber,\n}: Params) => {\n // Ensure pinLabels is defined\n const safePinLabels = pinLabels ?? {}\n const cadComponent = circuitJson.find((item) => item.type === \"cad_component\")\n const footprintTsx = generateFootprintTsx(circuitJson)\n\n // Simplify pin labels to include only the second element\n const simplifiedPinLabels = Object.fromEntries(\n Object.entries(safePinLabels).map(([pin, labels]) => {\n // Ensure labels is an array and has a second element\n if (Array.isArray(labels) && labels.length > 1) {\n return [pin, [labels[1]]]\n }\n return [pin, labels] // Fallback to original if not an array or missing second element\n }),\n )\n\n const pinLabelsString = Object.entries(simplifiedPinLabels)\n .map(([pin, labels]) => ` ${pin}: ${JSON.stringify(labels)}`)\n .join(\",\\n\")\n\n return `\nimport type { ChipProps } from \"@tscircuit/props\"\n\nconst pinLabels = {\n${pinLabelsString}\n} as const\n\nexport const ${componentName} = (props: ChipProps<typeof pinLabels>) => {\n return (\n <chip\n pinLabels={pinLabels}\n supplierPartNumbers={${JSON.stringify(supplierPartNumbers, null, \" \")}}\n manufacturerPartNumber=\"${manufacturerPartNumber}\"\n footprint={${footprintTsx}}\n ${\n objUrl\n ? `cadModel={{\n objUrl: \"${objUrl}\",\n rotationOffset: { x: 0, y: 0, z: ${cadComponent?.rotation?.z ?? 0} },\n positionOffset: { x: 0, y: 0, z: 0 },\n }}`\n : \"\"\n }\n {...props}\n />\n )\n}\n`.trim()\n}\n","export function normalizeManufacturerPartNumber(partNumber: string): string {\n // Step 1: Replace dashes and invalid symbols with underscores\n let normalized = partNumber\n .replace(/[-]/g, \"_\")\n .replace(/[^a-zA-Z0-9_$]/g, \"_\")\n\n // Step 2: If the string starts with a number, prepend 'A_'\n if (/^\\d/.test(normalized)) {\n normalized = \"A_\" + normalized\n }\n\n return normalized\n}\n","import { fetchEasyEDAComponent } from \"lib/websafe/fetch-easyeda-json\"\nimport { convertEasyEdaJsonToTscircuitSoupJson } from \"lib/convert-easyeda-json-to-tscircuit-soup-json\"\nimport fs from \"fs/promises\"\nimport { EasyEdaJsonSchema } from \"lib/schemas/easy-eda-json-schema\"\nimport { convertRawEasyToTsx } from \"lib/websafe/convert-to-typescript-component\"\nimport * as path from \"path\"\nimport { normalizeManufacturerPartNumber } from \"lib/utils/normalize-manufacturer-part-number\"\n\nexport const convertEasyEdaJsonToVariousFormats = async ({\n jlcpcbPartNumberOrFilepath,\n outputFilename,\n outputFormat,\n}: {\n jlcpcbPartNumberOrFilepath: string\n outputFilename: string\n outputFormat: string\n}) => {\n let rawEasyEdaJson\n if (\n jlcpcbPartNumberOrFilepath.includes(\".\") ||\n jlcpcbPartNumberOrFilepath.includes(\"/\")\n ) {\n rawEasyEdaJson = JSON.parse(\n await fs.readFile(jlcpcbPartNumberOrFilepath, \"utf-8\"),\n )\n } else {\n rawEasyEdaJson = await fetchEasyEDAComponent(jlcpcbPartNumberOrFilepath)\n }\n\n const tsxExtension = \"tsx\"\n if (outputFormat === \"ts\") outputFormat = tsxExtension\n\n if (!outputFilename && outputFormat) {\n let filename = path.basename(jlcpcbPartNumberOrFilepath).split(\".\")[0]\n\n if (outputFormat === tsxExtension) {\n const {\n dataStr: {\n head: {\n c_para: { \"Manufacturer Part\": manufacturerPartNumber },\n },\n },\n } = rawEasyEdaJson\n\n filename = normalizeManufacturerPartNumber(manufacturerPartNumber)\n }\n\n outputFilename = `${filename}.${outputFormat}`\n }\n\n if (!outputFilename) {\n console.log(\"specify --output file (-o) or --output-format\")\n process.exit(1)\n }\n\n if (outputFilename.endsWith(\".raweasy.json\")) {\n await fs.writeFile(outputFilename, JSON.stringify(rawEasyEdaJson, null, 2))\n console.log(`Saved raw EasyEDA JSON: ${outputFilename}`)\n return\n }\n\n try {\n const betterEasy = EasyEdaJsonSchema.parse(rawEasyEdaJson)\n const tscircuitSoup = convertEasyEdaJsonToTscircuitSoupJson(betterEasy)\n\n if (\n outputFilename.endsWith(\".soup.json\") ||\n outputFilename.endsWith(\".circuit.json\")\n ) {\n await fs.writeFile(outputFilename, JSON.stringify(tscircuitSoup, null, 2))\n console.log(\n `[${jlcpcbPartNumberOrFilepath}] Converted to circuit json: ${outputFilename}`,\n )\n } else if (outputFilename.endsWith(\".kicad_mod\")) {\n // TODO: Implement conversion to KiCad footprint\n console.log(\"Conversion to KiCad footprint not yet implemented\")\n } else if (outputFilename.endsWith(\".bettereasy.json\")) {\n await fs.writeFile(outputFilename, JSON.stringify(betterEasy, null, 2))\n console.log(\n `[${jlcpcbPartNumberOrFilepath}] Saved better EasyEDA JSON: ${outputFilename}`,\n )\n } else if (\n outputFilename.endsWith(\".tsx\") ||\n outputFilename.endsWith(\".ts\")\n ) {\n const tsComp = await convertRawEasyToTsx(rawEasyEdaJson)\n await fs.writeFile(outputFilename, tsComp)\n console.log(\n `[${jlcpcbPartNumberOrFilepath}] Saved TypeScript component: ${outputFilename}`,\n )\n } else {\n console.error(\"Unsupported output format\")\n }\n } catch (error: any) {\n console.error(\"Error:\", error.message)\n throw error\n }\n}\n"],"mappings":"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","names":["path","angle","pcb_component","fetch","z","pairs","z","PointSchema","z","path","parsePoints","z","su","su"]}
package/dist/main.cjs CHANGED
@@ -133448,7 +133448,7 @@ var import_promises2 = __toESM(require("fs/promises"), 1);
133448
133448
  var package_default2 = {
133449
133449
  name: "easyeda",
133450
133450
  type: "module",
133451
- version: "0.0.201",
133451
+ version: "0.0.202",
133452
133452
  files: [
133453
133453
  "dist"
133454
133454
  ],