@tscircuit/footprinter 0.0.204 → 0.0.206

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.d.ts CHANGED
@@ -377,7 +377,7 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
377
377
  nosquareplating: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
378
378
  nopinlabels: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
379
379
  doublesidedpinlabel: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
380
- backsidelabel: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
380
+ bottomsidepinlabel: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
381
381
  }, "strip", z.ZodTypeAny, {
382
382
  fn: string;
383
383
  num_pins: number;
@@ -393,7 +393,7 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
393
393
  nosquareplating: boolean;
394
394
  nopinlabels: boolean;
395
395
  doublesidedpinlabel: boolean;
396
- backsidelabel: boolean;
396
+ bottomsidepinlabel: boolean;
397
397
  male?: boolean | undefined;
398
398
  female?: boolean | undefined;
399
399
  }, {
@@ -413,7 +413,7 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
413
413
  nosquareplating?: boolean | undefined;
414
414
  nopinlabels?: boolean | undefined;
415
415
  doublesidedpinlabel?: boolean | undefined;
416
- backsidelabel?: boolean | undefined;
416
+ bottomsidepinlabel?: boolean | undefined;
417
417
  }>, {
418
418
  pinlabelAnchorSide: "top" | "bottom" | "left" | "right";
419
419
  male: boolean;
@@ -432,7 +432,7 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
432
432
  nosquareplating: boolean;
433
433
  nopinlabels: boolean;
434
434
  doublesidedpinlabel: boolean;
435
- backsidelabel: boolean;
435
+ bottomsidepinlabel: boolean;
436
436
  }, {
437
437
  fn: string;
438
438
  num_pins?: number | undefined;
@@ -450,7 +450,7 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
450
450
  nosquareplating?: boolean | undefined;
451
451
  nopinlabels?: boolean | undefined;
452
452
  doublesidedpinlabel?: boolean | undefined;
453
- backsidelabel?: boolean | undefined;
453
+ bottomsidepinlabel?: boolean | undefined;
454
454
  }>, {
455
455
  pinlabelAnchorSide: "top" | "bottom" | "left" | "right";
456
456
  male: boolean;
@@ -469,7 +469,7 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
469
469
  nosquareplating: boolean;
470
470
  nopinlabels: boolean;
471
471
  doublesidedpinlabel: boolean;
472
- backsidelabel: boolean;
472
+ bottomsidepinlabel: boolean;
473
473
  }, {
474
474
  fn: string;
475
475
  num_pins?: number | undefined;
@@ -487,7 +487,7 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
487
487
  nosquareplating?: boolean | undefined;
488
488
  nopinlabels?: boolean | undefined;
489
489
  doublesidedpinlabel?: boolean | undefined;
490
- backsidelabel?: boolean | undefined;
490
+ bottomsidepinlabel?: boolean | undefined;
491
491
  }>, z.ZodEffects<z.ZodObject<{
492
492
  fn: z.ZodString;
493
493
  cc: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
@@ -1168,7 +1168,7 @@ type Footprinter = {
1168
1168
  ssop: (num_pins?: number) => FootprinterParamsBuilder<"w" | "p">;
1169
1169
  tssop: (num_pins?: number) => FootprinterParamsBuilder<"w" | "p">;
1170
1170
  dfn: (num_pins?: number) => FootprinterParamsBuilder<"w" | "p">;
1171
- pinrow: (num_pins?: number) => FootprinterParamsBuilder<"p" | "id" | "od" | "male" | "female" | "rows" | "pinlabeltextalignleft" | "pinlabeltextaligncenter" | "pinlabeltextalignright" | "pinlabelverticallyinverted" | "pinlabelorthogonal" | "nosquareplating" | "nopinlabels" | "doublesidedpinlabel" | "backsidelabel">;
1171
+ pinrow: (num_pins?: number) => FootprinterParamsBuilder<"p" | "id" | "od" | "male" | "female" | "rows" | "pinlabeltextalignleft" | "pinlabeltextaligncenter" | "pinlabeltextalignright" | "pinlabelverticallyinverted" | "pinlabelorthogonal" | "nosquareplating" | "nopinlabels" | "doublesidedpinlabel" | "bottomsidepinlabel">;
1172
1172
  axial: () => FootprinterParamsBuilder<"p" | "id" | "od">;
1173
1173
  hc49: () => FootprinterParamsBuilder<"p" | "id" | "od" | "w" | "h">;
1174
1174
  to220: () => FootprinterParamsBuilder<"w" | "h" | "p" | "id" | "od">;
@@ -1185,7 +1185,7 @@ type Footprinter = {
1185
1185
  smc: () => FootprinterParamsBuilder<"w" | "h" | "p" | "pw" | "pl">;
1186
1186
  minimelf: () => FootprinterParamsBuilder<"w" | "h" | "p" | "pw" | "pl">;
1187
1187
  melf: () => FootprinterParamsBuilder<"w" | "h" | "p" | "pw" | "pl">;
1188
- jst: () => FootprinterParamsBuilder<"w" | "h" | "p" | "id" | "pw" | "pl">;
1188
+ jst: () => FootprinterParamsBuilder<"w" | "h" | "p" | "id" | "pw" | "pl" | "ph" | "sh">;
1189
1189
  micromelf: () => FootprinterParamsBuilder<"w" | "h" | "p" | "pw" | "pl">;
1190
1190
  ms013: () => FootprinterParamsBuilder<"w" | "p">;
1191
1191
  ms012: () => FootprinterParamsBuilder<"w" | "p">;
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ __export(fn_exports, {
29
29
  msop: () => msop,
30
30
  pad: () => pad,
31
31
  pinrow: () => pinrow,
32
- platedhole: () => platedhole3,
32
+ platedhole: () => platedhole2,
33
33
  potentiometer: () => potentiometer,
34
34
  pushbutton: () => pushbutton,
35
35
  qfn: () => qfn,
@@ -1662,7 +1662,7 @@ var pinrow_def = z12.object({
1662
1662
  nosquareplating: z12.boolean().optional().default(false).describe("do not use rectangular pad for pin 1"),
1663
1663
  nopinlabels: z12.boolean().optional().default(false).describe("omit silkscreen pin labels"),
1664
1664
  doublesidedpinlabel: z12.boolean().optional().default(false).describe("add silkscreen pins in top and bottom layers"),
1665
- backsidelabel: z12.boolean().optional().default(false).describe(
1665
+ bottomsidepinlabel: z12.boolean().optional().default(false).describe(
1666
1666
  "place the silkscreen reference text on the bottom layer instead of top"
1667
1667
  )
1668
1668
  }).transform((data) => {
@@ -1697,7 +1697,7 @@ var pinrow = (raw_params) => {
1697
1697
  pinlabeltextalignright,
1698
1698
  nopinlabels,
1699
1699
  doublesidedpinlabel,
1700
- backsidelabel
1700
+ bottomsidepinlabel
1701
1701
  } = parameters;
1702
1702
  let pinlabelTextAlign = "center";
1703
1703
  if (pinlabeltextalignleft) pinlabelTextAlign = "left";
@@ -1742,7 +1742,7 @@ var pinrow = (raw_params) => {
1742
1742
  anchorSide: pinlabelAnchorSide
1743
1743
  });
1744
1744
  if (!nopinlabels) {
1745
- if (!backsidelabel) {
1745
+ if (!bottomsidepinlabel) {
1746
1746
  holes.push(
1747
1747
  silkscreenPin({
1748
1748
  fs: od / 5,
@@ -5365,43 +5365,135 @@ import {
5365
5365
  import { z as z47 } from "zod";
5366
5366
  var jst_def = z47.object({
5367
5367
  fn: z47.string(),
5368
- p: length35.optional().default("2.2mm"),
5369
- id: length35.optional().default("0.70mm"),
5370
- pw: length35.optional().default("1.20mm"),
5371
- pl: length35.optional().default("1.20mm"),
5372
- w: length35.optional().default("6mm"),
5373
- h: length35.optional().default("5mm")
5368
+ p: length35.optional(),
5369
+ id: length35.optional(),
5370
+ pw: length35.optional(),
5371
+ pl: length35.optional(),
5372
+ w: length35.optional(),
5373
+ h: length35.optional(),
5374
+ sh: z47.union([z47.boolean(), z47.string(), z47.number()]).optional().transform((v) => {
5375
+ if (typeof v === "string") {
5376
+ const n = Number(v);
5377
+ return Number.isNaN(n) ? true : n;
5378
+ }
5379
+ return v;
5380
+ }).describe(
5381
+ 'JST SH (Surface-mount) connector family. SH stands for "Super High-density".'
5382
+ ),
5383
+ ph: z47.boolean().optional().describe(
5384
+ 'JST PH (Through-hole) connector family. PH stands for "Pin Header".'
5385
+ ),
5386
+ string: z47.string().optional()
5374
5387
  });
5388
+ var variantDefaults = {
5389
+ ph: {
5390
+ p: length35.parse("2.2mm"),
5391
+ id: length35.parse("0.70mm"),
5392
+ pw: length35.parse("1.20mm"),
5393
+ pl: length35.parse("1.20mm"),
5394
+ w: length35.parse("6mm"),
5395
+ h: length35.parse("5mm")
5396
+ },
5397
+ sh: {
5398
+ p: length35.parse("1mm"),
5399
+ pw: length35.parse("0.6mm"),
5400
+ pl: length35.parse("1.55mm"),
5401
+ w: length35.parse("5.8mm"),
5402
+ h: length35.parse("7.8mm")
5403
+ }
5404
+ };
5405
+ function getVariant(params) {
5406
+ if (params.sh) return "sh";
5407
+ if (params.ph) return "ph";
5408
+ return "ph";
5409
+ }
5410
+ function generatePads(variant, numPins, p, id, pw, pl) {
5411
+ const pads = [];
5412
+ if (variant === "ph") {
5413
+ const half_p = p / 2;
5414
+ pads.push(platedHoleWithRectPad(1, -half_p, 2, id, pw, pl));
5415
+ pads.push(platedHoleWithRectPad(2, half_p, 2, id, pw, pl));
5416
+ } else {
5417
+ const startX = -((numPins - 1) / 2) * p;
5418
+ for (let i = 0; i < numPins; i++) {
5419
+ const x = startX + i * p;
5420
+ console.log("x si", x);
5421
+ pads.push(rectpad(i + 1, x, -1.325, pw, pl));
5422
+ }
5423
+ const sideOffset = (numPins - 1) / 2 * p + 1.3;
5424
+ console.log("offset", sideOffset);
5425
+ pads.push(rectpad(numPins + 1, -sideOffset, 1.22, 1.2, 1.8));
5426
+ pads.push(rectpad(numPins + 2, sideOffset, 1.22, 1.2, 1.8));
5427
+ }
5428
+ return pads;
5429
+ }
5430
+ function generateSilkscreenBody(variant, w, h) {
5431
+ if (variant === "ph") {
5432
+ return {
5433
+ type: "pcb_silkscreen_path",
5434
+ layer: "top",
5435
+ pcb_component_id: "",
5436
+ route: [
5437
+ { x: -3, y: 3 },
5438
+ { x: 3, y: 3 },
5439
+ { x: 3, y: -2 },
5440
+ { x: -3, y: -2 },
5441
+ { x: -3, y: 3 }
5442
+ ],
5443
+ stroke_width: 0.1,
5444
+ pcb_silkscreen_path_id: ""
5445
+ };
5446
+ } else {
5447
+ return {
5448
+ type: "pcb_silkscreen_path",
5449
+ layer: "top",
5450
+ pcb_component_id: "",
5451
+ route: [],
5452
+ stroke_width: 0.1,
5453
+ pcb_silkscreen_path_id: ""
5454
+ };
5455
+ }
5456
+ }
5375
5457
  var jst = (raw_params) => {
5376
- const parameters = jst_def.parse(raw_params);
5377
- const { p, id, pw, pl, h } = parameters;
5378
- const half_p = p / 2;
5379
- const plated_holes = [
5380
- platedHoleWithRectPad(1, -half_p, 2, id, pw, pl),
5381
- platedHoleWithRectPad(2, half_p, 2, id, pw, pl)
5382
- ];
5383
- const silkscreenBody = {
5384
- type: "pcb_silkscreen_path",
5385
- layer: "top",
5386
- pcb_component_id: "",
5387
- route: [
5388
- { x: -3, y: 3 },
5389
- { x: 3, y: 3 },
5390
- { x: 3, y: -2 },
5391
- { x: -3, y: -2 },
5392
- { x: -3, y: 3 }
5393
- ],
5394
- stroke_width: 0.1,
5395
- pcb_silkscreen_path_id: ""
5396
- };
5458
+ const params = jst_def.parse(raw_params);
5459
+ const variant = getVariant(params);
5460
+ const defaults = variantDefaults[variant];
5461
+ const p = params.p ?? defaults.p;
5462
+ const id = params.id ?? defaults.id;
5463
+ const pw = params.pw ?? defaults.pw;
5464
+ const pl = params.pl ?? defaults.pl;
5465
+ const w = params.w ?? defaults.w;
5466
+ const h = params.h ?? defaults.h;
5467
+ let numPins = variant === "sh" ? 4 : 2;
5468
+ if (variant === "sh") {
5469
+ const str = typeof raw_params.string === "string" ? raw_params.string : "";
5470
+ const match = str.match(/sh(\d+)/);
5471
+ if (match && match[1]) {
5472
+ const parsed = parseInt(match[1], 10);
5473
+ if (!Number.isNaN(parsed)) {
5474
+ numPins = parsed;
5475
+ }
5476
+ } else if (typeof params.sh === "number") {
5477
+ numPins = params.sh;
5478
+ }
5479
+ }
5480
+ const pads = generatePads(variant, numPins, p, id, pw, pl);
5481
+ const silkscreenBody = generateSilkscreenBody(variant, w, h);
5397
5482
  const silkscreenRefText = silkscreenRef(0, h / 2 + 1, 0.5);
5398
5483
  return {
5399
- circuitJson: [
5400
- ...plated_holes,
5401
- silkscreenBody,
5402
- silkscreenRefText
5403
- ],
5404
- parameters
5484
+ circuitJson: [...pads, silkscreenBody, silkscreenRefText],
5485
+ parameters: {
5486
+ ...params,
5487
+ p,
5488
+ id,
5489
+ pw,
5490
+ pl,
5491
+ w,
5492
+ h,
5493
+ num_pins: numPins,
5494
+ sh: variant === "sh",
5495
+ ph: variant === "ph"
5496
+ }
5405
5497
  };
5406
5498
  };
5407
5499
 
@@ -6779,7 +6871,7 @@ var platedhole_def = z60.object({
6779
6871
  squarepad: v.squarepad ?? false
6780
6872
  };
6781
6873
  });
6782
- var platedhole3 = (raw_params) => {
6874
+ var platedhole2 = (raw_params) => {
6783
6875
  const params = platedhole_def.parse(raw_params);
6784
6876
  const { d, pd, squarepad } = params;
6785
6877
  return {