ShiboSoftwareDev/mspm0g3507-usb-c-dev-board

The circuit assembles a USB-C port with integrated ESD protection, power regulation, UART interface, and microcontroller (MSPM0G3507) with supporting components for USB data lines, CC termination, I2C, SPI, reset circuitry, and indicator LEDs.

Version
1.4.2
License
unset
Stars
0

scripts/check-jlc-stock.mjs

import { readFileSync } from "node:fs"

const circuitPath = process.argv[2] ?? "dist/index/circuit.json"
const circuit = JSON.parse(readFileSync(circuitPath, "utf8"))
const uniqueParts = new Map()

for (const component of circuit.filter((element) => element.type === "source_component")) {
  const partNumber = component.supplier_part_numbers?.jlcpcb?.[0]
  const mpn = component.manufacturer_part_number
  if (!partNumber || !mpn) throw new Error(`${component.name} is missing JLCPCB or MPN metadata`)
  const part = uniqueParts.get(partNumber) ?? { partNumber, mpn, designators: [] }
  if (part.mpn !== mpn) throw new Error(`${partNumber} is assigned to both ${part.mpn} and ${mpn}`)
  part.designators.push(component.name)
  uniqueParts.set(partNumber, part)
}

const searchCatalog = async (query) => {
  const params = new URLSearchParams({ limit: "10", q: query })
  const response = await fetch(`https://jlcsearch.tscircuit.com/api/search?${params}`)
  if (!response.ok) return { components: [], status: response.status }
  return { ...(await response.json()), status: response.status }
}

const results = await Promise.all([...uniqueParts.values()].map(async (part) => {
  const lcscNumber = Number(part.partNumber.slice(1))
  let result = await searchCatalog(part.partNumber)
  let match = result.components?.find((component) => component.lcsc === lcscNumber)
  if (!match) {
    result = await searchCatalog(part.mpn)
    match = result.components?.find((component) => component.lcsc === lcscNumber)
  }
  if (!match) throw new Error(`${part.partNumber} was not found in the live parts catalog`)
  if (match.mfr !== part.mpn) throw new Error(`${part.partNumber} is ${match.mfr}, but the BOM specifies ${part.mpn}`)
  if (!(match.stock > 0)) throw new Error(`${part.partNumber} (${part.mpn}) is out of stock`)
  return { ...part, stock: match.stock }
}))

results.sort((a, b) => a.partNumber.localeCompare(b.partNumber, undefined, { numeric: true }))
console.log(JSON.stringify({ checkedAt: new Date().toISOString(), parts: results }, null, 2))