@faicad/faijs 0.13.1 → 0.13.2

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.
Files changed (93) hide show
  1. package/dist/api/edge-ref.d.ts +3 -2
  2. package/dist/api/edge-ref.d.ts.map +1 -1
  3. package/dist/api/edge-ref.js +3 -2
  4. package/dist/api/edge-ref.js.map +1 -1
  5. package/dist/api/internal/compat-op.d.ts +2 -0
  6. package/dist/api/internal/compat-op.d.ts.map +1 -1
  7. package/dist/api/internal/compat-op.js +8 -1
  8. package/dist/api/internal/compat-op.js.map +1 -1
  9. package/dist/browser.d.ts +0 -2
  10. package/dist/browser.d.ts.map +1 -1
  11. package/dist/browser.js +2 -2
  12. package/dist/browser.js.map +1 -1
  13. package/dist/fcstd/attachment.d.ts +65 -0
  14. package/dist/fcstd/attachment.d.ts.map +1 -0
  15. package/dist/fcstd/attachment.js +87 -0
  16. package/dist/fcstd/attachment.js.map +1 -0
  17. package/dist/fcstd/build-fai-zip.d.ts +11 -0
  18. package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
  19. package/dist/fcstd/build-fai-zip.js +9 -1
  20. package/dist/fcstd/build-fai-zip.js.map +1 -1
  21. package/dist/fcstd/cli.d.ts +3 -0
  22. package/dist/fcstd/cli.d.ts.map +1 -0
  23. package/dist/fcstd/cli.js +37 -0
  24. package/dist/fcstd/cli.js.map +1 -0
  25. package/dist/fcstd/codegen.d.ts +14 -1
  26. package/dist/fcstd/codegen.d.ts.map +1 -1
  27. package/dist/fcstd/codegen.js +11 -2
  28. package/dist/fcstd/codegen.js.map +1 -1
  29. package/dist/fcstd/container.d.ts +16 -1
  30. package/dist/fcstd/container.d.ts.map +1 -1
  31. package/dist/fcstd/container.js +12 -1
  32. package/dist/fcstd/container.js.map +1 -1
  33. package/dist/fcstd/contour.d.ts +9 -1
  34. package/dist/fcstd/contour.d.ts.map +1 -1
  35. package/dist/fcstd/contour.js +12 -1
  36. package/dist/fcstd/contour.js.map +1 -1
  37. package/dist/fcstd/convert.d.ts +47 -2
  38. package/dist/fcstd/convert.d.ts.map +1 -1
  39. package/dist/fcstd/convert.js +82 -13
  40. package/dist/fcstd/convert.js.map +1 -1
  41. package/dist/fcstd/document.d.ts +8 -1
  42. package/dist/fcstd/document.d.ts.map +1 -1
  43. package/dist/fcstd/document.js +4 -1
  44. package/dist/fcstd/document.js.map +1 -1
  45. package/dist/fcstd/expressions.d.ts +14 -1
  46. package/dist/fcstd/expressions.d.ts.map +1 -1
  47. package/dist/fcstd/expressions.js +11 -1
  48. package/dist/fcstd/expressions.js.map +1 -1
  49. package/dist/fcstd/external-geo.d.ts +15 -1
  50. package/dist/fcstd/external-geo.d.ts.map +1 -1
  51. package/dist/fcstd/external-geo.js +8 -1
  52. package/dist/fcstd/external-geo.js.map +1 -1
  53. package/dist/fcstd/feature-translate.d.ts +65 -3
  54. package/dist/fcstd/feature-translate.d.ts.map +1 -1
  55. package/dist/fcstd/feature-translate.js +82 -4
  56. package/dist/fcstd/feature-translate.js.map +1 -1
  57. package/dist/fcstd/index.d.ts +23 -0
  58. package/dist/fcstd/index.d.ts.map +1 -0
  59. package/dist/fcstd/index.js +19 -0
  60. package/dist/fcstd/index.js.map +1 -0
  61. package/dist/fcstd/placement.d.ts +49 -6
  62. package/dist/fcstd/placement.d.ts.map +1 -1
  63. package/dist/fcstd/placement.js +46 -6
  64. package/dist/fcstd/placement.js.map +1 -1
  65. package/dist/fcstd/planegcs-backend.d.ts +16 -1
  66. package/dist/fcstd/planegcs-backend.d.ts.map +1 -1
  67. package/dist/fcstd/planegcs-backend.js +16 -1
  68. package/dist/fcstd/planegcs-backend.js.map +1 -1
  69. package/dist/fcstd/sketch-parse.d.ts +43 -0
  70. package/dist/fcstd/sketch-parse.d.ts.map +1 -1
  71. package/dist/fcstd/sketch-parse.js +26 -0
  72. package/dist/fcstd/sketch-parse.js.map +1 -1
  73. package/dist/fcstd/sketch-solver.d.ts +20 -2
  74. package/dist/fcstd/sketch-solver.d.ts.map +1 -1
  75. package/dist/fcstd/sketch-solver.js +6 -1
  76. package/dist/fcstd/sketch-solver.js.map +1 -1
  77. package/dist/fcstd/sketch-verify.d.ts +19 -1
  78. package/dist/fcstd/sketch-verify.d.ts.map +1 -1
  79. package/dist/fcstd/sketch-verify.js +14 -1
  80. package/dist/fcstd/sketch-verify.js.map +1 -1
  81. package/dist/fcstd/unpack.d.ts +21 -2
  82. package/dist/fcstd/unpack.d.ts.map +1 -1
  83. package/dist/fcstd/unpack.js +11 -2
  84. package/dist/fcstd/unpack.js.map +1 -1
  85. package/dist/fcstd-convert.d.ts +30 -0
  86. package/dist/fcstd-convert.d.ts.map +1 -0
  87. package/dist/fcstd-convert.js +27 -0
  88. package/dist/fcstd-convert.js.map +1 -0
  89. package/dist/weapp.d.ts +22 -0
  90. package/dist/weapp.d.ts.map +1 -0
  91. package/dist/weapp.js +23 -0
  92. package/dist/weapp.js.map +1 -0
  93. package/package.json +18 -5
