@tscircuit/cli 0.1.1202 → 0.1.1204

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/cli/main.js CHANGED
@@ -99964,7 +99964,7 @@ var import_perfect_cli = __toESM2(require_dist2(), 1);
99964
99964
  // lib/getVersion.ts
99965
99965
  import { createRequire as createRequire2 } from "node:module";
99966
99966
  // package.json
99967
- var version = "0.1.1201";
99967
+ var version = "0.1.1203";
99968
99968
  var package_default = {
99969
99969
  name: "@tscircuit/cli",
99970
99970
  version,
@@ -100010,7 +100010,7 @@ var package_default = {
100010
100010
  debug: "^4.4.0",
100011
100011
  delay: "^6.0.0",
100012
100012
  "dsn-converter": "0.0.86",
100013
- easyeda: "^0.0.253",
100013
+ easyeda: "^0.0.258",
100014
100014
  "fuse.js": "^7.1.0",
100015
100015
  "get-port": "^7.1.0",
100016
100016
  globby: "^14.1.0",
@@ -259346,6 +259346,11 @@ var unitToMm3 = {
259346
259346
  ft: 304.8,
259347
259347
  feet: 304.8
259348
259348
  };
259349
+ var mmNumberFormatter = new Intl.NumberFormat("en-US", {
259350
+ useGrouping: false,
259351
+ notation: "standard",
259352
+ maximumFractionDigits: 12
259353
+ });
259349
259354
  var mm4 = (n3) => {
259350
259355
  let unit = typeof n3 === "number" ? "mm" : n3.replace(/^[^a-zA-Z]+/g, "").toLowerCase();
259351
259356
  if (!unit)
@@ -259357,9 +259362,15 @@ var mm4 = (n3) => {
259357
259362
  throw new Error(`Unsupported unit: ${unit}`);
259358
259363
  };
259359
259364
  var mmStr2 = (n3) => {
259360
- return `${mm4(n3)}mm`;
259365
+ return `${mmNumberFormatter.format(mm4(n3))}mm`;
259366
+ };
259367
+ var mil2mm = (mil) => {
259368
+ if (typeof mil === "number")
259369
+ return mm4(`${mil}mil`);
259370
+ if (mil.match(/^\d+$/))
259371
+ return mm4(`${mil}mil`);
259372
+ return mm4(mil);
259361
259373
  };
259362
- var DEFAULT_PCB_THICKNESS_MM = 1.6;
259363
259374
  function generateArcFromSweep(startX, startY, endX, endY, radius, largeArcFlag, sweepFlag) {
259364
259375
  const start = { x: startX, y: startY };
259365
259376
  const end = { x: endX, y: endY };
@@ -259479,16 +259490,10 @@ var normalizeSymbolName = (name) => {
259479
259490
  return "_NEG";
259480
259491
  return trimmedName;
259481
259492
  };
259493
+ var DEFAULT_PCB_THICKNESS_MM = 1.6;
259482
259494
  var EASYEDA_STEP_MODEL_URL = "https://modules.easyeda.com/qAxj6KHrDKw4blvCG8QJPs7Y";
259483
259495
  var EASYEDA_OBJ_MODEL_URL = "https://modules.easyeda.com/3dmodel";
259484
259496
  var TSCIRCUIT_MODEL_CDN_URL = "https://modelcdn.tscircuit.com/easyeda_models";
259485
- var mil2mm = (mil) => {
259486
- if (typeof mil === "number")
259487
- return mm4(`${mil}mil`);
259488
- if (mil.match(/^\d+$/))
259489
- return mm4(`${mil}mil`);
259490
- return mm4(mil);
259491
- };
259492
259497
  var milx10 = (mil10) => {
259493
259498
  if (typeof mil10 === "number")
259494
259499
  return mil2mm(mil10) * 10;
@@ -259616,7 +259621,8 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, {
259616
259621
  shouldRecenter = true,
259617
259622
  cadPositionXMm,
259618
259623
  cadPositionYMm,
259619
- cadPositionZMm
259624
+ cadPositionZMm,
259625
+ showDesignator = false
259620
259626
  } = {}) => {
259621
259627
  const resolvedCadPositionZMm = cadPositionZMm ?? getCadPositionZMmFromMetadata(easyEdaJson);
259622
259628
  const circuitElements = [];
@@ -259789,6 +259795,7 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, {
259789
259795
  easyEdaJson.packageDetail.dataStr.shape.filter((shape) => shape.type === "SOLIDREGION" && shape.fillStyle === "cutout").forEach((sr3, index) => {
259790
259796
  circuitElements.push(handleCutout(sr3, index));
259791
259797
  });
259798
+ let hasFoundDesignator = false;
259792
259799
  easyEdaJson.packageDetail.dataStr.shape.forEach((shape, index) => {
259793
259800
  if (shape.type === "TRACK") {
259794
259801
  if (!isCourtyardLayer(shape.layer)) {
@@ -259801,11 +259808,22 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, {
259801
259808
  } else if (shape.type === "TEXT") {
259802
259809
  if (isCourtyardLayer(shape.layer))
259803
259810
  return;
259811
+ let text = shape.text;
259812
+ const designatorPrefix = easyEdaJson.dataStr.head.c_para.pre || "U";
259813
+ const normalizedPrefix = designatorPrefix.replace(/\?/g, "");
259814
+ const trimmedText = text.trim();
259815
+ const isDesignator = trimmedText === designatorPrefix || trimmedText === `${normalizedPrefix}?` || trimmedText === normalizedPrefix;
259816
+ if (isDesignator) {
259817
+ if (!showDesignator)
259818
+ return;
259819
+ text = "{NAME}";
259820
+ hasFoundDesignator = true;
259821
+ }
259804
259822
  circuitElements.push(pcb_silkscreen_text2.parse({
259805
259823
  type: "pcb_silkscreen_text",
259806
259824
  pcb_silkscreen_text_id: `pcb_silkscreen_text_${index + 1}`,
259807
259825
  pcb_component_id: "pcb_component_1",
259808
- text: normalizeSymbolName(shape.text),
259826
+ text,
259809
259827
  anchor_position: {
259810
259828
  x: mil2mm(shape.x),
259811
259829
  y: mil2mm(shape.y)
@@ -259815,11 +259833,27 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, {
259815
259833
  C: "center",
259816
259834
  R: "bottom_right"
259817
259835
  }[shape.textAnchor ?? "L"],
259818
- font_size: shape.size_mm ? shape.size_mm : undefined,
259836
+ font_size: shape.size_mm || 1,
259819
259837
  layer: "top"
259820
259838
  }));
259821
259839
  }
259822
259840
  });
259841
+ if (!hasFoundDesignator && showDesignator) {
259842
+ const bbox = easyEdaJson.packageDetail.dataStr.BBox;
259843
+ circuitElements.push(pcb_silkscreen_text2.parse({
259844
+ type: "pcb_silkscreen_text",
259845
+ pcb_silkscreen_text_id: `pcb_silkscreen_text_designator_fallback`,
259846
+ pcb_component_id: "pcb_component_1",
259847
+ text: "{NAME}",
259848
+ anchor_position: {
259849
+ x: milx10(bbox.x + bbox.width / 2),
259850
+ y: milx10(bbox.y) - 1
259851
+ },
259852
+ anchor_alignment: "center",
259853
+ font_size: 1,
259854
+ layer: "top"
259855
+ }));
259856
+ }
259823
259857
  const pcbElements = circuitElements.filter((e4) => e4.type === "pcb_smtpad" || e4.type === "pcb_plated_hole" || e4.type === "pcb_hole" || e4.type === "pcb_via" || e4.type === "pcb_courtyard_outline" || e4.type === "pcb_silkscreen_path" || e4.type === "pcb_silkscreen_text");
259824
259858
  if (pcbElements.length > 0) {
259825
259859
  const bounds = findBoundsAndCenter2(pcbElements);
@@ -260741,7 +260775,10 @@ var getRotatedOffsetMm = ({
260741
260775
  };
260742
260776
  var getCadModelOffsetMm = (easyEdaJson) => {
260743
260777
  const svgNode = getCadSvgNode(easyEdaJson);
260744
- const bounds = easyEdaJson._objMetadata?.bounds;
260778
+ return getCadModelOffsetMmFromBounds(easyEdaJson, easyEdaJson._objMetadata?.bounds);
260779
+ };
260780
+ var getCadModelOffsetMmFromBounds = (easyEdaJson, bounds) => {
260781
+ const svgNode = getCadSvgNode(easyEdaJson);
260745
260782
  if (!svgNode || !bounds)
260746
260783
  return null;
260747
260784
  const [originX, originY] = String(svgNode.svgData.attrs?.c_origin ?? "0,0").split(",").map((value) => Number(value.trim()));
@@ -260836,9 +260873,8 @@ var getPositionZMmFromBounds = (bounds, svgNodeZOffsetMm) => {
260836
260873
  var getEasyEdaCadModelPlacement = async (easyEdaJson, { fetch: fetch22 = globalThis.fetch } = {}) => {
260837
260874
  const modelUuid = getCadSvgNodeModelUuid(easyEdaJson);
260838
260875
  const partNumber = easyEdaJson.lcsc.number;
260839
- const derivedOffsetMm = getCadModelOffsetMm(easyEdaJson);
260840
260876
  const svgNodeZOffsetMm = getCadSvgNodeZOffsetMm(easyEdaJson);
260841
- if (!modelUuid || !partNumber || svgNodeZOffsetMm == null || !derivedOffsetMm || !fetch22) {
260877
+ if (!modelUuid || !partNumber || svgNodeZOffsetMm == null || !fetch22) {
260842
260878
  return null;
260843
260879
  }
260844
260880
  const modelObjUrl = getModelObjCdnUrl({
@@ -260851,6 +260887,9 @@ var getEasyEdaCadModelPlacement = async (easyEdaJson, { fetch: fetch22 = globalT
260851
260887
  });
260852
260888
  const metadataBounds = easyEdaJson._objMetadata?.bounds;
260853
260889
  if (metadataBounds) {
260890
+ const derivedOffsetMm = getCadModelOffsetMm(easyEdaJson);
260891
+ if (!derivedOffsetMm)
260892
+ return null;
260854
260893
  return {
260855
260894
  modelObjUrl,
260856
260895
  positionXMm: derivedOffsetMm.x,
@@ -260873,6 +260912,9 @@ var getEasyEdaCadModelPlacement = async (easyEdaJson, { fetch: fetch22 = globalT
260873
260912
  const bounds = parseObjBounds(objText);
260874
260913
  if (!bounds)
260875
260914
  return null;
260915
+ const derivedOffsetMm = getCadModelOffsetMmFromBounds(easyEdaJson, bounds);
260916
+ if (!derivedOffsetMm)
260917
+ return null;
260876
260918
  return {
260877
260919
  modelObjUrl,
260878
260920
  positionXMm: derivedOffsetMm.x,
@@ -260932,7 +260974,9 @@ var generateFootprintTsx2 = (circuitJson) => {
260932
260974
  elementStrings.push(`<silkscreenpath route={${JSON.stringify(silkscreenPath.route)}} />`);
260933
260975
  }
260934
260976
  for (const silkscreenText of silkscreenTexts) {
260935
- elementStrings.push(`<silkscreentext text="${silkscreenText.text}" pcbX="${mmStr2(silkscreenText.anchor_position.x)}" pcbY="${mmStr2(silkscreenText.anchor_position.y)}" anchorAlignment="${silkscreenText.anchor_alignment}" ${silkscreenText.font_size ? `fontSize="${mmStr2(silkscreenText.font_size)}"` : ""} />`);
260977
+ const isRefDes = silkscreenText.text === "{NAME}";
260978
+ const textValue = isRefDes ? JSON.stringify("{NAME}") : JSON.stringify(silkscreenText.text);
260979
+ elementStrings.push(`<silkscreentext text=${textValue} pcbX="${mmStr2(silkscreenText.anchor_position.x)}" pcbY="${mmStr2(silkscreenText.anchor_position.y)}" anchorAlignment="${silkscreenText.anchor_alignment}" ${silkscreenText.font_size ? `fontSize="${mmStr2(silkscreenText.font_size)}"` : ""} />`);
260936
260980
  }
260937
260981
  for (const courtyardOutline of courtyardOutlines) {
260938
260982
  elementStrings.push(`<courtyardoutline outline={${JSON.stringify(courtyardOutline.outline)}} />`);
@@ -261010,7 +261054,8 @@ var convertBetterEasyToTsx = async ({
261010
261054
  shouldRecenter: true,
261011
261055
  cadPositionXMm: cadPlacement?.positionXMm,
261012
261056
  cadPositionYMm: cadPlacement?.positionYMm,
261013
- cadPositionZMm: cadPlacement?.positionZMm
261057
+ cadPositionZMm: cadPlacement?.positionZMm,
261058
+ showDesignator: true
261014
261059
  });
261015
261060
  const [cadComponent] = su9(circuitJson).cad_component.list();
261016
261061
  if (cadComponent) {
@@ -265859,6 +265904,11 @@ var unitToMm4 = {
265859
265904
  ft: 304.8,
265860
265905
  feet: 304.8
265861
265906
  };
265907
+ var mmNumberFormatter2 = new Intl.NumberFormat("en-US", {
265908
+ useGrouping: false,
265909
+ notation: "standard",
265910
+ maximumFractionDigits: 12
265911
+ });
265862
265912
  var mm5 = (n3) => {
265863
265913
  let unit = typeof n3 === "number" ? "mm" : n3.replace(/^[^a-zA-Z]+/g, "").toLowerCase();
265864
265914
  if (!unit)
@@ -265869,7 +265919,13 @@ var mm5 = (n3) => {
265869
265919
  }
265870
265920
  throw new Error(`Unsupported unit: ${unit}`);
265871
265921
  };
265872
- var DEFAULT_PCB_THICKNESS_MM2 = 1.6;
265922
+ var mil2mm2 = (mil) => {
265923
+ if (typeof mil === "number")
265924
+ return mm5(`${mil}mil`);
265925
+ if (mil.match(/^\d+$/))
265926
+ return mm5(`${mil}mil`);
265927
+ return mm5(mil);
265928
+ };
265873
265929
  function generateArcFromSweep2(startX, startY, endX, endY, radius, largeArcFlag, sweepFlag) {
265874
265930
  const start = { x: startX, y: startY };
265875
265931
  const end = { x: endX, y: endY };
@@ -265900,15 +265956,15 @@ function generateArcFromSweep2(startX, startY, endX, endY, radius, largeArcFlag,
265900
265956
  }
265901
265957
  }
265902
265958
  const numPoints = Math.max(2, Math.ceil(Math.abs(endAngle - startAngle) * radius));
265903
- const path210 = [];
265959
+ const path59 = [];
265904
265960
  for (let i2 = 0;i2 <= numPoints; i2++) {
265905
265961
  const t17 = i2 / numPoints;
265906
265962
  const angle2 = startAngle + t17 * (endAngle - startAngle);
265907
265963
  const x3 = centerX + radius * Math.cos(angle2);
265908
265964
  const y4 = centerY + radius * Math.sin(angle2);
265909
- path210.push({ x: x3, y: y4 });
265965
+ path59.push({ x: x3, y: y4 });
265910
265966
  }
265911
- return path210;
265967
+ return path59;
265912
265968
  }
265913
265969
  var mil10ToMm2 = (value) => value * 10 * 0.0254;
265914
265970
  var normalizePinLabels2 = (inputPinLabels) => {
@@ -265989,16 +266045,10 @@ var normalizeSymbolName2 = (name) => {
265989
266045
  return "_NEG";
265990
266046
  return trimmedName;
265991
266047
  };
266048
+ var DEFAULT_PCB_THICKNESS_MM2 = 1.6;
265992
266049
  var EASYEDA_STEP_MODEL_URL2 = "https://modules.easyeda.com/qAxj6KHrDKw4blvCG8QJPs7Y";
265993
266050
  var EASYEDA_OBJ_MODEL_URL2 = "https://modules.easyeda.com/3dmodel";
265994
266051
  var TSCIRCUIT_MODEL_CDN_URL2 = "https://modelcdn.tscircuit.com/easyeda_models";
265995
- var mil2mm2 = (mil) => {
265996
- if (typeof mil === "number")
265997
- return mm5(`${mil}mil`);
265998
- if (mil.match(/^\d+$/))
265999
- return mm5(`${mil}mil`);
266000
- return mm5(mil);
266001
- };
266002
266052
  var milx102 = (mil10) => {
266003
266053
  if (typeof mil10 === "number")
266004
266054
  return mil2mm2(mil10) * 10;
@@ -266126,7 +266176,8 @@ var convertEasyEdaJsonToCircuitJson2 = (easyEdaJson, {
266126
266176
  shouldRecenter = true,
266127
266177
  cadPositionXMm,
266128
266178
  cadPositionYMm,
266129
- cadPositionZMm
266179
+ cadPositionZMm,
266180
+ showDesignator = false
266130
266181
  } = {}) => {
266131
266182
  const resolvedCadPositionZMm = cadPositionZMm ?? getCadPositionZMmFromMetadata2(easyEdaJson);
266132
266183
  const circuitElements = [];
@@ -266299,6 +266350,7 @@ var convertEasyEdaJsonToCircuitJson2 = (easyEdaJson, {
266299
266350
  easyEdaJson.packageDetail.dataStr.shape.filter((shape) => shape.type === "SOLIDREGION" && shape.fillStyle === "cutout").forEach((sr3, index) => {
266300
266351
  circuitElements.push(handleCutout2(sr3, index));
266301
266352
  });
266353
+ let hasFoundDesignator = false;
266302
266354
  easyEdaJson.packageDetail.dataStr.shape.forEach((shape, index) => {
266303
266355
  if (shape.type === "TRACK") {
266304
266356
  if (!isCourtyardLayer2(shape.layer)) {
@@ -266311,11 +266363,22 @@ var convertEasyEdaJsonToCircuitJson2 = (easyEdaJson, {
266311
266363
  } else if (shape.type === "TEXT") {
266312
266364
  if (isCourtyardLayer2(shape.layer))
266313
266365
  return;
266366
+ let text = shape.text;
266367
+ const designatorPrefix = easyEdaJson.dataStr.head.c_para.pre || "U";
266368
+ const normalizedPrefix = designatorPrefix.replace(/\?/g, "");
266369
+ const trimmedText = text.trim();
266370
+ const isDesignator = trimmedText === designatorPrefix || trimmedText === `${normalizedPrefix}?` || trimmedText === normalizedPrefix;
266371
+ if (isDesignator) {
266372
+ if (!showDesignator)
266373
+ return;
266374
+ text = "{NAME}";
266375
+ hasFoundDesignator = true;
266376
+ }
266314
266377
  circuitElements.push(pcb_silkscreen_text3.parse({
266315
266378
  type: "pcb_silkscreen_text",
266316
266379
  pcb_silkscreen_text_id: `pcb_silkscreen_text_${index + 1}`,
266317
266380
  pcb_component_id: "pcb_component_1",
266318
- text: normalizeSymbolName2(shape.text),
266381
+ text,
266319
266382
  anchor_position: {
266320
266383
  x: mil2mm2(shape.x),
266321
266384
  y: mil2mm2(shape.y)
@@ -266325,11 +266388,27 @@ var convertEasyEdaJsonToCircuitJson2 = (easyEdaJson, {
266325
266388
  C: "center",
266326
266389
  R: "bottom_right"
266327
266390
  }[shape.textAnchor ?? "L"],
266328
- font_size: shape.size_mm ? shape.size_mm : undefined,
266391
+ font_size: shape.size_mm || 1,
266329
266392
  layer: "top"
266330
266393
  }));
266331
266394
  }
266332
266395
  });
266396
+ if (!hasFoundDesignator && showDesignator) {
266397
+ const bbox = easyEdaJson.packageDetail.dataStr.BBox;
266398
+ circuitElements.push(pcb_silkscreen_text3.parse({
266399
+ type: "pcb_silkscreen_text",
266400
+ pcb_silkscreen_text_id: `pcb_silkscreen_text_designator_fallback`,
266401
+ pcb_component_id: "pcb_component_1",
266402
+ text: "{NAME}",
266403
+ anchor_position: {
266404
+ x: milx102(bbox.x + bbox.width / 2),
266405
+ y: milx102(bbox.y) - 1
266406
+ },
266407
+ anchor_alignment: "center",
266408
+ font_size: 1,
266409
+ layer: "top"
266410
+ }));
266411
+ }
266333
266412
  const pcbElements = circuitElements.filter((e4) => e4.type === "pcb_smtpad" || e4.type === "pcb_plated_hole" || e4.type === "pcb_hole" || e4.type === "pcb_via" || e4.type === "pcb_courtyard_outline" || e4.type === "pcb_silkscreen_path" || e4.type === "pcb_silkscreen_text");
266334
266413
  if (pcbElements.length > 0) {
266335
266414
  const bounds = findBoundsAndCenter3(pcbElements);
@@ -266880,7 +266959,7 @@ var parsePin2 = (pinString) => {
266880
266959
  const colorMatch = pinString.match(/#[0-9A-F]{6}/);
266881
266960
  const labelColor = colorMatch ? colorMatch[0] : "";
266882
266961
  const pathMatch = pinString.match(/\^\^([^~]+)/);
266883
- const path210 = pathMatch ? pathMatch[1] : "";
266962
+ const path59 = pathMatch ? pathMatch[1] : "";
266884
266963
  const arrowMatch = pinString.match(/\^\^0~(.+)$/);
266885
266964
  const arrow = arrowMatch ? arrowMatch[1] : "";
266886
266965
  const r4 = Number.parseFloat(rotation22);
@@ -266894,7 +266973,7 @@ var parsePin2 = (pinString) => {
266894
266973
  rotation: Number.isNaN(r4) ? 0 : r4,
266895
266974
  label,
266896
266975
  labelColor,
266897
- path: path210,
266976
+ path: path59,
266898
266977
  arrow
266899
266978
  };
266900
266979
  };
@@ -268960,7 +269039,7 @@ export default () => (
268960
269039
  await setupTscircuitSkill(projectDir, options?.yes);
268961
269040
  setupTsciProject(projectDir, options?.install ? undefined : []);
268962
269041
  console.info(`
268963
- `, kleur_default.green("\uD83C\uDF89 Initialization complete!"), "Run ", kleur_default.bold(kleur_default.blue(`${directory ? `${kleur_default.bold(`cd ${directory}`)} & ` : ""}${kleur_default.bold("tsci dev")}`)), " to start developing.");
269042
+ `, kleur_default.green("\uD83C\uDF89 Initialization complete!"), "Run ", kleur_default.bold(kleur_default.blue(`${directory ? `${kleur_default.bold(`cd ${directory}`)} && ` : ""}${kleur_default.bold("tsci dev")}`)), " to start developing.");
268964
269043
  process.exit(0);
268965
269044
  });
268966
269045
  };
package/dist/lib/index.js CHANGED
@@ -60678,7 +60678,7 @@ var getNodeHandler = (winterSpec, { port, middleware = [] }) => {
60678
60678
  }));
60679
60679
  };
60680
60680
  // package.json
60681
- var version = "0.1.1201";
60681
+ var version = "0.1.1203";
60682
60682
  var package_default = {
60683
60683
  name: "@tscircuit/cli",
60684
60684
  version,
@@ -60724,7 +60724,7 @@ var package_default = {
60724
60724
  debug: "^4.4.0",
60725
60725
  delay: "^6.0.0",
60726
60726
  "dsn-converter": "0.0.86",
60727
- easyeda: "^0.0.253",
60727
+ easyeda: "^0.0.258",
60728
60728
  "fuse.js": "^7.1.0",
60729
60729
  "get-port": "^7.1.0",
60730
60730
  globby: "^14.1.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tscircuit/cli",
3
- "version": "0.1.1202",
3
+ "version": "0.1.1204",
4
4
  "main": "dist/cli/main.js",
5
5
  "exports": {
6
6
  ".": "./dist/cli/main.js",
@@ -43,7 +43,7 @@
43
43
  "debug": "^4.4.0",
44
44
  "delay": "^6.0.0",
45
45
  "dsn-converter": "0.0.86",
46
- "easyeda": "^0.0.253",
46
+ "easyeda": "^0.0.258",
47
47
  "fuse.js": "^7.1.0",
48
48
  "get-port": "^7.1.0",
49
49
  "globby": "^14.1.0",