@tscircuit/footprinter 0.0.34 → 0.0.36

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/README.md CHANGED
@@ -5,7 +5,8 @@ Footprinter is tscircuit's DSL and micro-builder for creating footprints.
5
5
  You can create very custom footprints using the `<footprint>` element, but the
6
6
  compressability is poor. `footprinter` produces very short, low parameter
7
7
  mini-programs for generating footprints, this makes it suitable for standardized
8
- footprints.
8
+ footprints. You can use it with any component that accepts a footprint prop, e.g.
9
+ `<bug footprint="qfp12_p0.5" />`
9
10
 
10
11
  Here are some example programs:
11
12
 
package/dist/index.cjs CHANGED
@@ -3234,6 +3234,7 @@ __export(fn_exports, {
3234
3234
  quad: () => quad,
3235
3235
  res: () => res,
3236
3236
  soic: () => soic,
3237
+ sot236: () => sot236,
3237
3238
  ssop: () => ssop,
3238
3239
  tssop: () => tssop
3239
3240
  });
@@ -3265,13 +3266,13 @@ var platedhole = (pn, x, y, id, od) => {
3265
3266
  // src/fn/dip.ts
3266
3267
  var import_zod = require("zod");
3267
3268
  var import_soup = __toESM(require_dist(), 1);
3268
- var dip_def = import_zod.z.object({
3269
+ var extendDipDef = (newDefaults) => import_zod.z.object({
3269
3270
  dip: import_zod.z.literal(true),
3270
3271
  num_pins: import_zod.z.number(),
3271
3272
  wide: import_zod.z.boolean().optional(),
3272
3273
  narrow: import_zod.z.boolean().optional(),
3273
3274
  w: import_soup.length.optional(),
3274
- p: import_soup.length.default(import_soup.length.parse("2.54mm")),
3275
+ p: import_soup.length.default(import_soup.length.parse(newDefaults.p ?? "2.54mm")),
3275
3276
  id: import_soup.length.optional(),
3276
3277
  od: import_soup.length.optional()
3277
3278
  }).transform((v) => {
@@ -3289,11 +3290,12 @@ var dip_def = import_zod.z.object({
3289
3290
  } else if (v.narrow) {
3290
3291
  v.w = import_soup.length.parse("300mil");
3291
3292
  } else {
3292
- v.w = import_soup.length.parse("300mil");
3293
+ v.w = import_soup.length.parse(newDefaults.w ?? "300mil");
3293
3294
  }
3294
3295
  }
3295
3296
  return v;
3296
3297
  });
3298
+ var dip_def = extendDipDef({});
3297
3299
  var getCcwDipCoords = (pinCount, pn, w, p) => {
3298
3300
  const ph = pinCount / 2;
3299
3301
  const isLeft = pn <= ph;
@@ -3672,16 +3674,16 @@ var extendSoicDef = (newDefaults) => import_zod5.z.object({
3672
3674
  num_pins: import_zod5.z.number(),
3673
3675
  w: import_soup3.length.default(import_soup3.length.parse(newDefaults.w ?? "5.3mm")),
3674
3676
  p: import_soup3.length.default(import_soup3.length.parse(newDefaults.p ?? "1.27mm")),
3675
- id: import_soup3.length.optional(),
3676
- od: import_soup3.length.optional()
3677
+ pw: import_soup3.length.optional(),
3678
+ pl: import_soup3.length.optional()
3677
3679
  }).transform((v) => {
3678
- if (!v.id && !v.od) {
3679
- v.id = import_soup3.length.parse("0.6mm");
3680
- v.od = import_soup3.length.parse("1.0mm");
3681
- } else if (!v.id) {
3682
- v.id = v.od * (0.6 / 1);
3683
- } else if (!v.od) {
3684
- v.od = v.id * (1 / 0.6);
3680
+ if (!v.pw && !v.pl) {
3681
+ v.pw = import_soup3.length.parse("0.6mm");
3682
+ v.pl = import_soup3.length.parse("1.0mm");
3683
+ } else if (!v.pw) {
3684
+ v.pw = v.pl * (0.6 / 1);
3685
+ } else if (!v.pl) {
3686
+ v.pl = v.pw * (1 / 0.6);
3685
3687
  }
3686
3688
  return v;
3687
3689
  });
@@ -3702,7 +3704,7 @@ var soic = (raw_params) => {
3702
3704
  return soicWithoutParsing(soic_def.parse(raw_params));
3703
3705
  };
3704
3706
  var soicWithoutParsing = (params) => {
3705
- const platedHoles = [];
3707
+ const pads = [];
3706
3708
  for (let i = 0; i < params.num_pins; i++) {
3707
3709
  const { x, y } = getCcwSoicCoords(
3708
3710
  params.num_pins,
@@ -3710,12 +3712,10 @@ var soicWithoutParsing = (params) => {
3710
3712
  params.w,
3711
3713
  params.p ?? 1.27
3712
3714
  );
3713
- platedHoles.push(
3714
- platedhole(i + 1, x, y, params.id ?? "0.6mm", params.od ?? "1mm")
3715
- );
3715
+ pads.push(rectpad(i + 1, x, y, params.pw ?? "0.6mm", params.pl ?? "1mm"));
3716
3716
  }
3717
- const sw = params.w - params.od - 0.4;
3718
- const sh = (params.num_pins / 2 - 1) * params.p + params.od + 0.4;
3717
+ const sw = params.w - params.pw - 0.4;
3718
+ const sh = (params.num_pins / 2 - 1) * params.p + params.pl + 0.4;
3719
3719
  const silkscreenBorder = {
3720
3720
  layer: "top",
3721
3721
  pcb_component_id: "",
@@ -3734,7 +3734,7 @@ var soicWithoutParsing = (params) => {
3734
3734
  ],
3735
3735
  type: "pcb_silkscreen_path"
3736
3736
  };
3737
- return [...platedHoles, silkscreenBorder];
3737
+ return [...pads, silkscreenBorder];
3738
3738
  };
3739
3739
 
3740
3740
  // src/fn/quad.ts
@@ -4092,6 +4092,15 @@ var tssop = (raw_params) => {
4092
4092
  return soicWithoutParsing(tssop_def.parse(raw_params));
4093
4093
  };
4094
4094
 
4095
+ // src/fn/sot236.ts
4096
+ var sot236_def = extendSoicDef({
4097
+ p: "0.95mm",
4098
+ w: "1.6mm"
4099
+ });
4100
+ var sot236 = (params) => {
4101
+ return soicWithoutParsing(sot236_def.parse(params));
4102
+ };
4103
+
4095
4104
  // src/helpers/is-not-null.ts
4096
4105
  function isNotNull(value) {
4097
4106
  return value !== null;
@@ -4134,14 +4143,19 @@ var footprinter = () => {
4134
4143
  }
4135
4144
  return (v) => {
4136
4145
  if (Object.keys(target).length === 0) {
4137
- target[prop] = true;
4138
- target.fn = prop;
4139
- if (prop === "res" || prop === "cap") {
4140
- if (v) {
4141
- target.imperial = v;
4142
- }
4146
+ if (`${prop}${v}` in fn_exports) {
4147
+ target[`${prop}${v}`] = true;
4148
+ target.fn = `${prop}${v}`;
4143
4149
  } else {
4144
- target.num_pins = Number.parseFloat(v);
4150
+ target[prop] = true;
4151
+ target.fn = prop;
4152
+ if (prop === "res" || prop === "cap") {
4153
+ if (v) {
4154
+ target.imperial = v;
4155
+ }
4156
+ } else {
4157
+ target.num_pins = Number.parseFloat(v);
4158
+ }
4145
4159
  }
4146
4160
  } else {
4147
4161
  if (!v && ["w", "h", "p"].includes(prop)) {