From 090ea2130c6ed149ee18a7e12eca1b50928211aa Mon Sep 17 00:00:00 2001 From: Severin Ibarluzea Date: Sun, 6 Jul 2025 17:08:50 -0700 Subject: [PATCH] Add TQFP footprint support --- bun.lock | 8 ++++++-- package.json | 2 +- src/fn/index.ts | 1 + src/fn/tqfp.ts | 11 +++++++++++ src/footprinter.ts | 1 + .../tqfp64_w10_h10_pl1_pw0.25mm.snap.svg | 1 + tests/get-footprint-names.test.ts | 1 + tests/tqfp.test.ts | 12 ++++++++++++ 8 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src/fn/tqfp.ts create mode 100644 tests/__snapshots__/tqfp64_w10_h10_pl1_pw0.25mm.snap.svg create mode 100644 tests/tqfp.test.ts diff --git a/bun.lock b/bun.lock index 6afde8d9..e5272ca5 100644 --- a/bun.lock +++ b/bun.lock @@ -5,7 +5,7 @@ "name": "@tscircuit/footprinter", "dependencies": { "@tscircuit/mm": "^0.0.8", - "zod": "^3.23.8", + "zod": "^3.25.74", }, "devDependencies": { "@biomejs/biome": "^1.9.4", @@ -517,10 +517,14 @@ "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], - "zod": ["zod@3.25.64", "", {}, "sha512-hbP9FpSZf7pkS7hRVUrOjhwKJNyampPgtXKc3AN6DsWtoHsg2Sb4SQaS4Tcay380zSwd2VPo9G9180emBACp5g=="], + "zod": ["zod@3.25.74", "", {}, "sha512-J8poo92VuhKjNknViHRAIuuN6li/EwFbAC8OedzI8uxpEPGiXHGQu9wemIAioIpqgfB4SySaJhdk0mH5Y4ICBg=="], "@jridgewell/gen-mapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + "@tscircuit/footprinter/zod": ["zod@3.25.64", "", {}, "sha512-hbP9FpSZf7pkS7hRVUrOjhwKJNyampPgtXKc3AN6DsWtoHsg2Sb4SQaS4Tcay380zSwd2VPo9G9180emBACp5g=="], + + "circuit-json/zod": ["zod@3.25.64", "", {}, "sha512-hbP9FpSZf7pkS7hRVUrOjhwKJNyampPgtXKc3AN6DsWtoHsg2Sb4SQaS4Tcay380zSwd2VPo9G9180emBACp5g=="], + "circuit-to-svg/@types/node": ["@types/node@22.15.31", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jnVe5ULKl6tijxUhvQeNbQG/84fHfg+yMak02cT8QVhBx/F05rAVxCGBYYTh2EKz22D6JF5ktXuNwdx7b9iEGw=="], "color/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], diff --git a/package.json b/package.json index 9365ad85..471311ff 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ }, "dependencies": { "@tscircuit/mm": "^0.0.8", - "zod": "^3.23.8" + "zod": "^3.25.74" }, "peerDependencies": { "circuit-json": "*" diff --git a/src/fn/index.ts b/src/fn/index.ts index 2a1eda53..17ad49e4 100644 --- a/src/fn/index.ts +++ b/src/fn/index.ts @@ -25,6 +25,7 @@ export { pushbutton } from "./pushbutton" export { stampboard } from "./stampboard" export { stampreceiver } from "./stampreceiver" export { lqfp } from "./lqfp" +export { tqfp } from "./tqfp" export { breakoutheaders } from "./breakoutheaders" export { hc49 } from "./hc49" export { pad } from "./pad" diff --git a/src/fn/tqfp.ts b/src/fn/tqfp.ts new file mode 100644 index 00000000..eebe75ad --- /dev/null +++ b/src/fn/tqfp.ts @@ -0,0 +1,11 @@ +import type { AnyCircuitElement } from "circuit-json" +import type { z } from "zod" +import { qfp, qfp_def } from "./qfp" + +export const tqfp_def = qfp_def + +export const tqfp = ( + raw_params: z.input, +): { circuitJson: AnyCircuitElement[]; parameters: any } => { + return qfp(raw_params) +} diff --git a/src/footprinter.ts b/src/footprinter.ts index b9ff98eb..8f661c90 100644 --- a/src/footprinter.ts +++ b/src/footprinter.ts @@ -112,6 +112,7 @@ export type Footprinter = { ms013: () => FootprinterParamsBuilder<"w" | "p"> ms012: () => FootprinterParamsBuilder<"w" | "p"> lqfp: (num_pins?: number) => FootprinterParamsBuilder<"w" | "h" | "pl" | "pw"> + tqfp: (num_pins?: number) => FootprinterParamsBuilder<"w" | "h" | "pl" | "pw"> sma: () => FootprinterParamsBuilder<"w" | "h" | "p" | "pl" | "pw"> smf: () => FootprinterParamsBuilder<"w" | "h" | "p" | "pl" | "pw"> smb: () => FootprinterParamsBuilder<"w" | "h" | "p" | "pl" | "pw"> diff --git a/tests/__snapshots__/tqfp64_w10_h10_pl1_pw0.25mm.snap.svg b/tests/__snapshots__/tqfp64_w10_h10_pl1_pw0.25mm.snap.svg new file mode 100644 index 00000000..b581561f --- /dev/null +++ b/tests/__snapshots__/tqfp64_w10_h10_pl1_pw0.25mm.snap.svg @@ -0,0 +1 @@ +{REF} diff --git a/tests/get-footprint-names.test.ts b/tests/get-footprint-names.test.ts index de9d19ab..6dcf3a00 100644 --- a/tests/get-footprint-names.test.ts +++ b/tests/get-footprint-names.test.ts @@ -21,6 +21,7 @@ test("getFootprintNamesByType groups footprint names by component type", () => { expect(normalFootprintNames).toContain("dip") expect(normalFootprintNames).toContain("soic") expect(normalFootprintNames).toContain("qfp") + expect(normalFootprintNames).toContain("tqfp") expect(normalFootprintNames).not.toContain("res") expect(normalFootprintNames).not.toContain("cap") expect(normalFootprintNames).not.toContain("diode") diff --git a/tests/tqfp.test.ts b/tests/tqfp.test.ts new file mode 100644 index 00000000..81ad0046 --- /dev/null +++ b/tests/tqfp.test.ts @@ -0,0 +1,12 @@ +import { test, expect } from "bun:test" +import { convertCircuitJsonToPcbSvg } from "circuit-to-svg" +import { fp } from "../src/footprinter" + +test("tqfp64_w10_h10_pl1_pw0.25mm", () => { + const soup = fp.string("tqfp64_w10_h10_pl1_pw0.25mm").circuitJson() + const svgContent = convertCircuitJsonToPcbSvg(soup) + expect(svgContent).toMatchSvgSnapshot( + import.meta.path, + "tqfp64_w10_h10_pl1_pw0.25mm", + ) +})