@@ -1 +1 @@
1
- {"version":3,"file":"sketch-parse.js","sourceRoot":"","sources":["../../src/fcstd/sketch-parse.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M3.1 — FCStd sketch parsing: <GeometryList> → SketchGeom[],\n * <ConstraintList> → SketchCon[].\n *\n * Field format per plan §5.2/§5.3:\n * - geometry coordinates are 3D (X/Y/Z); sketch-local Z is usually 0\n * - <Constrain> (singular) carries Type as the ConstraintType enum integer\n * (Constraint.h:52-77)\n * - ElementIds/ElementPositions (new) take precedence over First/Second/Third\n * (old); 47.5% of sample constraints lack the new format (§5.3.1)\n * - IsDriving defaults to true when missing (Constraint.h:240)\n * - geoId: >= 0 own geometry; -1 HAxis/RtPnt; -2 VAxis; <= -3 external (D4)\n */\nimport type { FcstdProperty } from './document.js';\n\n/** ConstraintType enum values (src/Mod/Sketcher/App/Constraint.h:52-77) */\nexport const ConstraintType = {\n Coincident: 1,\n Horizontal: 2,\n Vertical: 3,\n Parallel: 4,\n Tangent: 5,\n Distance: 6,\n DistanceX: 7,\n DistanceY: 8,\n Angle: 9,\n Perpendicular: 10,\n Radius: 11,\n Equal: 12,\n PointOnObject: 13,\n Symmetric: 14,\n InternalAlignment: 15,\n SnellsLaw: 16,\n Block: 17,\n Diameter: 18,\n Weight: 19,\n Group: 20,\n Text: 21,\n} as const;\n\nexport const CONSTRAINT_NAMES: Record<number, string> = {\n 1: 'Coincident', 2: 'Horizontal', 3: 'Vertical', 4: 'Parallel', 5: 'Tangent',\n 6: 'Distance', 7: 'DistanceX', 8: 'DistanceY', 9: 'Angle', 10: 'Perpendicular',\n 11: 'Radius', 12: 'Equal', 13: 'PointOnObject', 14: 'Symmetric',\n 15: 'InternalAlignment', 16: 'SnellsLaw', 17: 'Block', 18: 'Diameter',\n 19: 'Weight', 20: 'Group', 21: 'Text',\n};\n\n/** GeoEnum (src/Mod/Sketcher/App/GeoEnum.h:71-78) */\nexport const GeoId = {\n RtPnt: -1,\n HAxis: -1,\n VAxis: -2,\n RefExt: -3,\n} as const;\n\n/** PointPos (GeoEnum.h:88-94) */\nexport const PointPos = {\n none: 0, // edge itself\n start: 1,\n end: 2,\n mid: 3, // center of circle/ellipse\n} as const;\n\nexport type SketchGeom =\n | { kind: 'point'; index: number; x: number; y: number; z: number }\n | { kind: 'line'; index: number; x1: number; y1: number; z1: number; x2: number; y2: number; z2: number }\n | { kind: 'circle'; index: number; cx: number; cy: number; cz: number; radius: number }\n | {\n kind: 'arc';\n index: number;\n cx: number;\n cy: number;\n cz: number;\n radius: number;\n startAngle: number; // radians\n endAngle: number;\n /** arc endpoints derived from angles (kept for solver wiring) */\n x1: number;\n y1: number;\n z1: number;\n x2: number;\n y2: number;\n z2: number;\n }\n | {\n kind: 'ellipse';\n index: number;\n cx: number;\n cy: number;\n cz: number;\n majorRadius: number;\n minorRadius: number;\n /** rotation of major axis, radians */\n angleXU: number;\n /** first focus (computed) */\n fx1: number;\n fy1: number;\n fx2: number;\n fy2: number;\n };\n\nexport interface GeoRef {\n geoId: number;\n pos: number; // PointPos\n}\n\nexport interface SketchCon {\n /** index in the ConstraintList */\n index: number;\n /** ConstraintType integer */\n type: number;\n /** resolved element refs (ElementIds or First/Second/Third fallback) */\n refs: GeoRef[];\n /** driving dimension value (Distance/Angle/Radius/...) */\n value: number;\n /** IsDriving; missing means true (§5.3.1) */\n isDriving: boolean;\n /** raw name attribute */\n name: string;\n /** InternalAlignmentType when type === 15 */\n internalAlignmentType?: number;\n}\n\nexport interface ParsedSketch {\n geoms: SketchGeom[];\n constraints: SketchCon[];\n fullyConstrained: boolean;\n /** geoIds <= -3 referenced by constraints (D4 external geometry) */\n externalGeoIds: number[];\n}\n\nfunction num(attrs: Record<string, string>, key: string): number {\n const v = attrs[key];\n return v === undefined ? 0 : Number(v);\n}\n\nexport function parseGeometryList(prop: FcstdProperty): SketchGeom[] {\n // <GeometryList count=\"N\"><Geometry type=\"...\">...</Geometry>...</GeometryList>\n const listEl = prop.children[0];\n if (!listEl) return [];\n const geoms: SketchGeom[] = [];\n let index = 0;\n for (const child of listEl.children) {\n const gtype = child.attributes['type'] ?? '';\n // <Geometry> may carry <Construction/>, <GeoExtensions/> or <UID/>\n // siblings before the actual geometry element — pick the first real\n // geometry child.\n const inner = child.children.find(\n (c) => c.tagName !== 'Construction' && c.tagName !== 'GeoExtensions' && c.tagName !== 'UID',\n );\n if (!inner) continue;\n const a = inner.attributes;\n const tag = inner.tagName;\n switch (true) {\n case tag === 'LineSegment' || gtype.includes('GeomLineSegment'): {\n geoms.push({\n kind: 'line',\n index,\n x1: num(a, 'StartX'), y1: num(a, 'StartY'), z1: num(a, 'StartZ'),\n x2: num(a, 'EndX'), y2: num(a, 'EndY'), z2: num(a, 'EndZ'),\n });\n break;\n }\n case tag === 'Circle' || gtype.includes('GeomCircle'): {\n geoms.push({\n kind: 'circle',\n index,\n cx: num(a, 'CenterX'), cy: num(a, 'CenterY'), cz: num(a, 'CenterZ'),\n radius: num(a, 'Radius'),\n });\n break;\n }\n case tag === 'ArcOfCircle' || gtype.includes('GeomArcOfCircle'): {\n const cx = num(a, 'CenterX');\n const cy = num(a, 'CenterY');\n const cz = num(a, 'CenterZ');\n const r = num(a, 'Radius');\n const sa = num(a, 'StartAngle');\n const ea = num(a, 'EndAngle');\n geoms.push({\n kind: 'arc',\n index, cx, cy, cz, radius: r, startAngle: sa, endAngle: ea,\n x1: cx + r * Math.cos(sa), y1: cy + r * Math.sin(sa), z1: cz,\n x2: cx + r * Math.cos(ea), y2: cy + r * Math.sin(ea), z2: cz,\n });\n break;\n }\n case tag === 'GeomPoint' || tag === 'Point' || gtype.includes('GeomPoint'): {\n geoms.push({ kind: 'point', index, x: num(a, 'X'), y: num(a, 'Y'), z: num(a, 'Z') });\n break;\n }\n case tag === 'Ellipse' || gtype.includes('GeomEllipse'): {\n const cx = num(a, 'CenterX');\n const cy = num(a, 'CenterY');\n const major = num(a, 'MajorRadius');\n const minor = num(a, 'MinorRadius');\n const ang = num(a, 'AngleXU');\n const f = Math.sqrt(Math.max(0, major * major - minor * minor));\n const ca = Math.cos(ang);\n const sa2 = Math.sin(ang);\n geoms.push({\n kind: 'ellipse', index, cx, cy, cz: num(a, 'CenterZ'),\n majorRadius: major, minorRadius: minor, angleXU: ang,\n fx1: cx + f * ca, fy1: cy + f * sa2,\n fx2: cx - f * ca, fy2: cy - f * sa2,\n });\n break;\n }\n default:\n // ArcOfEllipse / BSpline / hyperbola / parabola: not supported in M3\n // (sample set: 0 occurrences, plan §5.5.3); caller downgrades to L2.\n geoms.push({ kind: 'point', index, x: NaN, y: NaN, z: NaN });\n break;\n }\n index++;\n }\n return geoms;\n}\n\nfunction parseGeoRef(attrs: Record<string, string>, prefix: string): GeoRef {\n return { geoId: Math.trunc(num(attrs, prefix)), pos: Math.trunc(num(attrs, `${prefix}Pos`)) };\n}\n\nexport function parseConstraintList(prop: FcstdProperty): SketchCon[] {\n // <ConstraintList count=\"N\"><Constrain .../>...</ConstraintList>\n const listEl = prop.children[0];\n if (!listEl) return [];\n const cons: SketchCon[] = [];\n let index = 0;\n for (const child of listEl.children) {\n if (child.tagName !== 'Constrain') continue;\n const a = child.attributes;\n const type = Math.trunc(num(a, 'Type'));\n\n // ElementIds (new, space-separated) takes precedence; fallback First/Second/Third\n const refs: GeoRef[] = [];\n const eids = a['ElementIds']?.trim();\n const eposs = a['ElementPositions']?.trim();\n if (eids && eposs) {\n const ids = eids.split(/\\s+/).map(Number);\n const poss = eposs.split(/\\s+/).map(Number);\n for (let i = 0; i < ids.length; i++) {\n refs.push({ geoId: ids[i]!, pos: poss[i] ?? 0 });\n }\n } else {\n // old-style triple; Third=GeoUndef(-2000) means unused\n for (const prefix of ['First', 'Second', 'Third']) {\n const geoId = Math.trunc(num(a, prefix));\n if (geoId === -2000) continue;\n refs.push(parseGeoRef(a, prefix));\n }\n }\n\n const isDriving = a['IsDriving'] === undefined ? true : a['IsDriving'] === '1';\n\n cons.push({\n index,\n type,\n refs,\n value: num(a, 'Value'),\n isDriving,\n name: a['Name'] ?? '',\n internalAlignmentType: type === 15 ? Math.trunc(num(a, 'InternalAlignmentType')) : undefined,\n });\n index++;\n }\n return cons;\n}\n\nexport function parseSketchObject(\n geometryProp: FcstdProperty | undefined,\n constraintsProp: FcstdProperty | undefined,\n fullyConstrained: boolean,\n): ParsedSketch {\n const geoms = geometryProp ? parseGeometryList(geometryProp) : [];\n const constraints = constraintsProp ? parseConstraintList(constraintsProp) : [];\n const externalGeoIds = new Set<number>();\n for (const c of constraints) {\n for (const r of c.refs) {\n // GeoUndef (-2000) is an unused-slot placeholder in old-format triples\n // and ElementIds — it is NOT external geometry. External refs are the\n // small negative range starting at RefExt (-3).\n if (r.geoId <= GeoId.RefExt && r.geoId > -2000) externalGeoIds.add(r.geoId);\n }\n }\n return {\n geoms,\n constraints,\n fullyConstrained,\n externalGeoIds: [...externalGeoIds],\n };\n}\n"]}
1
+ {"version":3,"file":"sketch-parse.js","sourceRoot":"","sources":["../../src/fcstd/sketch-parse.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M3.1 — FCStd sketch parsing: <GeometryList> → SketchGeom[],\n * <ConstraintList> → SketchCon[].\n *\n * Field format per plan §5.2/§5.3:\n * - geometry coordinates are 3D (X/Y/Z); sketch-local Z is usually 0\n * - <Constrain> (singular) carries Type as the ConstraintType enum integer\n * (Constraint.h:52-77)\n * - ElementIds/ElementPositions (new) take precedence over First/Second/Third\n * (old); 47.5% of sample constraints lack the new format (§5.3.1)\n * - IsDriving defaults to true when missing (Constraint.h:240)\n * - geoId: >= 0 own geometry; -1 HAxis/RtPnt; -2 VAxis; <= -3 external (D4)\n */\nimport type { FcstdProperty } from './document.js';\n\n/** ConstraintType enum values (src/Mod/Sketcher/App/Constraint.h:52-77) */\nexport const ConstraintType = {\n Coincident: 1,\n Horizontal: 2,\n Vertical: 3,\n Parallel: 4,\n Tangent: 5,\n Distance: 6,\n DistanceX: 7,\n DistanceY: 8,\n Angle: 9,\n Perpendicular: 10,\n Radius: 11,\n Equal: 12,\n PointOnObject: 13,\n Symmetric: 14,\n InternalAlignment: 15,\n SnellsLaw: 16,\n Block: 17,\n Diameter: 18,\n Weight: 19,\n Group: 20,\n Text: 21,\n} as const;\n\n/**\n * Human-readable names for the ConstraintType enum integers (debugging/\n * diagnostics only).\n */\nexport const CONSTRAINT_NAMES: Record<number, string> = {\n 1: 'Coincident', 2: 'Horizontal', 3: 'Vertical', 4: 'Parallel', 5: 'Tangent',\n 6: 'Distance', 7: 'DistanceX', 8: 'DistanceY', 9: 'Angle', 10: 'Perpendicular',\n 11: 'Radius', 12: 'Equal', 13: 'PointOnObject', 14: 'Symmetric',\n 15: 'InternalAlignment', 16: 'SnellsLaw', 17: 'Block', 18: 'Diameter',\n 19: 'Weight', 20: 'Group', 21: 'Text',\n};\n\n/** GeoEnum (src/Mod/Sketcher/App/GeoEnum.h:71-78) */\nexport const GeoId = {\n RtPnt: -1,\n HAxis: -1,\n VAxis: -2,\n RefExt: -3,\n} as const;\n\n/** PointPos (GeoEnum.h:88-94) */\nexport const PointPos = {\n none: 0, // edge itself\n start: 1,\n end: 2,\n mid: 3, // center of circle/ellipse\n} as const;\n\n/**\n * One parsed sketch geometry element (point, line, circle, arc or ellipse),\n * in 3D sketch-local coordinates.\n */\nexport type SketchGeom =\n | { kind: 'point'; index: number; x: number; y: number; z: number }\n | { kind: 'line'; index: number; x1: number; y1: number; z1: number; x2: number; y2: number; z2: number }\n | { kind: 'circle'; index: number; cx: number; cy: number; cz: number; radius: number }\n | {\n kind: 'arc';\n index: number;\n cx: number;\n cy: number;\n cz: number;\n radius: number;\n startAngle: number; // radians\n endAngle: number;\n /** arc endpoints derived from angles (kept for solver wiring) */\n x1: number;\n y1: number;\n z1: number;\n x2: number;\n y2: number;\n z2: number;\n }\n | {\n kind: 'ellipse';\n index: number;\n cx: number;\n cy: number;\n cz: number;\n majorRadius: number;\n minorRadius: number;\n /** rotation of major axis, radians */\n angleXU: number;\n /** first focus (computed) */\n fx1: number;\n fy1: number;\n fx2: number;\n fy2: number;\n };\n\n/**\n * One (geometry, point) reference inside a constraint: a geoId plus a\n * PointPos selector.\n */\nexport interface GeoRef {\n /** geometry id: >= 0 own geometry; -1 HAxis/RtPnt; -2 VAxis; <= -3 external */\n geoId: number;\n /** PointPos selector (0 = edge itself, 1/2 = start/end, 3 = center) */\n pos: number; // PointPos\n}\n\n/**\n * One parsed sketch constraint (`<Constrain>` element).\n */\nexport interface SketchCon {\n /** index in the ConstraintList */\n index: number;\n /** ConstraintType integer */\n type: number;\n /** resolved element refs (ElementIds or First/Second/Third fallback) */\n refs: GeoRef[];\n /** driving dimension value (Distance/Angle/Radius/...) */\n value: number;\n /** IsDriving; missing means true (§5.3.1) */\n isDriving: boolean;\n /** raw name attribute */\n name: string;\n /** InternalAlignmentType when type === 15 */\n internalAlignmentType?: number;\n}\n\n/**\n * The fully parsed sketch: geometry, constraints, constrainedness and the set\n * of referenced external geoIds.\n */\nexport interface ParsedSketch {\n geoms: SketchGeom[];\n constraints: SketchCon[];\n fullyConstrained: boolean;\n /** geoIds <= -3 referenced by constraints (D4 external geometry) */\n externalGeoIds: number[];\n}\n\nfunction num(attrs: Record<string, string>, key: string): number {\n const v = attrs[key];\n return v === undefined ? 0 : Number(v);\n}\n\n/**\n * Parse a sketch's `<GeometryList>` property into typed geometry elements.\n *\n * @param prop - the sketch's Geometry property.\n * @returns the parsed geometry list; unsupported element kinds degrade to a\n * NaN point so the caller can downgrade the sketch.\n */\nexport function parseGeometryList(prop: FcstdProperty): SketchGeom[] {\n // <GeometryList count=\"N\"><Geometry type=\"...\">...</Geometry>...</GeometryList>\n const listEl = prop.children[0];\n if (!listEl) return [];\n const geoms: SketchGeom[] = [];\n let index = 0;\n for (const child of listEl.children) {\n const gtype = child.attributes['type'] ?? '';\n // <Geometry> may carry <Construction/>, <GeoExtensions/> or <UID/>\n // siblings before the actual geometry element — pick the first real\n // geometry child.\n const inner = child.children.find(\n (c) => c.tagName !== 'Construction' && c.tagName !== 'GeoExtensions' && c.tagName !== 'UID',\n );\n if (!inner) continue;\n const a = inner.attributes;\n const tag = inner.tagName;\n switch (true) {\n case tag === 'LineSegment' || gtype.includes('GeomLineSegment'): {\n geoms.push({\n kind: 'line',\n index,\n x1: num(a, 'StartX'), y1: num(a, 'StartY'), z1: num(a, 'StartZ'),\n x2: num(a, 'EndX'), y2: num(a, 'EndY'), z2: num(a, 'EndZ'),\n });\n break;\n }\n case tag === 'Circle' || gtype.includes('GeomCircle'): {\n geoms.push({\n kind: 'circle',\n index,\n cx: num(a, 'CenterX'), cy: num(a, 'CenterY'), cz: num(a, 'CenterZ'),\n radius: num(a, 'Radius'),\n });\n break;\n }\n case tag === 'ArcOfCircle' || gtype.includes('GeomArcOfCircle'): {\n const cx = num(a, 'CenterX');\n const cy = num(a, 'CenterY');\n const cz = num(a, 'CenterZ');\n const r = num(a, 'Radius');\n const sa = num(a, 'StartAngle');\n const ea = num(a, 'EndAngle');\n geoms.push({\n kind: 'arc',\n index, cx, cy, cz, radius: r, startAngle: sa, endAngle: ea,\n x1: cx + r * Math.cos(sa), y1: cy + r * Math.sin(sa), z1: cz,\n x2: cx + r * Math.cos(ea), y2: cy + r * Math.sin(ea), z2: cz,\n });\n break;\n }\n case tag === 'GeomPoint' || tag === 'Point' || gtype.includes('GeomPoint'): {\n geoms.push({ kind: 'point', index, x: num(a, 'X'), y: num(a, 'Y'), z: num(a, 'Z') });\n break;\n }\n case tag === 'Ellipse' || gtype.includes('GeomEllipse'): {\n const cx = num(a, 'CenterX');\n const cy = num(a, 'CenterY');\n const major = num(a, 'MajorRadius');\n const minor = num(a, 'MinorRadius');\n const ang = num(a, 'AngleXU');\n const f = Math.sqrt(Math.max(0, major * major - minor * minor));\n const ca = Math.cos(ang);\n const sa2 = Math.sin(ang);\n geoms.push({\n kind: 'ellipse', index, cx, cy, cz: num(a, 'CenterZ'),\n majorRadius: major, minorRadius: minor, angleXU: ang,\n fx1: cx + f * ca, fy1: cy + f * sa2,\n fx2: cx - f * ca, fy2: cy - f * sa2,\n });\n break;\n }\n default:\n // ArcOfEllipse / BSpline / hyperbola / parabola: not supported in M3\n // (sample set: 0 occurrences, plan §5.5.3); caller downgrades to L2.\n geoms.push({ kind: 'point', index, x: NaN, y: NaN, z: NaN });\n break;\n }\n index++;\n }\n return geoms;\n}\n\nfunction parseGeoRef(attrs: Record<string, string>, prefix: string): GeoRef {\n return { geoId: Math.trunc(num(attrs, prefix)), pos: Math.trunc(num(attrs, `${prefix}Pos`)) };\n}\n\n/**\n * Parse a sketch's `<ConstraintList>` property into constraint records.\n *\n * @param prop - the sketch's Constraints property.\n * @returns the parsed constraints, with element refs resolved from\n * ElementIds/ElementPositions or the old First/Second/Third fallback.\n */\nexport function parseConstraintList(prop: FcstdProperty): SketchCon[] {\n // <ConstraintList count=\"N\"><Constrain .../>...</ConstraintList>\n const listEl = prop.children[0];\n if (!listEl) return [];\n const cons: SketchCon[] = [];\n let index = 0;\n for (const child of listEl.children) {\n if (child.tagName !== 'Constrain') continue;\n const a = child.attributes;\n const type = Math.trunc(num(a, 'Type'));\n\n // ElementIds (new, space-separated) takes precedence; fallback First/Second/Third\n const refs: GeoRef[] = [];\n const eids = a['ElementIds']?.trim();\n const eposs = a['ElementPositions']?.trim();\n if (eids && eposs) {\n const ids = eids.split(/\\s+/).map(Number);\n const poss = eposs.split(/\\s+/).map(Number);\n for (let i = 0; i < ids.length; i++) {\n refs.push({ geoId: ids[i]!, pos: poss[i] ?? 0 });\n }\n } else {\n // old-style triple; Third=GeoUndef(-2000) means unused\n for (const prefix of ['First', 'Second', 'Third']) {\n const geoId = Math.trunc(num(a, prefix));\n if (geoId === -2000) continue;\n refs.push(parseGeoRef(a, prefix));\n }\n }\n\n const isDriving = a['IsDriving'] === undefined ? true : a['IsDriving'] === '1';\n\n cons.push({\n index,\n type,\n refs,\n value: num(a, 'Value'),\n isDriving,\n name: a['Name'] ?? '',\n internalAlignmentType: type === 15 ? Math.trunc(num(a, 'InternalAlignmentType')) : undefined,\n });\n index++;\n }\n return cons;\n}\n\n/**\n * Parse a sketch object's geometry and constraint properties (M3.1 entry).\n *\n * @param geometryProp - the sketch's Geometry property (may be undefined).\n * @param constraintsProp - the sketch's Constraints property (may be undefined).\n * @param fullyConstrained - the sketch's FullyConstrained flag.\n * @returns the parsed sketch, including external geoIds referenced by constraints.\n */\nexport function parseSketchObject(\n geometryProp: FcstdProperty | undefined,\n constraintsProp: FcstdProperty | undefined,\n fullyConstrained: boolean,\n): ParsedSketch {\n const geoms = geometryProp ? parseGeometryList(geometryProp) : [];\n const constraints = constraintsProp ? parseConstraintList(constraintsProp) : [];\n const externalGeoIds = new Set<number>();\n for (const c of constraints) {\n for (const r of c.refs) {\n // GeoUndef (-2000) is an unused-slot placeholder in old-format triples\n // and ElementIds — it is NOT external geometry. External refs are the\n // small negative range starting at RefExt (-3).\n if (r.geoId <= GeoId.RefExt && r.geoId > -2000) externalGeoIds.add(r.geoId);\n }\n }\n return {\n geoms,\n constraints,\n fullyConstrained,\n externalGeoIds: [...externalGeoIds],\n };\n}\n"]}
@@ -6,8 +6,12 @@
6
6
  * Output: solved geometry or a structured failure — the caller (M3.5) decides
7
7
  * between solution and initial-value fallback (D2).
8
8
  */
9
- import type { Result } from '../vendored/brepjs/core/result.js';
9
+ import type { Result } from '../api/result.js';
10
10
  import type { SketchGeom, SketchCon } from './sketch-parse.js';
11
+ /**
12
+ * Result of one solver run: the solved geometry plus convergence status and
13
+ * diagnostics for the caller's L0/L1/L2 decision (D2).
14
+ */
11
15
  export interface SolveOutcome {
12
16
  /** geometry after solve, same order/index as input */
13
17
  geoms: SketchGeom[];
@@ -20,11 +24,20 @@ export interface SolveOutcome {
20
24
  /** constraint indices dropped because their GCS shape could not be pushed */
21
25
  droppedConstraints: number[];
22
26
  }
27
+ /**
28
+ * One pre-projected external geometry segment passed to the solver as fixed
29
+ * (immutable) geometry.
30
+ */
23
31
  export interface ExternalFixedSeg {
24
32
  /** negative geoId in link order: -3, -4, ... (GeoEnum.RefExt downward) */
25
33
  geoId: number;
34
+ /** the projected sketch-local 2D polyline (immutable to the solver) */
26
35
  polyline: [number, number][];
27
36
  }
37
+ /**
38
+ * Solver abstraction (D5): faijs depends only on this interface; the WASM
39
+ * implementation is swappable.
40
+ */
28
41
  export interface SketchSolver {
29
42
  /**
30
43
  * Solve constraints against the given geometry. The input geometry's stored
@@ -40,6 +53,11 @@ export interface SketchSolver {
40
53
  }
41
54
  /** Constraint types the planegcs backend can express (P0 set, plan §7 M3.4). */
42
55
  export declare const SUPPORTED_CONSTRAINT_TYPES: Set<number>;
43
- /** Returns true when every constraint in the sketch is expressible. */
56
+ /**
57
+ * Check whether every constraint in a sketch is expressible by the backend.
58
+ *
59
+ * @param constraints - the parsed sketch constraints.
60
+ * @returns true when every constraint's type is in SUPPORTED_CONSTRAINT_TYPES.
61
+ */
44
62
  export declare function allConstraintsSupported(constraints: SketchCon[]): boolean;
45
63
  //# sourceMappingURL=sketch-solver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sketch-solver.d.ts","sourceRoot":"","sources":["../../src/fcstd/sketch-solver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,sDAAsD;IACtD,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,MAAM,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,wBAAwB,CAAC;IAC3E,4CAA4C;IAC5C,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,6EAA6E;IAC7E,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;OASG;IACH,KAAK,CACH,KAAK,EAAE,UAAU,EAAE,EACnB,WAAW,EAAE,SAAS,EAAE,EACxB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,GAC5B,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;CACzC;AAED,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,aAgBrC,CAAC;AAEH,uEAAuE;AACvE,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,CAEzE"}
1
+ {"version":3,"file":"sketch-solver.d.ts","sourceRoot":"","sources":["../../src/fcstd/sketch-solver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE/D;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,sDAAsD;IACtD,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,MAAM,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,wBAAwB,CAAC;IAC3E,4CAA4C;IAC5C,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,6EAA6E;IAC7E,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;OASG;IACH,KAAK,CACH,KAAK,EAAE,UAAU,EAAE,EACnB,WAAW,EAAE,SAAS,EAAE,EACxB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,GAC5B,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;CACzC;AAED,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,aAgBrC,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,CAEzE"}
@@ -16,7 +16,12 @@ export const SUPPORTED_CONSTRAINT_TYPES = new Set([
16
16
  14, // Symmetric
17
17
  18, // Diameter
18
18
  ]);
19
- /** Returns true when every constraint in the sketch is expressible. */
19
+ /**
20
+ * Check whether every constraint in a sketch is expressible by the backend.
21
+ *
22
+ * @param constraints - the parsed sketch constraints.
23
+ * @returns true when every constraint's type is in SUPPORTED_CONSTRAINT_TYPES.
24
+ */
20
25
  export function allConstraintsSupported(constraints) {
21
26
  return constraints.every((c) => SUPPORTED_CONSTRAINT_TYPES.has(c.type));
22
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sketch-solver.js","sourceRoot":"","sources":["../../src/fcstd/sketch-solver.ts"],"names":[],"mappings":"AAgDA,gFAAgF;AAChF,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAS;IACxD,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,QAAQ;IACX,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,WAAW;CAChB,CAAC,CAAC;AAEH,uEAAuE;AACvE,MAAM,UAAU,uBAAuB,CAAC,WAAwB;IAC9D,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1E,CAAC","sourcesContent":["/**\n * M3.2 — SketchSolver interface (D5) with the planegcs WASM backend.\n *\n * faijs depends only on this interface; the WASM implementation is swappable\n * (前文 B R2/R3). Input: parsed sketch geometry + constraints (M3.1 types).\n * Output: solved geometry or a structured failure — the caller (M3.5) decides\n * between solution and initial-value fallback (D2).\n */\nimport type { Result } from '../vendored/brepjs/core/result.js';\nimport type { SketchGeom, SketchCon } from './sketch-parse.js';\n\nexport interface SolveOutcome {\n /** geometry after solve, same order/index as input */\n geoms: SketchGeom[];\n /** true when the solver reports Success with no conflicts */\n converged: boolean;\n /** diagnostics when not converged */\n reason?: 'conflicting' | 'redundant' | 'failed' | 'unsupported-constraint';\n /** constraint indices the solver flagged */\n problemConstraints: number[];\n /** constraint indices dropped because their GCS shape could not be pushed */\n droppedConstraints: number[];\n}\n\nexport interface ExternalFixedSeg {\n /** negative geoId in link order: -3, -4, ... (GeoEnum.RefExt downward) */\n geoId: number;\n polyline: [number, number][];\n}\n\nexport interface SketchSolver {\n /**\n * Solve constraints against the given geometry. The input geometry's stored\n * coordinates are used as the initial guess (D2 — they are FreeCAD's last\n * solution and the ideal starting point).\n *\n * `external` carries pre-projected fixed geometry (M6.3): immutable 2D\n * polylines that constraints may reference by negative geoId. When a\n * constraint references an external geoId not present here, the solver\n * drops that constraint (recorded in droppedConstraints).\n */\n solve(\n geoms: SketchGeom[],\n constraints: SketchCon[],\n external?: ExternalFixedSeg[],\n ): Promise<Result<SolveOutcome, never>>;\n}\n\n/** Constraint types the planegcs backend can express (P0 set, plan §7 M3.4). */\nexport const SUPPORTED_CONSTRAINT_TYPES = new Set<number>([\n 1, // Coincident\n 2, // Horizontal\n 3, // Vertical\n 4, // Parallel\n 5, // Tangent\n 6, // Distance\n 7, // DistanceX\n 8, // DistanceY\n 9, // Angle\n 10, // Perpendicular\n 11, // Radius\n 12, // Equal\n 13, // PointOnObject\n 14, // Symmetric\n 18, // Diameter\n]);\n\n/** Returns true when every constraint in the sketch is expressible. */\nexport function allConstraintsSupported(constraints: SketchCon[]): boolean {\n return constraints.every((c) => SUPPORTED_CONSTRAINT_TYPES.has(c.type));\n}\n"]}
1
+ {"version":3,"file":"sketch-solver.js","sourceRoot":"","sources":["../../src/fcstd/sketch-solver.ts"],"names":[],"mappings":"AA6DA,gFAAgF;AAChF,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAS;IACxD,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,QAAQ;IACX,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,WAAW;CAChB,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,WAAwB;IAC9D,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1E,CAAC","sourcesContent":["/**\n * M3.2 — SketchSolver interface (D5) with the planegcs WASM backend.\n *\n * faijs depends only on this interface; the WASM implementation is swappable\n * (前文 B R2/R3). Input: parsed sketch geometry + constraints (M3.1 types).\n * Output: solved geometry or a structured failure — the caller (M3.5) decides\n * between solution and initial-value fallback (D2).\n */\nimport type { Result } from '../api/result.js';\nimport type { SketchGeom, SketchCon } from './sketch-parse.js';\n\n/**\n * Result of one solver run: the solved geometry plus convergence status and\n * diagnostics for the caller's L0/L1/L2 decision (D2).\n */\nexport interface SolveOutcome {\n /** geometry after solve, same order/index as input */\n geoms: SketchGeom[];\n /** true when the solver reports Success with no conflicts */\n converged: boolean;\n /** diagnostics when not converged */\n reason?: 'conflicting' | 'redundant' | 'failed' | 'unsupported-constraint';\n /** constraint indices the solver flagged */\n problemConstraints: number[];\n /** constraint indices dropped because their GCS shape could not be pushed */\n droppedConstraints: number[];\n}\n\n/**\n * One pre-projected external geometry segment passed to the solver as fixed\n * (immutable) geometry.\n */\nexport interface ExternalFixedSeg {\n /** negative geoId in link order: -3, -4, ... (GeoEnum.RefExt downward) */\n geoId: number;\n /** the projected sketch-local 2D polyline (immutable to the solver) */\n polyline: [number, number][];\n}\n\n/**\n * Solver abstraction (D5): faijs depends only on this interface; the WASM\n * implementation is swappable.\n */\nexport interface SketchSolver {\n /**\n * Solve constraints against the given geometry. The input geometry's stored\n * coordinates are used as the initial guess (D2 — they are FreeCAD's last\n * solution and the ideal starting point).\n *\n * `external` carries pre-projected fixed geometry (M6.3): immutable 2D\n * polylines that constraints may reference by negative geoId. When a\n * constraint references an external geoId not present here, the solver\n * drops that constraint (recorded in droppedConstraints).\n */\n solve(\n geoms: SketchGeom[],\n constraints: SketchCon[],\n external?: ExternalFixedSeg[],\n ): Promise<Result<SolveOutcome, never>>;\n}\n\n/** Constraint types the planegcs backend can express (P0 set, plan §7 M3.4). */\nexport const SUPPORTED_CONSTRAINT_TYPES = new Set<number>([\n 1, // Coincident\n 2, // Horizontal\n 3, // Vertical\n 4, // Parallel\n 5, // Tangent\n 6, // Distance\n 7, // DistanceX\n 8, // DistanceY\n 9, // Angle\n 10, // Perpendicular\n 11, // Radius\n 12, // Equal\n 13, // PointOnObject\n 14, // Symmetric\n 18, // Diameter\n]);\n\n/**\n * Check whether every constraint in a sketch is expressible by the backend.\n *\n * @param constraints - the parsed sketch constraints.\n * @returns true when every constraint's type is in SUPPORTED_CONSTRAINT_TYPES.\n */\nexport function allConstraintsSupported(constraints: SketchCon[]): boolean {\n return constraints.every((c) => SUPPORTED_CONSTRAINT_TYPES.has(c.type));\n}\n"]}
@@ -8,10 +8,22 @@
8
8
  */
9
9
  import type { SketchGeom } from './sketch-parse.js';
10
10
  import type { SolveOutcome } from './sketch-solver.js';
11
- /** Maximum anchor-point distance between two geometry lists (same indexing). */
11
+ /**
12
+ * Maximum anchor-point distance between two geometry lists (same indexing).
13
+ *
14
+ * @param a - first geometry list (e.g. the solver result).
15
+ * @param b - second geometry list (e.g. the stored geometry).
16
+ * @returns the maximum Euclidean distance between corresponding anchor points
17
+ * (0 when the lists have no comparable points).
18
+ */
12
19
  export declare function maxPointDistance(a: SketchGeom[], b: SketchGeom[]): number;
20
+ /**
21
+ * Three-level downgrade verdict (D3) for one sketch.
22
+ */
13
23
  export interface SketchVerdict {
24
+ /** solved quality level: L0 = solved & matches, L1 = flagged, L2 = baked */
14
25
  level: 'L0' | 'L1' | 'L2';
26
+ /** human-readable reason for a non-L0 verdict */
15
27
  reason?: string;
16
28
  /** max anchor distance between re-solved and stored geometry */
17
29
  maxDelta?: number;
@@ -20,6 +32,12 @@ export interface SketchVerdict {
20
32
  * Three-level downgrade (D3). L0 = solved & matches stored (delta <= T1).
21
33
  * L1 = solver result kept but flagged, stored coords used instead.
22
34
  * L2 = baked (unsupported geometry/constraints, external geometry).
35
+ *
36
+ * @param outcome - the solver result, or undefined when none was produced.
37
+ * @param stored - the on-disk (stored) geometry to compare against.
38
+ * @param t1 - the calibrated distance tolerance for the L0/L1 split.
39
+ * @param preBlocked - pre-solve downgrade reason; when set the sketch is L2.
40
+ * @returns the classification verdict for the sketch.
23
41
  */
24
42
  export declare function classifySketch(outcome: SolveOutcome | undefined, stored: SketchGeom[], t1: number, preBlocked?: string): SketchVerdict;
25
43
  //# sourceMappingURL=sketch-verify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sketch-verify.d.ts","sourceRoot":"","sources":["../../src/fcstd/sketch-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiBvD,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,MAAM,CAazE;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,GAAG,SAAS,EACjC,MAAM,EAAE,UAAU,EAAE,EACpB,EAAE,EAAE,MAAM,EACV,UAAU,CAAC,EAAE,MAAM,GAClB,aAAa,CASf"}
1
+ {"version":3,"file":"sketch-verify.d.ts","sourceRoot":"","sources":["../../src/fcstd/sketch-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiBvD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,MAAM,CAazE;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,GAAG,SAAS,EACjC,MAAM,EAAE,UAAU,EAAE,EACpB,EAAE,EAAE,MAAM,EACV,UAAU,CAAC,EAAE,MAAM,GAClB,aAAa,CASf"}
@@ -12,7 +12,14 @@ function anchorPoints(g) {
12
12
  return [{ x: g.cx, y: g.cy }];
13
13
  }
14
14
  }
15
- /** Maximum anchor-point distance between two geometry lists (same indexing). */
15
+ /**
16
+ * Maximum anchor-point distance between two geometry lists (same indexing).
17
+ *
18
+ * @param a - first geometry list (e.g. the solver result).
19
+ * @param b - second geometry list (e.g. the stored geometry).
20
+ * @returns the maximum Euclidean distance between corresponding anchor points
21
+ * (0 when the lists have no comparable points).
22
+ */
16
23
  export function maxPointDistance(a, b) {
17
24
  let max = 0;
18
25
  const n = Math.min(a.length, b.length);
@@ -32,6 +39,12 @@ export function maxPointDistance(a, b) {
32
39
  * Three-level downgrade (D3). L0 = solved & matches stored (delta <= T1).
33
40
  * L1 = solver result kept but flagged, stored coords used instead.
34
41
  * L2 = baked (unsupported geometry/constraints, external geometry).
42
+ *
43
+ * @param outcome - the solver result, or undefined when none was produced.
44
+ * @param stored - the on-disk (stored) geometry to compare against.
45
+ * @param t1 - the calibrated distance tolerance for the L0/L1 split.
46
+ * @param preBlocked - pre-solve downgrade reason; when set the sketch is L2.
47
+ * @returns the classification verdict for the sketch.
35
48
  */
36
49
  export function classifySketch(outcome, stored, t1, preBlocked) {
37
50
  if (preBlocked)
@@ -1 +1 @@
1
- {"version":3,"file":"sketch-verify.js","sourceRoot":"","sources":["../../src/fcstd/sketch-verify.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M3.5 — solved-vs-stored comparison (D2/V2).\n *\n * The on-disk coordinates ARE FreeCAD's last solution, so a correct pipeline\n * re-derives (nearly) the same geometry. maxPointDistance is the V2 metric;\n * its tolerance T1 is calibrated from the sample-set distribution, not\n * pre-set (plan §8).\n */\nimport type { SketchGeom } from './sketch-parse.js';\nimport type { SolveOutcome } from './sketch-solver.js';\n\nfunction anchorPoints(g: SketchGeom): { x: number; y: number }[] {\n switch (g.kind) {\n case 'point':\n return [{ x: g.x, y: g.y }];\n case 'line':\n return [{ x: g.x1, y: g.y1 }, { x: g.x2, y: g.y2 }];\n case 'circle':\n return [{ x: g.cx, y: g.cy }];\n case 'arc':\n return [{ x: g.cx, y: g.cy }, { x: g.x1, y: g.y1 }, { x: g.x2, y: g.y2 }];\n case 'ellipse':\n return [{ x: g.cx, y: g.cy }];\n }\n}\n\n/** Maximum anchor-point distance between two geometry lists (same indexing). */\nexport function maxPointDistance(a: SketchGeom[], b: SketchGeom[]): number {\n let max = 0;\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i++) {\n const pa = anchorPoints(a[i]!);\n const pb = anchorPoints(b[i]!);\n const m = Math.min(pa.length, pb.length);\n for (let k = 0; k < m; k++) {\n const d = Math.hypot(pa[k]!.x - pb[k]!.x, pa[k]!.y - pb[k]!.y);\n if (Number.isFinite(d) && d > max) max = d;\n }\n }\n return max;\n}\n\nexport interface SketchVerdict {\n level: 'L0' | 'L1' | 'L2';\n reason?: string;\n /** max anchor distance between re-solved and stored geometry */\n maxDelta?: number;\n}\n\n/**\n * Three-level downgrade (D3). L0 = solved & matches stored (delta <= T1).\n * L1 = solver result kept but flagged, stored coords used instead.\n * L2 = baked (unsupported geometry/constraints, external geometry).\n */\nexport function classifySketch(\n outcome: SolveOutcome | undefined,\n stored: SketchGeom[],\n t1: number,\n preBlocked?: string,\n): SketchVerdict {\n if (preBlocked) return { level: 'L2', reason: preBlocked };\n if (!outcome) return { level: 'L2', reason: 'no-solver-result' };\n if (!outcome.converged) {\n return { level: 'L1', reason: outcome.reason ?? 'solve-failed' };\n }\n const maxDelta = maxPointDistance(outcome.geoms, stored);\n if (maxDelta <= t1) return { level: 'L0', maxDelta };\n return { level: 'L1', reason: 'delta-exceeds-t1', maxDelta };\n}\n"]}
1
+ {"version":3,"file":"sketch-verify.js","sourceRoot":"","sources":["../../src/fcstd/sketch-verify.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M3.5 — solved-vs-stored comparison (D2/V2).\n *\n * The on-disk coordinates ARE FreeCAD's last solution, so a correct pipeline\n * re-derives (nearly) the same geometry. maxPointDistance is the V2 metric;\n * its tolerance T1 is calibrated from the sample-set distribution, not\n * pre-set (plan §8).\n */\nimport type { SketchGeom } from './sketch-parse.js';\nimport type { SolveOutcome } from './sketch-solver.js';\n\nfunction anchorPoints(g: SketchGeom): { x: number; y: number }[] {\n switch (g.kind) {\n case 'point':\n return [{ x: g.x, y: g.y }];\n case 'line':\n return [{ x: g.x1, y: g.y1 }, { x: g.x2, y: g.y2 }];\n case 'circle':\n return [{ x: g.cx, y: g.cy }];\n case 'arc':\n return [{ x: g.cx, y: g.cy }, { x: g.x1, y: g.y1 }, { x: g.x2, y: g.y2 }];\n case 'ellipse':\n return [{ x: g.cx, y: g.cy }];\n }\n}\n\n/**\n * Maximum anchor-point distance between two geometry lists (same indexing).\n *\n * @param a - first geometry list (e.g. the solver result).\n * @param b - second geometry list (e.g. the stored geometry).\n * @returns the maximum Euclidean distance between corresponding anchor points\n * (0 when the lists have no comparable points).\n */\nexport function maxPointDistance(a: SketchGeom[], b: SketchGeom[]): number {\n let max = 0;\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i++) {\n const pa = anchorPoints(a[i]!);\n const pb = anchorPoints(b[i]!);\n const m = Math.min(pa.length, pb.length);\n for (let k = 0; k < m; k++) {\n const d = Math.hypot(pa[k]!.x - pb[k]!.x, pa[k]!.y - pb[k]!.y);\n if (Number.isFinite(d) && d > max) max = d;\n }\n }\n return max;\n}\n\n/**\n * Three-level downgrade verdict (D3) for one sketch.\n */\nexport interface SketchVerdict {\n /** solved quality level: L0 = solved & matches, L1 = flagged, L2 = baked */\n level: 'L0' | 'L1' | 'L2';\n /** human-readable reason for a non-L0 verdict */\n reason?: string;\n /** max anchor distance between re-solved and stored geometry */\n maxDelta?: number;\n}\n\n/**\n * Three-level downgrade (D3). L0 = solved & matches stored (delta <= T1).\n * L1 = solver result kept but flagged, stored coords used instead.\n * L2 = baked (unsupported geometry/constraints, external geometry).\n *\n * @param outcome - the solver result, or undefined when none was produced.\n * @param stored - the on-disk (stored) geometry to compare against.\n * @param t1 - the calibrated distance tolerance for the L0/L1 split.\n * @param preBlocked - pre-solve downgrade reason; when set the sketch is L2.\n * @returns the classification verdict for the sketch.\n */\nexport function classifySketch(\n outcome: SolveOutcome | undefined,\n stored: SketchGeom[],\n t1: number,\n preBlocked?: string,\n): SketchVerdict {\n if (preBlocked) return { level: 'L2', reason: preBlocked };\n if (!outcome) return { level: 'L2', reason: 'no-solver-result' };\n if (!outcome.converged) {\n return { level: 'L1', reason: outcome.reason ?? 'solve-failed' };\n }\n const maxDelta = maxPointDistance(outcome.geoms, stored);\n if (maxDelta <= t1) return { level: 'L0', maxDelta };\n return { level: 'L1', reason: 'delta-exceeds-t1', maxDelta };\n}\n"]}
@@ -1,14 +1,24 @@
1
- import { type Result } from '../vendored/brepjs/core/result.js';
1
+ import { type Result } from '../api/result.js';
2
+ /**
3
+ * One raw file inside the FCStd ZIP container.
4
+ */
2
5
  export interface FcstdMember {
3
6
  /** path inside the ZIP, e.g. "Document.xml", "PartShape.brp" */
4
7
  path: string;
8
+ /** the member's raw bytes */
5
9
  bytes: Uint8Array;
6
10
  }
11
+ /**
12
+ * The unpacked FCStd container: all ZIP members plus the advisory comment.
13
+ */
7
14
  export interface FcstdArchive {
8
15
  members: Map<string, Uint8Array>;
9
16
  /** advisory ZIP comment; may be empty (2/56 samples have empty comments) */
10
17
  zipComment: string;
11
18
  }
19
+ /**
20
+ * Structured unpack failure: not a valid ZIP, or missing root `Document.xml`.
21
+ */
12
22
  export type UnpackError = {
13
23
  kind: 'not-zip';
14
24
  message: string;
@@ -18,8 +28,17 @@ export type UnpackError = {
18
28
  };
19
29
  /**
20
30
  * Unpack an FCStd file. Only requirement: valid ZIP + root `Document.xml`.
31
+ *
32
+ * @param data - the raw FCStd file bytes.
33
+ * @returns the unpacked archive, or a structured UnpackError.
21
34
  */
22
35
  export declare function unpackFcstd(data: Uint8Array): Result<FcstdArchive, UnpackError>;
23
- /** UTF-8 text decode helper for XML members. */
36
+ /**
37
+ * UTF-8 text decode helper for XML members.
38
+ *
39
+ * @param archive - the unpacked FCStd container.
40
+ * @param path - member path inside the ZIP, e.g. "Document.xml".
41
+ * @returns the member decoded as UTF-8 text, or undefined when absent.
42
+ */
24
43
  export declare function memberText(archive: FcstdArchive, path: string): string | undefined;
25
44
  //# sourceMappingURL=unpack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unpack.d.ts","sourceRoot":"","sources":["../../src/fcstd/unpack.ts"],"names":[],"mappings":"AAUA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAEzE,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjC,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAkB/E;AAiBD,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIlF"}
1
+ {"version":3,"file":"unpack.d.ts","sourceRoot":"","sources":["../../src/fcstd/unpack.ts"],"names":[],"mappings":"AAUA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjC,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAkB/E;AAiBD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIlF"}
@@ -8,9 +8,12 @@
8
8
  * faijs contract: unit mm, errors via Result (ok/err).
9
9
  */
10
10
  import { unzipSync } from 'fflate';
11
- import { err, ok } from '../vendored/brepjs/core/result.js';
11
+ import { err, ok } from '../api/result.js';
12
12
  /**
13
13
  * Unpack an FCStd file. Only requirement: valid ZIP + root `Document.xml`.
14
+ *
15
+ * @param data - the raw FCStd file bytes.
16
+ * @returns the unpacked archive, or a structured UnpackError.
14
17
  */
15
18
  export function unpackFcstd(data) {
16
19
  let entries;
@@ -45,7 +48,13 @@ function readZipComment(data) {
45
48
  }
46
49
  return null;
47
50
  }
48
- /** UTF-8 text decode helper for XML members. */
51
+ /**
52
+ * UTF-8 text decode helper for XML members.
53
+ *
54
+ * @param archive - the unpacked FCStd container.
55
+ * @param path - member path inside the ZIP, e.g. "Document.xml".
56
+ * @returns the member decoded as UTF-8 text, or undefined when absent.
57
+ */
49
58
  export function memberText(archive, path) {
50
59
  const bytes = archive.members.get(path);
51
60
  if (!bytes)
@@ -1 +1 @@
1
- {"version":3,"file":"unpack.js","sourceRoot":"","sources":["../../src/fcstd/unpack.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,mCAAmC,CAAC;AAkBzE;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAgB;IAC1C,IAAI,OAAmC,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC;YACT,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,uBAAuB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;SAC7E,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,CAAC,cAAc,IAAI,OAAO,CAAC,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,wEAAwE;IACxE,0EAA0E;IAC1E,2DAA2D;IAC3D,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,cAAc,CAAC,IAAgB;IACtC,kDAAkD;IAClD,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/E,IACE,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EACxF,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAE,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAE,IAAI,CAAC,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;YACrB,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAC3C,OAAO,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,UAAU,CAAC,OAAqB,EAAE,IAAY;IAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC","sourcesContent":["/**\n * M1.1 — FCStd container unpacking.\n *\n * Validation rules per plan §5.5.6 (corrected): a file is an FCStd iff it opens\n * as a ZIP and contains `Document.xml` at its root. The ZIP comment is advisory\n * only and must never cause rejection.\n *\n * faijs contract: unit mm, errors via Result (ok/err).\n */\nimport { unzipSync } from 'fflate';\nimport { err, ok, type Result } from '../vendored/brepjs/core/result.js';\n\nexport interface FcstdMember {\n /** path inside the ZIP, e.g. \"Document.xml\", \"PartShape.brp\" */\n path: string;\n bytes: Uint8Array;\n}\n\nexport interface FcstdArchive {\n members: Map<string, Uint8Array>;\n /** advisory ZIP comment; may be empty (2/56 samples have empty comments) */\n zipComment: string;\n}\n\nexport type UnpackError =\n | { kind: 'not-zip'; message: string }\n | { kind: 'no-document-xml'; message: string };\n\n/**\n * Unpack an FCStd file. Only requirement: valid ZIP + root `Document.xml`.\n */\nexport function unpackFcstd(data: Uint8Array): Result<FcstdArchive, UnpackError> {\n let entries: Record<string, Uint8Array>;\n try {\n entries = unzipSync(data);\n } catch (e) {\n return err({\n kind: 'not-zip',\n message: `cannot open as ZIP: ${e instanceof Error ? e.message : String(e)}`,\n });\n }\n if (!('Document.xml' in entries)) {\n return err({ kind: 'no-document-xml', message: 'root Document.xml not found in ZIP' });\n }\n // fflate does not expose the raw ZIP comment through unzipSync; read it\n // directly from the EOCD record (22 bytes from end when comment is empty,\n // else longer). Advisory only — never used for validation.\n const comment = readZipComment(data) ?? '';\n return ok({ members: new Map(Object.entries(entries)), zipComment: comment });\n}\n\nfunction readZipComment(data: Uint8Array): string | null {\n // scan for EOCD signature 0x06054b50 from the end\n for (let i = data.length - 22; i >= Math.max(0, data.length - 22 - 65535); i--) {\n if (\n data[i] === 0x50 && data[i + 1] === 0x4b && data[i + 2] === 0x05 && data[i + 3] === 0x06\n ) {\n const len = data[i + 20]! | (data[i + 21]! << 8);\n const start = i + 22;\n if (start + len > data.length) return null;\n return new TextDecoder('latin1').decode(data.subarray(start, start + len));\n }\n }\n return null;\n}\n\n/** UTF-8 text decode helper for XML members. */\nexport function memberText(archive: FcstdArchive, path: string): string | undefined {\n const bytes = archive.members.get(path);\n if (!bytes) return undefined;\n return new TextDecoder('utf-8').decode(bytes);\n}\n"]}
1
+ {"version":3,"file":"unpack.js","sourceRoot":"","sources":["../../src/fcstd/unpack.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,kBAAkB,CAAC;AA4BxD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAgB;IAC1C,IAAI,OAAmC,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC;YACT,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,uBAAuB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;SAC7E,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,CAAC,cAAc,IAAI,OAAO,CAAC,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,wEAAwE;IACxE,0EAA0E;IAC1E,2DAA2D;IAC3D,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,cAAc,CAAC,IAAgB;IACtC,kDAAkD;IAClD,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/E,IACE,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EACxF,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAE,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAE,IAAI,CAAC,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;YACrB,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAC3C,OAAO,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,OAAqB,EAAE,IAAY;IAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC","sourcesContent":["/**\n * M1.1 — FCStd container unpacking.\n *\n * Validation rules per plan §5.5.6 (corrected): a file is an FCStd iff it opens\n * as a ZIP and contains `Document.xml` at its root. The ZIP comment is advisory\n * only and must never cause rejection.\n *\n * faijs contract: unit mm, errors via Result (ok/err).\n */\nimport { unzipSync } from 'fflate';\nimport { err, ok, type Result } from '../api/result.js';\n\n/**\n * One raw file inside the FCStd ZIP container.\n */\nexport interface FcstdMember {\n /** path inside the ZIP, e.g. \"Document.xml\", \"PartShape.brp\" */\n path: string;\n /** the member's raw bytes */\n bytes: Uint8Array;\n}\n\n/**\n * The unpacked FCStd container: all ZIP members plus the advisory comment.\n */\nexport interface FcstdArchive {\n members: Map<string, Uint8Array>;\n /** advisory ZIP comment; may be empty (2/56 samples have empty comments) */\n zipComment: string;\n}\n\n/**\n * Structured unpack failure: not a valid ZIP, or missing root `Document.xml`.\n */\nexport type UnpackError =\n | { kind: 'not-zip'; message: string }\n | { kind: 'no-document-xml'; message: string };\n\n/**\n * Unpack an FCStd file. Only requirement: valid ZIP + root `Document.xml`.\n *\n * @param data - the raw FCStd file bytes.\n * @returns the unpacked archive, or a structured UnpackError.\n */\nexport function unpackFcstd(data: Uint8Array): Result<FcstdArchive, UnpackError> {\n let entries: Record<string, Uint8Array>;\n try {\n entries = unzipSync(data);\n } catch (e) {\n return err({\n kind: 'not-zip',\n message: `cannot open as ZIP: ${e instanceof Error ? e.message : String(e)}`,\n });\n }\n if (!('Document.xml' in entries)) {\n return err({ kind: 'no-document-xml', message: 'root Document.xml not found in ZIP' });\n }\n // fflate does not expose the raw ZIP comment through unzipSync; read it\n // directly from the EOCD record (22 bytes from end when comment is empty,\n // else longer). Advisory only — never used for validation.\n const comment = readZipComment(data) ?? '';\n return ok({ members: new Map(Object.entries(entries)), zipComment: comment });\n}\n\nfunction readZipComment(data: Uint8Array): string | null {\n // scan for EOCD signature 0x06054b50 from the end\n for (let i = data.length - 22; i >= Math.max(0, data.length - 22 - 65535); i--) {\n if (\n data[i] === 0x50 && data[i + 1] === 0x4b && data[i + 2] === 0x05 && data[i + 3] === 0x06\n ) {\n const len = data[i + 20]! | (data[i + 21]! << 8);\n const start = i + 22;\n if (start + len > data.length) return null;\n return new TextDecoder('latin1').decode(data.subarray(start, start + len));\n }\n }\n return null;\n}\n\n/**\n * UTF-8 text decode helper for XML members.\n *\n * @param archive - the unpacked FCStd container.\n * @param path - member path inside the ZIP, e.g. \"Document.xml\".\n * @returns the member decoded as UTF-8 text, or undefined when absent.\n */\nexport function memberText(archive: FcstdArchive, path: string): string | undefined {\n const bytes = archive.members.get(path);\n if (!bytes) return undefined;\n return new TextDecoder('utf-8').decode(bytes);\n}\n"]}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Public conversion surface (`@faicad/faijs/fcstd-convert`).
3
+ *
4
+ * The `./fcstd` subpath is the dependency-light **read layer** (fflate + xmldom
5
+ * only). This subpath is the **conversion pipeline** on top of it: it pulls the
6
+ * planegcs constraint solver (and, through external-geometry resolution, the
7
+ * occt kernel peer). Keep it Node-only — `planegcs-backend` resolves the solver
8
+ * WASM from node_modules.
9
+ *
10
+ * Why the solver and the classifier are part of the public surface: the corpus
11
+ * tooling (owned by the FCStd port project, not by this repository) must measure
12
+ * solve outcomes and translation scope without re-implementing any of the
13
+ * pipeline. One fact, one home — the tools consume these exports instead of
14
+ * reaching into `src/`.
15
+ *
16
+ * GOTCHA: this entry lives at the top level (`src/fcstd-convert.ts`), not inside
17
+ * `src/fcstd/`, because vitest and tsconfig resolve `@faicad/faijs/*` by string
18
+ * prefix substitution to `src/*`. A barrel at `src/fcstd/convert-api.ts` would
19
+ * make `@faicad/faijs/fcstd-convert` resolve to a non-existent path — tsc would
20
+ * silently fall back to node_modules/dist while vitest fails outright.
21
+ */
22
+ export { convertFcstdFile, SKETCH_T1, ALLOWED_DISPOSITIONS } from './fcstd/convert.js';
23
+ export type { ConvertSummary, ConvertOptions } from './fcstd/convert.js';
24
+ export { createPlanegcsSolver, planegcsWasmPath } from './fcstd/planegcs-backend.js';
25
+ export { classifySketch, maxPointDistance } from './fcstd/sketch-verify.js';
26
+ export type { SketchVerdict } from './fcstd/sketch-verify.js';
27
+ export { resolveExternalGeometry } from './fcstd/external-geo.js';
28
+ export type { ExternalGeoResult, ExternalLink } from './fcstd/external-geo.js';
29
+ export { isWhitelisted } from './fcstd/feature-translate.js';
30
+ //# sourceMappingURL=fcstd-convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fcstd-convert.d.ts","sourceRoot":"","sources":["../src/fcstd-convert.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACvF,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Public conversion surface (`@faicad/faijs/fcstd-convert`).
3
+ *
4
+ * The `./fcstd` subpath is the dependency-light **read layer** (fflate + xmldom
5
+ * only). This subpath is the **conversion pipeline** on top of it: it pulls the
6
+ * planegcs constraint solver (and, through external-geometry resolution, the
7
+ * occt kernel peer). Keep it Node-only — `planegcs-backend` resolves the solver
8
+ * WASM from node_modules.
9
+ *
10
+ * Why the solver and the classifier are part of the public surface: the corpus
11
+ * tooling (owned by the FCStd port project, not by this repository) must measure
12
+ * solve outcomes and translation scope without re-implementing any of the
13
+ * pipeline. One fact, one home — the tools consume these exports instead of
14
+ * reaching into `src/`.
15
+ *
16
+ * GOTCHA: this entry lives at the top level (`src/fcstd-convert.ts`), not inside
17
+ * `src/fcstd/`, because vitest and tsconfig resolve `@faicad/faijs/*` by string
18
+ * prefix substitution to `src/*`. A barrel at `src/fcstd/convert-api.ts` would
19
+ * make `@faicad/faijs/fcstd-convert` resolve to a non-existent path — tsc would
20
+ * silently fall back to node_modules/dist while vitest fails outright.
21
+ */
22
+ export { convertFcstdFile, SKETCH_T1, ALLOWED_DISPOSITIONS } from './fcstd/convert.js';
23
+ export { createPlanegcsSolver, planegcsWasmPath } from './fcstd/planegcs-backend.js';
24
+ export { classifySketch, maxPointDistance } from './fcstd/sketch-verify.js';
25
+ export { resolveExternalGeometry } from './fcstd/external-geo.js';
26
+ export { isWhitelisted } from './fcstd/feature-translate.js';
27
+ //# sourceMappingURL=fcstd-convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fcstd-convert.js","sourceRoot":"","sources":["../src/fcstd-convert.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEvF,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC","sourcesContent":["/**\n * Public conversion surface (`@faicad/faijs/fcstd-convert`).\n *\n * The `./fcstd` subpath is the dependency-light **read layer** (fflate + xmldom\n * only). This subpath is the **conversion pipeline** on top of it: it pulls the\n * planegcs constraint solver (and, through external-geometry resolution, the\n * occt kernel peer). Keep it Node-only — `planegcs-backend` resolves the solver\n * WASM from node_modules.\n *\n * Why the solver and the classifier are part of the public surface: the corpus\n * tooling (owned by the FCStd port project, not by this repository) must measure\n * solve outcomes and translation scope without re-implementing any of the\n * pipeline. One fact, one home — the tools consume these exports instead of\n * reaching into `src/`.\n *\n * GOTCHA: this entry lives at the top level (`src/fcstd-convert.ts`), not inside\n * `src/fcstd/`, because vitest and tsconfig resolve `@faicad/faijs/*` by string\n * prefix substitution to `src/*`. A barrel at `src/fcstd/convert-api.ts` would\n * make `@faicad/faijs/fcstd-convert` resolve to a non-existent path — tsc would\n * silently fall back to node_modules/dist while vitest fails outright.\n */\nexport { convertFcstdFile, SKETCH_T1, ALLOWED_DISPOSITIONS } from './fcstd/convert.js';\nexport type { ConvertSummary, ConvertOptions } from './fcstd/convert.js';\nexport { createPlanegcsSolver, planegcsWasmPath } from './fcstd/planegcs-backend.js';\nexport { classifySketch, maxPointDistance } from './fcstd/sketch-verify.js';\nexport type { SketchVerdict } from './fcstd/sketch-verify.js';\nexport { resolveExternalGeometry } from './fcstd/external-geo.js';\nexport type { ExternalGeoResult, ExternalLink } from './fcstd/external-geo.js';\nexport { isWhitelisted } from './fcstd/feature-translate.js';\n"]}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @faicad/faijs-core/weapp — weapp 专用宿主入口(docs/plans/2026-09-20-weapp-host-entry-design.md)
3
+ *
4
+ * 小程序(无 OCCT 环境)宿主的最小导出面:brepkit wasm 装载注入点 + brepkit BREP
5
+ * 引擎注册 + 环境无关执行栈。全部为 re-export,零新实现。
6
+ *
7
+ * 为什么独立成入口:browser umbrella 曾 re-export brepkit 符号,导致 web 端模块图
8
+ * 包含 brepkitWasm.js(其 node 分支 import('brepkit-wasm') 被 vite 静态解析而报错)。
9
+ * 宿主边界必须由静态入口声明,而不是靠构建脚本事后 stub 剔除。
10
+ *
11
+ * 导出面受 entry-boundary.test.ts 白名单守卫约束——新增导出必须同步更新白名单。
12
+ * web/desktop 宿主禁止 import 本入口(brepkit 是 weapp 专属 BREP 引擎)。
13
+ */
14
+ export { setBrepkitWasmInitFn, initBrepkitWasm, isBrepkitInitialized } from './brepkit-kernel/brepkitWasm.js';
15
+ export { registerBrepkitBrepEngine, BREPKIT_BREP_ENGINE_ID, ensureBrepkitDefaultEngine } from './brep/engine/adapters/brepkit.js';
16
+ export { registerBrepEngine, hasBrepEngine, getActiveBrepEngineId, freezeEngineRegistries } from './brep/engine/registry.js';
17
+ export type { BrepEngine, BrepEngineProvider } from './brep/engine/registry.js';
18
+ export type { BrepEngineApi } from './brep/engine/primitives.js';
19
+ export { createRuntime } from './cad-runtime/runtime.js';
20
+ export type { CadRuntime } from './cad-runtime/runtime.js';
21
+ export { createApiNamespace } from './api/api-namespace.js';
22
+ //# sourceMappingURL=weapp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weapp.d.ts","sourceRoot":"","sources":["../src/weapp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAG1G,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAA;AAG9H,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACzH,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC5E,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAG7D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA"}
package/dist/weapp.js ADDED
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @faicad/faijs-core/weapp — weapp 专用宿主入口(docs/plans/2026-09-20-weapp-host-entry-design.md)
3
+ *
4
+ * 小程序(无 OCCT 环境)宿主的最小导出面:brepkit wasm 装载注入点 + brepkit BREP
5
+ * 引擎注册 + 环境无关执行栈。全部为 re-export,零新实现。
6
+ *
7
+ * 为什么独立成入口:browser umbrella 曾 re-export brepkit 符号,导致 web 端模块图
8
+ * 包含 brepkitWasm.js(其 node 分支 import('brepkit-wasm') 被 vite 静态解析而报错)。
9
+ * 宿主边界必须由静态入口声明,而不是靠构建脚本事后 stub 剔除。
10
+ *
11
+ * 导出面受 entry-boundary.test.ts 白名单守卫约束——新增导出必须同步更新白名单。
12
+ * web/desktop 宿主禁止 import 本入口(brepkit 是 weapp 专属 BREP 引擎)。
13
+ */
14
+ // brepkit wasm 装载(weapp 专属注入点;宿主装配期调用一次 setBrepkitWasmInitFn)
15
+ export { setBrepkitWasmInitFn, initBrepkitWasm, isBrepkitInitialized } from './brepkit-kernel/brepkitWasm.js';
16
+ // brepkit BREP 引擎注册(weapp 只注册 brepkit,不注册 occt)
17
+ export { registerBrepkitBrepEngine, BREPKIT_BREP_ENGINE_ID, ensureBrepkitDefaultEngine } from './brep/engine/adapters/brepkit.js';
18
+ // BREP 引擎注册表(环境无关;ensureBrepChain 见已注册引擎即跳过 OCCT)
19
+ export { registerBrepEngine, hasBrepEngine, getActiveBrepEngineId, freezeEngineRegistries } from './brep/engine/registry.js';
20
+ // cad-runtime(环境无关执行栈,与 weapp worker 装配顺序 §6.1 一致)
21
+ export { createRuntime } from './cad-runtime/runtime.js';
22
+ export { createApiNamespace } from './api/api-namespace.js';
23
+ //# sourceMappingURL=weapp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weapp.js","sourceRoot":"","sources":["../src/weapp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,8DAA8D;AAC9D,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAE1G,gDAAgD;AAChD,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAA;AAE9H,kDAAkD;AAClD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAIzH,mDAAmD;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA","sourcesContent":["/**\n * @faicad/faijs-core/weapp — weapp 专用宿主入口(docs/plans/2026-09-20-weapp-host-entry-design.md)\n *\n * 小程序(无 OCCT 环境)宿主的最小导出面:brepkit wasm 装载注入点 + brepkit BREP\n * 引擎注册 + 环境无关执行栈。全部为 re-export,零新实现。\n *\n * 为什么独立成入口:browser umbrella 曾 re-export brepkit 符号,导致 web 端模块图\n * 包含 brepkitWasm.js(其 node 分支 import('brepkit-wasm') 被 vite 静态解析而报错)。\n * 宿主边界必须由静态入口声明,而不是靠构建脚本事后 stub 剔除。\n *\n * 导出面受 entry-boundary.test.ts 白名单守卫约束——新增导出必须同步更新白名单。\n * web/desktop 宿主禁止 import 本入口(brepkit 是 weapp 专属 BREP 引擎)。\n */\n\n// brepkit wasm 装载(weapp 专属注入点;宿主装配期调用一次 setBrepkitWasmInitFn)\nexport { setBrepkitWasmInitFn, initBrepkitWasm, isBrepkitInitialized } from './brepkit-kernel/brepkitWasm'\n\n// brepkit BREP 引擎注册(weapp 只注册 brepkit,不注册 occt)\nexport { registerBrepkitBrepEngine, BREPKIT_BREP_ENGINE_ID, ensureBrepkitDefaultEngine } from './brep/engine/adapters/brepkit'\n\n// BREP 引擎注册表(环境无关;ensureBrepChain 见已注册引擎即跳过 OCCT)\nexport { registerBrepEngine, hasBrepEngine, getActiveBrepEngineId, freezeEngineRegistries } from './brep/engine/registry'\nexport type { BrepEngine, BrepEngineProvider } from './brep/engine/registry'\nexport type { BrepEngineApi } from './brep/engine/primitives'\n\n// cad-runtime(环境无关执行栈,与 weapp worker 装配顺序 §6.1 一致)\nexport { createRuntime } from './cad-runtime/runtime'\nexport type { CadRuntime } from './cad-runtime/runtime'\n\nexport { createApiNamespace } from './api/api-namespace'\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faicad/faijs",
3
- "version": "0.13.1",
3
+ "version": "0.13.2",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -9,6 +9,9 @@
9
9
  },
10
10
  "main": "./dist/index.js",
11
11
  "types": "./dist/index.d.ts",
12
+ "bin": {
13
+ "faijs-fcstd-convert": "./dist/fcstd/cli.js"
14
+ },
12
15
  "exports": {
13
16
  ".": {
14
17
  "types": "./dist/index.d.ts",
@@ -42,6 +45,14 @@
42
45
  "types": "./dist/sdf.d.ts",
43
46
  "default": "./dist/sdf.js"
44
47
  },
48
+ "./fcstd": {
49
+ "types": "./dist/fcstd/index.d.ts",
50
+ "default": "./dist/fcstd/index.js"
51
+ },
52
+ "./fcstd-convert": {
53
+ "types": "./dist/fcstd-convert.d.ts",
54
+ "default": "./dist/fcstd-convert.js"
55
+ },
45
56
  "./node": {
46
57
  "types": "./dist/node.d.ts",
47
58
  "default": "./dist/node.js"
@@ -50,6 +61,10 @@
50
61
  "types": "./dist/browser.d.ts",
51
62
  "default": "./dist/browser.js"
52
63
  },
64
+ "./weapp": {
65
+ "types": "./dist/weapp.d.ts",
66
+ "default": "./dist/weapp.js"
67
+ },
53
68
  "./runtime-state": {
54
69
  "types": "./dist/runtime-state.d.ts",
55
70
  "default": "./dist/runtime-state.js"
@@ -125,6 +140,7 @@
125
140
  "LICENSE"
126
141
  ],
127
142
  "dependencies": {
143
+ "@salusoft89/planegcs": "1.2.0",
128
144
  "@xmldom/xmldom": "^0.9.8",
129
145
  "acorn": "^8.18.0",
130
146
  "fflate": "^0.8.2",
@@ -138,7 +154,6 @@
138
154
  "occt-wasm": "^3.8.4"
139
155
  },
140
156
  "devDependencies": {
141
- "@salusoft89/planegcs": "1.2.0",
142
157
  "typescript": "*",
143
158
  "vitest": "*"
144
159
  },
@@ -147,8 +162,6 @@
147
162
  "typecheck": "tsc --noEmit",
148
163
  "test": "vitest run",
149
164
  "lint": "eslint src",
150
- "fcstd:scan": "tsx scripts/scan-fcstd-samples.ts",
151
- "fcstd:validate": "tsx scripts/validate-sketch-solve.ts",
152
- "fcstd:convert": "tsx scripts/fcstd-to-fai-zip.ts"
165
+ "fcstd:convert": "tsx src/fcstd/cli.ts"
153
166
  }
154
167
  }